русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

ОПЕРАЦИОННАЯ СИСТЕМА


Дата добавления: 2013-12-23; просмотров: 693; Нарушение авторских прав


Уфимский государственный нефтяной технический университет

Содержание

Содержание

Переменные переменные

End If

Else

Next i

End If

Wend

Формирование новых массивов

End If

Else

Next i

End If

<вывод min, n_min>

If n_min = n then

ShowMessage (“минимальный элемент – последний”)

p=x(n_min) x(n_min)=x(n_min+1)

x(n_min)=x(n_min+1) x(n_min+1)= min

x(n_min+1)=p

<вывод массива х>

 

Постановка задачи: из исходного массива перенести в новый массив элементы, удовлетворяющие некоторому условию, не меняя их взаимного расположения.

       
 
 
   

 

 


Тесты:

1. новый массив не сформирован, т.к. в исходном массиве нет элементов, удовлетворяющих заданному условию;

2. новый массив сформирован из всех элементов исходного массива, т.к. они все удовлетворяют условию;

3. новый массив сформирован из части элементов исходного массива, удовлетворяющих заданному условию;

 

Пример. Даны два массива a и b. Переписать из них элементы в массив с по следующему правилу: из массива a квадраты элементов, находящихся в массиве на местах с четными номерами, из массива b элементы, которые не больше, чем последний элемент массива a.

 


 

 


 

 

 

k=0

i=2

While i<=n

k=k+1

c(k)= a(i)^2

i=i+2

For i=1 to m

If b(i)<= a(n) Then

k= k +1

c(k)=b(i)

If k = 0 then

Cells (5,1)="новый массив не сформирован"

Cells (5,1)="Cформированный массив"



For i =1 to k

Cells( 6,i)=c(i)

 

 

Смысл в том, что текстовая часть имени переменной (т.е. имя без знака доллара) может сама быть именем. Например:

<php

// объявляем и инициализируем

// переменную $varVar

$varVar = 'Вася';

// объявляем и инициализируем

// переменную $$varVar, т.е. $Вася

$$varVar = 'Иванов';

echo "$varVar ${$varVar}";

// выведет Вася Иванов,

?>

Лекция № 9 (2часа)

Тема: Конструкції, що управляють

Управляющие конструкции языка PHP

Любой сценарий PHP сформирован из ряда конструкций. Конструкцией могут быть операторы, функции, циклы, условные операторы, даже конструкции, которые не делают ничего (пустые конструкции). Конструкции обычно заканчиваются точкой с запятой. Кроме того, конструкции могут быть сгруппированы в группу, формируя группу конструкций с изогнутыми фигурными скобками {...}. Группа конструкций - это также отдельная конструкция. Конструкции языка PHP похожи на конструкции языка Си.

В PHP существуют шесть основных групп управляющих конструкций.

Итак, основные группы управляющих конструкций PHP и их состав:

Условные операторы: if else elseif Циклы: while do-while for foreach break continue Конструкции выбора: switch-case   Конструкции объявления: declare   Конструкции возврата значений: return   Конструкции включений: require() include() require_once() include_once()  

Конструкция break

Очень часто для того, чтобы упростить логику какого-нибудь сложного цикла, удобно иметь возможность его прервать в ходе очередной итерации (к примеру, при выполнении какого-нибудь особенного условия). Для этого и существует конструкция break, которая осуществляет немедленный выход из цикла. Она может задаваться с одним необязательным параметром - числом, которое указывает, из какого вложенного цикла должен быть произведен выход. По умолчанию используется 1, т. е. выход из текущего цикла, но иногда применяются и другие значения. Синтаксис конструкции break:

break; // По умолчанию

break(номер_цикла); // Для вложенных циклов (указывается номер прерываемого цикла)

Приведем примеры:

<?php

$x=0;

while ($x++<10) {

if ($x==3) break;

echo "<b>Итерация $x</b><br>";

}

// Когда $x равен 3, цикл прерывается

?>

Рассмотренный сценарий выводит:

Итерация 1

Итерация 2

Если нам нужно прервать работу определенного (вложенного) цикла, то нужно передать конструкции break параметр - номер_цикла, например, break(1). Нумерация циклов выглядит следующим образом:

for (...) // Третий цикл

{ for (...) // Второй цикл {

for (...) // Первый цикл { } } }

Конструкция continue

Конструкция continue так же, как и break, работает только "в паре" с циклическими конструкциями. Она немедленно завершает текущую итерацию цикла и переходит к новой (конечно, если выполняется условие цикла для цикла с предусловием). Точно так же, как и для break, для continue можно указать уровень вложенности цикла, который будет продолжен по возврату управления.

В основном continue позволяет вам сэкономить количество фигурных скобок в коде и увеличить его удобочитаемость. Это чаще всего бывает нужно в циклах-фильтрах, когда требуется перебрать некоторое количество объектов и выбрать из них только те, которые удовлетворяют определенным условиям. Приведем пример использования конструкции continue:

<?php

$x=0;

while ($x++<5) {

if ($x==3) continue;

echo "<b>Итерация $x</b><br>";

}

// Цикл прервется только на третьей итерации

?>

Рассмотренный скрипт выводит:

Итерация 1

Итерация 2

Итерация 4

Итерация 5

Грамотное использование break и continue позволяет заметно улучшить "читабельность" кода и количество блоков else.

Конструкции выбора

Часто вместо нескольких расположенных подряд инструкций if-else целесообразно воспользоваться специальной конструкцией выбора switch-case. Данная конструкция предназначена для выбора действий, в зависимости от значения указанного выражения. Конструкция switch-case чем-то напоминает конструкцию if-else, который, по сути, является ее аналогом. Конструкцию выбора можно использовать, если предполагаемых вариантов много, например, более 5, и для каждого варианта нужно выполнить специфические действия. В таком случае, использование конструкции if-else становится действительно неудобным.

Синтаксис конструкции switch-case такой:

switch(выражение) {

case значение1: команды1; [break;]

case значение2: команды2; [break;]

. . .

case значениеN: командыN; [break;]

[default: команды_по_умолчанию; [break]]

}

Принцип работы конструкции switch-case такой:

Вычисляется значение выражения;

Просматривается набор значений. Пусть значение1 равно значению выражения, вычисленного на первом шаге. Если не указана конструкция (оператор) break, то будут выполнены команды i, i+1, i+2, ... , N. В противном случае (есть break) будет выполнена только команда с номером i.

Если ни одно значение из набора не совпало со значением выражения, тогда выполняется блок default, если он указан.

Приведем примеры использования конструкции switch-case:

<?php

$x=1;

// Используем if-else

if ($x == 0) {

echo "x=0<br>";

} elseif ($x == 1) {

echo "x=1<br>";

} elseif ($x == 2) {

echo "x=2<br>";

}

// Используем switch-case

switch ($x) {

case 0:

echo "x=0<br>";

break;

case 1:

echo "x=1<br>";

break;

case 2:

echo "x=2<br>";

break;}?>

Рассмотренный сценарий выводит x=1 дважды. Еще пример использования конструкции switch-case:

<?php

$x="Яблоко";

switch ($x) {

case "Яблоко":

echo "Это Яблоко";

break;

case "Груша":

echo "Это Груша";

break;

case "Арбуз":

echo "Это Арбуз";

break;}?>

Данный скрипт выводит "Это Яблоко".

Конструкция switch выполняется поэтапно. Сперва никакой код не исполнен. Только, когда конструкция case найдена со значением, которое соответствует значению выражения switch, PHP начинает исполнять конструкции. PHP продолжает исполнять конструкции до конца блока switch, пока не встречается оператор break. Если не использовать конструкции (операторы) break, скрипт будет выглядеть так:

<?php

$x=0;

switch ($x) {

case 0:

echo "x=0<br>";

case 1:

echo "x=1<br>";

case 2:

echo "x=2<br>";}

// Без использования break выводит

// x=0

// x=1

// x=2?>

Операторный список для case может быть также пуст, он просто передает управление в операторный список до следующей конструкции case:

<?php

switch ($x) {

case 0:

case 1:

case 2:

echo "x меньше, чем 3, но не отрицателен";

break;

case 3:

echo "x=3"; }?>

Когда ни одно значение из набора не совпало со значением выражения, тогда выполняется блок default, если он указан, например:

<?php

$x=3;

switch ($x) {

case 0:

echo "x=0";

break;

case 1:

echo "x=1";

break;

case 2:

echo "x=2";

break;

default:

echo "x не равен 0, 1 или 2";}?>

Данный скрипт выводит "x не равен 0, 1 или 2", поскольку переменная $x=3.

Конструкция switch-case также имеет альтернативный синтаксис:

switch(выражение):

case значение1: команды1; [break;]

. . .

case значениеN: командыN; [break;]

[default: команды_по_умолчанию; [break]]

endswitch;

Практический пример использования альтернативного синтаксиса для конструкции switch-case:

<?php

$x=3;

switch ($x):

case 0:

echo "x=0";

break;

case 1:

echo "x=1";

break;

case 2:

echo "x=2";

break;

default:

echo "x не равен 0, 1 или 2";

endswitch;?>

Как вы уже поняли, данный скрипт выводит "x не равен 0, 1 или 2", так как $x=3.

Конструкции объявления

Конструкция declare

Конструкция объявления declare используется, чтобы установить директивы выполнения для блока кода. Синтаксис declare подобен синтаксису других управляющих конструкций языка PHP:

declare (директива)

инструкция;

Директива позволяет установить поведение блока declare. В настоящее время в PHP доступна только одна директива - tick. Инструкция является частью блока declare.

Как будет выполнена инструкция (инструкции), зависит от директивы.

Конструкция declare может использоваться в глобальной области, влияя на весь код после неё.

<?php

// Вы можете равнозначно использовать следующие методы

// Так:

declare(ticks=1) {

// Здесь полный сценарий

}

// Или так:

declare(ticks=1);

// Здесь полный сценарий

?>

Директива tick

tick - это событие, которое происходит для каждых N-инструкций нижнего уровня, выполненных синтаксическим анализатором в пределах блока declare. События, происходящие на каждом тике, определяюся функцией register_tick_function().

Конструкции возврата значений

Конструкция return

Конструкция rerurn возвращает значения, преимущественно из пользовательских функций, как параметры функционального запроса. При вызове return исполнение пользовательской функции прерывается, а конструкция return возвращает определенные значения.

Если конструкция return будет вызвана из глобальной области определения (вне пользовательских функций), то скрипт также завершит свою работу, а return также возвратит определенные значения.

Преимущественно, конструкция return используется для возврата значений пользовательскими функциями.

Возвращаемые значения могут быть любого типа, в том числе это могут быть списки и объекты. Возврат приводит к завершению выполнения функции и передаче управления обратно к той строке кода, в которой данная функция была вызвана.

Пример использования конструкции return для возврата значений типа integer:

<?php

function retfunct()

{

return 7;

}

echo retfunct(); // выводит '7'.?>

Пример возврата конструкцией return массивов:

<?php

function numbers()

{

return array (0, 1, 2);

}

list ($zero, $one, $two) = numbers();

echo $zero;

echo $one;

echo $two;

// Выводит '012'?>

Для того, чтобы функция возвращала результат по ссылке, вам необходимо использовать оператор & и при описании функции, и при присвоении переменной возвращаемого значения:

<?php

function &returns_reference()

{

return $someref;

}

$newref =& returns_reference();?>

Как мы видим, конструкция return весьма удобна для применения в пользовательских функциях.

Конструкции включений в PHP

Конструкции включений позволяют собирать PHP программу (скрипт) из нескольких отдельных файлов.

В PHP существуют две основные конструкции включений: require и include.

Конструкция включений require

Конструкция require позволяет включать файлы в сценарий PHP до исполнения сценария PHP. Общий синтаксис require такой:

require имя_файла;

При запуске (именно при запуске, а не при исполнении!) программы интерпретатор просто заменит инструкцию на содержимое файла имя_файла (этот файл может также содержать сценарий на PHP, обрамленный, как обычно, тэгами <? и ?>). Причем сделает он это непосредственно перед запуском программы (в отличие от include, который рассматривается ниже). Это бывает довольно удобно для включения в вывод сценария различных шаблонных страниц HTML-кодом. Приведем пример:

Файл header.html:

<html>

<head><title>It is a title</title></head>

<body bgcolor=green>

Файл footer.html:

&copy; Home Company, 2005.

</body></html>

Файл script.php

<?php

require "header.htm";

// Сценарий выводит само тело документа

require "footer.htm"; ?>

Таким образом, конструкция require позволяет собирать сценарии PHP из нескольких отдельных файлов, которые могут быть как html-страницами, так и php-скриптами.

Конструкция require поддерживает включения удаленных файлов (начиная с версии PHP 4.3.0). Например:

<?php

// Следующий пример на работает, поскольку пытается включить локальный файл

require 'file.php?foo=1&bar=2';

// Следующий пример работает

require 'http://www.example.com/file.php?foo=1&bar=2';?>

! Конструкция require позволяет включать удаленные файлы, если такая возможность включена в конфигурационном файле PHP. Подробная информация далее.

Конструкция включений include

Конструкция include также предназначена для включения файлов в код сценария PHP.

В отличие от конструкции require конструкция include позволяет включать файлы в код PHP скрипта во время выполнения сценария. Синтаксис конструкции include выглядит следующим образом:

include имя_файла;

Поясним принципиальную разницу между конструкциями require и include на конкретном практическом примере. Создадим 10 файлов с именами 1.txt, 2.txt и так далее до 10.txt, содержимое этих файлов - просто десятичные цифры 1, 2 ...… 10 (по одной цифре в каждом файле). Создадим такой сценарий PHP:

<?php

// Создаем цикл, в теле которого конструкция include

for($i=1; $i<=10; $i++) {

include "$i.txt";

}

// Включили десять файлов: 1.txt, 2.txt, 3.txt ... 10.txt

// Результат - вывод 12345678910 ?>

В результате мы получим вывод, состоящий из 10 цифр: "12345678910". Из этого мы можем слелать вывод, что каждый из файлов был включен по одному разу прямо во время выполнения цикла! Если мы поставим теперь вместо include require, то сценарий сгенерирует критическую ошибку (fatal error). Сравните результат.

PHP преобразует сценарий во внутреннее представление, анализируя строки сценария по очереди, пока не доходит до конструкции include. Дойдя до include, PHP прекращает транслировать сценарий и переключается на указанный в include файл. Таким образом из-за подобного поведения транслятора, быстродействие сценария снижается, особенно при большом колличестве включаемых с помощью include файлов. С require таких проблем нет, поскольку файлы с помощью require включаются до выполнения сценария, то есть на момент трансляции файл уже включен в сценарий.

Таким образом, целесообразнее использовать конструкцию require там, где не требуется динамическое включение файлов в сценарий, а конструкцию include использовать только с целью динамического включения файлов в код PHP скрипта.

Конструкция include поддерживает включения удаленных файлов (начиная с версии PHP 4.3.0). Например:

<?php

// Следующий пример на работает, поскольку пытается включить локальный файл

include 'file.php?foo=1&bar=2';

// Следующий пример работает

include 'http://www.example.com/file.php?foo=1&bar=2';?>

! Конструкция include позволяет включать удаленные файлы, если такая возможность включена в конфигурационном файле PHP. Подробная информация далее.

Конструкции однократного включения require_once и include_once

В больших PHP сценариях инструкции include и require применяются очень часто. Поэтому становится довольно сложно контролировать, как бы случайно не включить один и тот же файл несколько раз, что чаще всего приводит к ошибке, которую сложно обнаружить.

В PHP предусмотрено решение данной проблемы. Используя конструкции однократного включения require_once и include_once, можно быть уверенным, что один файл не будет включен дважды. Работают конструкции однократного включения require_once и include_once так же, как и require и include соответственно. Разница в их работе лишь в том, что перед включением файла интерпрететор проверяет, включен ли указанный файл ранее или нет. Если да, то файл не будет включен вновь.

! Конструкции однократных включений также require_once и include_ince также позволяют включать удаленные файлы, если такая возможность включена в конфигурационном файле PHP. Подробная информация далее.

Включения удаленных файлов

PHP позволяет работать с объектами URL, как с обычными файлами. Упаковщики, доступные по умолчанию, служат для работы с удаленными файлами с использованием протокола ftp или http.

Если "URL fopen-оболочки" включены в PHP (как в конфигурации по умолчанию), вы можете специфицировать файл, подключаемый с использованием URL (через HTTP), вместо локального пути. Если целевой сервер интерпретирует целевой файл как PHP-код, переменные могут передаваться в подключаемый файл с использованием URL-строки запроса, как в HTTP GET. Строго говоря, это не то же самое, что подключение файла и наследование им области видимости переменных родительского файла; ведь скрипт работает на удалённом сервере, а результат затем подключается в локальный скрипт.

Для того, чтобы удаленное включение файлов было доступно, необходимо в конфигурационном файле (php.ini) установить allow_url_fopen=1.

Обратите внимание: Версии PHP для Windows до PHP 4.3.0 не поддерживают возможность использования удаленных файлов этой функцией даже в том случае, если опция allow_url_fopen включена.

<?php

/* Здесь предполагается, что www.example.com сконфигурирован для разбора .php

* файлов, а не .txt файлов. Также 'Works' здесь означает, что переменные

* $foo и $bar доступны в подключённом файле. */

// Не будет работать, так как file.txt не обрабатывается www.example.com как PHP

include 'http://www.example.com/file.txt?foo=1&bar=2';

// Не будет работать, поскольку ищет файл 'file.php?foo=1&bar=2' в локальной

// файловой системе.

include 'file.php?foo=1&bar=2';

// Следующий пример работает:

include 'http://www.example.com/file.php?foo=1&bar=2';

$foo = 1;

$bar = 2;

include 'file.txt'; // Работает

include 'file.php'; // Работает

?>

Лекция № 10 (2часа)

Тема: Концепції функціонального програмування

Функции в PHP

При помощи функций можно создавать компоненты многократного использования, которые легко изменяются при необходимости и оказываются особенно удобными при разработке web-приложений, не содержащих серьезных различий на концептуальном и практическом уровне. Функциональное программирование помогает создавать более короткие и удобочитаемые программы.

Что такое функция?

Функцией называется фрагмент программного кода, обладающий уникальным именем и предназначенный для решения конкретной задачи. Функция вызывается по имени в разных точках программы, что позволяет многократно выполнять фрагмент с указанным именем. Преимущество такого решения заключается в том, что блок кода пишется всего один раз, а затем легко модифицируется по мере необходимости.

Определение и вызов функций

Определить новую функцию в PHP несложно. Функции могут создаваться в любой точке программ PHP, однако по соображениям структурной организации кода удобнее разместить все функции, используемые сценарием, в самом начале сценарного

файла. Существует и другой способ, заметно повышающий эффективность программирования и способствующий многократному использованию кода, -- выделение функций в отдельный файл (называемый библиотекой). Библиотеки удобны тем, что их функции можно использовать в разных приложениях, не создавая лишних копий и не рискуя допустить ошибки в процессе копирования. Эта тема подробно рассматривается в разделе «Построение библиотек функций» ближе к концу главы.

Определение функции обычно состоит из трех частей:

имени функции;

круглых скобок, в которых перечисляются необязательные входные параметры, разделенные запятыми;

тела функции, заключенного в фигурные скобки.

Обобщенный синтаксис функций PHP выглядит так:

function имя_функции ([$параметр1. $параметр2, .... $параметрn]) {

тело функции }

Имя функции должно подчиняться условиям, приведенным для идентификаторов в главе 2. После имени функции следуют обязательные круглые скобки, в которые заключается необязательный список входных параметров ($параметр1, $параметр2, .... $параметрn). Вследствие относительно либеральных принципов определения переменных в PHP указывать тип входных параметров не нужно. Хотя такой подход имеет свои преимущества, следует помнить, что механизм PHP не проверяет аргументы на соответствие тем типам, которые должны обрабатываться функцией. Случайные ошибки в использовании входных параметров могут привести к неожиданным последствиям (чтобы убедиться в том, что параметр относится к нужному типу, можно проверить его стандартной функцией gettype( )). После закрывающей круглой скобки следуют фигурные скобки, в которые заключается программный код, ассоциируемый с именем функции.

Рассмотрим простой пример использования функции. Предположим, вы хотите создать функцию для вывода лицензионной информации на web-странице:

function display_copyright() {

print "Copyright &copy; 2001 PHP-Powered Recipes. All Rights Reserved."; }

Если ваш web-сайт состоит из нескольких страниц, достаточно вызвать эту функцию в конце каждой страницы -- и вам не придется заново переписывать один и тот же текст. А когда наступит 2002 год, одно простое изменение текста, выводимого этой функцией, приведет к автоматическому обновлению всех страниц. Если бы не преимущества функционального программирования, вам пришлось бы вручную редактировать все страницы, на которых выводится лицензионная информация.

Рассмотрим разновидность функции display_copyright(), которой при вызове передается параметр. Предположим, вы отвечаете за администрирование нескольких web-сайтов, каждому из которых присвоено отдельное имя. На каждом сайте имеется собственный административный сценарий с несколькими переменными, относящимися к этому сайту; к их числу принадлежит переменная $site_name с именем сайта. В этом случае функцию display_copyright() можно записать следующим образом:

function display_copyright($site_name) {

print "Copyright &copy; 2001 $site_name. All Rights Reserved."; }

Переменная $site_name, значение которой присваивается за пределами display_copy-right(), передается функции в качестве параметра. Переданное значение можно использовать и модифицировать в любом месте функции, однако любые изменения будут действовать лишь внутри этой функции. Впрочем, специальные ключевые слова позволяют сделать так, чтобы изменения параметров распространялись и за пределы display_copyright(). Эти ключевые слова были представлены в главе 2, в общем обзоре области видимости переменных и ее отношения к функциям.

Вложенные функции

Функции можно вызывать внутри других функций -- по аналогии с тем, как одна управляющая конструкция (if, while, for и т. д.) может находиться внутри другой. Такая возможность удобна в любых программах, и в больших, и в малых, поскольку она увеличивает степень модульности приложения и упрощает сопровождение программы.

В примере, описанном выше, можно полностью избавиться от необходимости модификации даты. Для этого достаточно включить в d1splay_copyright() вызов стандартной функции PHP date( ):

function display_copyright($site_name) {

print "Copyright &copy". date("Y"). "$site_name. All Rights Reserved."; }

Параметр Y функции date( ) указывает, что возвращаемое значение представляет собой текущий год, отформатированный в виде четырех цифр. Если системная дата установлена правильно, PHP при каждом выполнении сценария будет выводить год. Функция PHP date( ) отличается исключительной гибкостью и поддерживает 25 разных флагов форматирования даты и времени.

Также допускается объявление функций внутри других функций. Тем не менее, вложенное объявление еще не делает функцию «защищенной», то есть не ограничивает возможность ее вызова той функцией, в которой она была объявлена. Более того, вложенная функция не наследует параметров родительской функции; параметры должны передаваться ей точно так же, как и любой другой функции. Впрочем, вложенные объявления функций все равно могут использоваться из соображений удобства сопровождения и наглядности. Пример вложенного объявления приведен в листинге 10.1.

Листинг 10.1. Эффективное использование вложенных функций

function display_footer($site_name) {

function display_copyright($site_name) {

print "Copyright &сору". date("Y").

$site_name. All Rights Reserved.";

print "<center>

<a href = \"\">home</a> | <a href = \"\">recipes</a> | <a href = \"\">events</a><br>

<a href = \"\">tutorials</a> | <a href = \"\">about</a> I <a href = \"\">contact us</a><br>";

display_copyright($site_name);

print "</center>"; }

$site_name = "PHP Recipes":

display_footer($site_name);

display_copyhght($site_name);

Сценарий выводит следующий результат:

home | recipes | events

tutorials | about | contact us

Copyright © 2001 PHP Recipes. All Rights Reserved

Обратите внимание: функцию display_copyright( ) можно вызвать и за пределами display_footer( ) по аналогии стем, как функция display_footer( ) использовалась в предыдущем примере. Концепция защищенных функций в PHP не поддерживается.

Хотя вложенные функции не защищены от вызова из других точек сценария, они не могут вызываться до вызова своей родительской функции. При попытке вызвать вложенную функцию раньше вызова родительской функции выводится сообщение об ошибке.

Возврат значений функцией

По завершении работы функции часто бывает полезно вернуть некоторое значение, для чего результат вызова функции обычно присваивается некоторой переменной. Функции могут возвращать значения любых типов, в том числе массивы и списки. Пример приведен в листинге 10.2, где функция calculate_cost( ) вычисляет налог с заданной суммы и возвращает общую сумму вместе с налогом. Прежде чем переходить к рассмотрению листинга, просмотрите краткое описание алгоритма на псевдокоде:

Перед вызовом функции задать значения переменных: $price (цена товара) и $tax (налоговая ставка).

Объявить функцию calculate_cost( ). При вызове функция получает два параметра: налоговую ставку и цену товара.

Вычислить цену с учетом налога и вернуть ее командой return.

Вызвать calculate_cost() и присвоить значение, возвращенное функцией, переменной $total_cost.

Вывести соответствующее сообщение.

Листинг 10.2. Создание функции для вычисления налога

$price = 24.99; $tax = .06;

function calculate_cost($tax, $price) {

$sales_tax = $tax;

return $price + ($price * $sales_tax);

}

// Обратите внимание на возврат значения функцией calculate_cost(). $total_cost = calculate_cost ($tax. $price);

// Округлить цену до двух десятичных цифр.

$total_cost = round($total_cost. 2);

print "Total cost: $".$total_cost;

// $total cost = 26.49

Функции, не возвращающие значений, также называются процедурами.

Существует и другой способ использования возвращаемых значений, при котором вызов функции включается прямо в условную/циклическую команду. В следующей программе (листинг 10.3) сумма счета пользователя сравнивается с предельным размером кредита. Алгоритм на псевдокоде выглядит так:

Объявить функцию check_limit( ), которая при вызове получает два параметра. Первый параметр, $total_cost, определяет общую сумму счета, накопленную пользователем до настоящего момента. Второй параметр, $credit_limit, определяет максимальную сумму, которую может потратить пользователь.

Если накопленная сумма счета превышает предельный размер кредита, функция возвращает ложное значение (0).

Если условие команды i f оказывается ложным, работа функции еще не завершена. В этом случае общая сумма не превышает предельного размера кредита, поэтому функция должна вернуть логическую истину.

Вызвать функцию check_limit( ) в условии команды if. Проверить, какое значение было возвращено при вызове -- истинное или ложное. В зависимости от результата проверки выполняется то или иное действие.

Если при вызове check_limit( ) было получено значение TRUE, мы предлагаем пользователю продолжить закупку. В противном случае пользователь информируется о превышении кредита.

Листинг 10.3. Сравнение текущей суммы счета пользователя с предельным размером кредита

$cost = 1456.22;

$limit = 1000.00;

function check_limit($total_cost. $credit_limit)

if ($total_cost > $credit_limit) :

return 0;

endif;

return 1; }

if (check_limit($cost. $limit)) :

// Продолжить закупки

print "Keep shopping!";

else : print "Please lower your total bill to less than $".$limit."!"; endif;

При выполнении листинга 4.3 будет выведено сообщение об ошибке, поскольку значение $cost превышает $limit.

Функция также может возвращать сразу несколько значений при помощи списка. Продолжая кулинарную тему, давайте напишем функцию, которая бы возвращала три лучших года для указанного сорта вина. Функция приведена в листинге 10.4, но сначала прочитайте алгоритм на псевдокоде:

Объявить функцию best_years( ), вызываемую с одним параметром. Параметр $label определяет сорт вина, для которого пользователь хотел бы узнать три рекомендуемых года.

Объявить два массива, $merlot и $zinfandel. В каждом массиве хранится три рекомендуемых года для соответствующего сорта вина.

Написать команду return, которая бы использовала особые возможности переменных. Выражение $$label сначала интерпретирует переменную $label, а затем интерпретирует полученное значение как имя другой переменной. В настоящем примере массив merlot возвращается в виде списка, и каждый возвращаемый год занимает свою позицию в списке, для которого вызывалась функция.

Вывести сообщение с информацией о рекомендуемых годах.

Листинг 10.4. Возвращение функцией нескольких величин

// Сорт вина, для которого выводятся лучшие годы

$label = "merlot";

// Функция использует массивы и "переменную в переменной"

// для возвращения нескольких значений.

function best_years($label) {

$merlot = array("1987", "1983", "1977");

$zinfandel = array("1992", "1990", "1989");

return $$label; }

// Функция list( ) используется получения возвращаемых значений.

list ($yr_one, $yr_two. $yr_three) = best_years($label);

print "$label had three particularly remarkable years: $yr_one. $yr_two, and $yr_three.";

Программа выводит следующий результат:

merlot has three particularly remarkable years: 1987, 1983 and 1977.

Рекурсивные функции

Ситуация, при которой функция многократно вызывает сама себя, пока не будет выполнено некоторое условие, открывает замечательные возможности. При правильном использовании рекурсивные функции уменьшают объем программы и делают ее более выразительной. Рекурсивные функции особенно часто используются при выполнении повторяющихся действий -- например, при поиске в файлах/массивах и построении графических изображений (например, фракталов). Классическим примером рекурсивных функций, встречающимся во многих курсах программирования, является суммирование чисел от 1 до N. Программа, приведенная в листинге 10.5, суммирует все целые числа от 1 до 10.

Листинг 10.5. Использование рекурсивной функции для суммирования последовательных целых чисел

function summation ($count) {

if ($count != 0) :

return $count + summation($count-1);

endif; }

$sum = summation(10);

print "Summation = $sum";

В результате выполнения листинга 4.5 будет выведен следующий результат:

Summation = 55

Если функция вызывается достаточно часто, рекурсия делает программу более эффективной. Тем не менее, при использовании рекурсии необходима осторожность, поскольку ошибки могут привести к зацикливанию программы.

Функции-переменные

Одной из интересных возможностей PHP являются функции-переменные (variable functions), то есть динамические вызовы функций, имена которых определяются во время выполнения программы. Хотя в большинстве web-приложений можно обойтись и без функций-переменных, они значительно сокращают объем и сложность программного кода, а также часто снимают необходимость в условных командах if.

Вызов функции-переменной представляет собой имя переменной, за которым следует пара круглых скобок. В круглых скобках могут перечисляться параметры (однако присутствие параметров не обязательно). Обобщенный синтаксис функции-переменной:

$имя_функции( );

Следующая программа (листинг 10.6) демонстрирует эту непривычную, но полезную возможность. Допустим, программа выводит разную информацию в зависимости от языка, выбранного пользователем. В нашем примере для простоты используются приветственные сообщения для англо- и италоязычных пользователей. Алгоритм на псевдокоде:

Создать сообщение для итальянского языка в функции с именем italian.

Создать сообщение для английского языка в функции с именем english.

Передать информацию о выбранном языке в сценарий, присвоив значение переменной $language.

Переменная $language используется для выполнения функции-переменной (в приведенном примере -- italian()).

Листинг 10.6. Выбор функции в зависимости от пользовательского ввода

// Приветствие на итальянском языке, function italian( ) {

" print "Benvenuti al PHP Recipes."; }

// Приветствие на английском языке

function english( ) { print "Welcome to PHP Recipes."; }

// Выбрать итальянский язык

$language = "italian":

// Выполнить функцию-переменную

$language( );

Листинг 10.6 демонстрирует интересную концепцию функций-переменных и наглядно показывает, что функции-переменные способствуют уменьшению объема программного кода. Если бы не эта возможность, функцию пришлось бы выбирать командой if или switch; это привело бы к заметному увеличению объема программного кода и риску появления дополнительных ошибок при кодировании.

Построение библиотек функций

Библиотеки функций -- одно из самых эффективных средств экономии времени при построении приложений. Предположим, вы написали серию функций для сортировки массива. Вероятно, эти функции будут неоднократно использоваться в разных приложениях. Вместо того чтобы постоянно переписывать эти функции в новый сценарий или копировать их через текстовый буфер, гораздо удобнее разместить все функции сортировки в отдельном файле и присвоить ему легко узнаваемое имя (например, array_sorting.inc). Пример такого файла приведен в листинге 10.7.

Листинг 10.7. Пример библиотеки функций (array_sorting.inc)

<?

// Файл: array_sorting.inc

// Назначение: библиотека функций для сортировки массивов.

// Дата: 17 июля 2000 г.

function merge_sort($array. $tmparray, $right, $left) { ...

function bubble_sort($array. $n) { ... }

function quicksort ($array. $right. $left) { ... } ?>

Библиотека array_sorting.inc служит накопителем для всех функций сортировки. Это удобно, поскольку функции фактически группируются по своему назначению и при необходимости можно легко найти нужную функцию. Как видно из листинга 10.7, в начало библиотеки обычно включается заголовок из нескольких строк комментария, чтобы при открытии файла библиотеки можно было сразу получить краткую сводку его содержимого. После собственной библиотеки функций можно включить ее в сценарий при помощи команд PHP include( ) и require( ), в результате чего все функции библиотеки становятся доступными. В общем виде синтаксис этих команд выглядит так:

include(путь/имя_файла);

require( путь/имя_файла );

Также существует альтернативный вариант:

include " путь/имя_файла";

require " путь/имя_файла";

где путь определяет относительный или абсолютный путь к файлу. эти конструкции используются для включения файла непосредственно в сценарий.

Предположим, вы хотите воспользоваться функциями библиотеки array_sorting.inc в сценарии. Пример включения библиотеки показан в листинге 10.8.

Листинг 10.8. Включение библиотечного файла (array_sorting.inc) в сценарий

// Предполагается, что библиотека array_sorting.inc

// находится в одном каталоге со сценарием.

include("array_sorting.inc");

// Теперь вы можете использовать любые функции из array_sorting.inc

$some_array = array (50, 42. 35, 46);

// Использовать функцию bubble_sort()

$sorted_array = bubble_sort($some_array, 1);



<== предыдущая лекция | следующая лекция ==>
Нахождение минимальных и максимальных элементов массива и определение их номеров | Основные термины WINDOWS 95.


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.029 сек.