Смекни!
smekni.com

Актуальные вопросы в работе с С++ (стр. 3 из 5)

// объект типа сhаr


5. Что такое функция? Можно ли возвращать значения из функции через переданные ей аргументы? Если можно, то как? Приведите примеры

Для чего нужны функции? Чтобы ответить на этот вопрос, нужно понять, что вообще представляют собой функции. В программировании, как и в математике, функция есть отображение множества ее аргументов на множество ее значений. То есть функция для каждого набора значений аргумента возвращает какие-то значения, являющиеся результатом ее работы. Зачем нужны функции, попытаемся объяснить на примере. Классический пример функции в программировании – это функция, вычисляющая значение факториала числа. То есть мы задаем ей число, а она возвращает нам его факториал. При этом не нужно для каждого числа, факториал которого мы хотим получить, повторять один и тот же код – достаточно просто вызвать функцию с аргументом, равным этому числу.

Функция вычисления факториала натурального числа

<?php

function fact($n){

if ($n==0) return 1;

else return $fact = $n * fact($n-1);

}

echo fact(3);

// можно было бы написать echo (3*2);

// но если число большое,

echo fact(50);

// то удобнее пользоваться функцией,

// чем писать echo (50*49*48*...*3*2);

?>


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

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

function Имя_функции (параметр1, параметр2,

... параметрN){

Блок_действий

return "значение возвращаемое функцией";

}

Если прямо так написать в php-программе, то работать ничего не будет. Во-первых, Имя_функции и имена параметров функции (параметр1, параметр2 и т.д.) должны соответствовать правилам наименования в PHP (и русских символов в них лучше не использовать). Имена функций нечувствительны к регистру. Во-вторых, параметры функции – это переменные языка, поэтому перед названием каждого из них должен стоять знак $. Никаких троеточий ставить в списке параметров нельзя. В-третьих, вместо слов блок_действий в теле функции должен находиться любой правильный PHP-код (не обязательно зависящий от параметров). И наконец, после ключевого слова return должно идти корректное php-выражение (что-либо, что имеет значение). Кроме того, у функции может и не быть параметров, как и возвращаемого значения. Пример правильного объявления функции – функция вычисления факториала, приведенная выше.

Как происходит вызов функции? Указывается имя функции и в круглых скобках список значений ее параметров, если таковые имеются:


<?php

Имя_функции ("значение_для_параметра1",

"значение_для_параметра2",...);

// пример вызова функции – вызов функции

// вычисления факториала приведен выше,

// там для вычисления факториала числа 3

// мы писали: fact(3);

// где fact – имя вызываемой функции,

// а 3 – значение ее параметра с именем $n

?>

Когда можно вызывать функцию? Казалось бы, странный вопрос. Функцию можно вызвать после ее определения, т.е. в любой строке программы ниже блока function f_name(){...}. В PHP3 это было действительно так. Но уже в PHP4 такого требования нет. Все дело в том, как интерпретатор обрабатывает получаемый код. Единственное исключение составляют функции, определяемые условно (внутри условных операторов или других функций). Когда функция определяется таким образом, ее определение должно предшествовать ее вызову.

<?

$make = true;

/* здесь нельзя вызвать Make_event();

потому что она еще не существует, но можно

вызватьSave_info() */

Save_info("Вася","Иванов",

"Я выбрал курс по PHP");

if ($make){

// определениефункцииMake_event()

function Make_event(){

echo "<p>ХочуизучатьPython<br>";

}

}

// теперь можно вызывать Make_event()

Make_event();

// определениефункцииSave_info

function Save_info($first, $last, $message){

echo "<br>$message<br>";

echo "Имя: ". $first . " ". $last . "<br>";

}

Save_info("Федя","Федоров",

"А я выбрал Lisp");

// Save_info можно вызывать и здесь

?>

Пример 5.1. Определение функции внутри условного оператора

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

<?php

/* нельзя сохранить данные, т.е. вызвать

функцию DataSave() до того, как выполнена

проверка их правильности, т.е. вызвана

функцияDataCheck() */

DataCheck();

DataSave();

function DataCheck(){

// проверка правильности данных

functionDataSave(){

// сохраняем данные

}

}

?>

Пример 5.2. Определение функции внутри функции

Рассмотрим подробнее аргументы функций, их назначение и использование.

Аргументы функций

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

С помощью аргументов данные в функцию можно передавать тремя различными способами. Это передача аргументов по значению (используется по умолчанию), по ссылке и задание значения аргументов по умолчанию. Рассмотрим эти способы подробнее.

Когда аргумент передается в функцию по значению, изменение значения аргумента внутри функции не влияет на его значение вне функции. Чтобы позволить функции изменять ее аргументы, их нужно передавать по ссылке. Для этого в определении функции перед именем аргумента следует написать знак амперсанд «&».

<?php

// напишем функцию, которая бы добавляла

// кстрокесловоchecked

function add_label(&$data_str){

$data_str .= "checked";

}

$str = "<input type=radio name=article ";

// пусть имеется такая строка

echo $str ."><br>";

// выведет элемент формы –

// не отмеченную радио кнопку

add_label($str);

// вызовемфункцию

echo$str."><br>";

// это выведет уже отмеченную

// радио кнопку

?>

Пример 5.3. Передача аргументов по ссылке

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

У нас есть функция, создающая информационное сообщение, подпись к которому меняется в зависимости от значения переданного ей параметра. Если значение параметра не задано, то используется подпись "Оргкомитет".

<?php

functionMessage($sign="Оргкомитет"){

// здесь параметр sign имеет по умолчанию

// значение "Оргкомитет"

echo "Следующее собрание состоится завтра.";

echo "$sign .<br>";

}

Message();

// вызываем функцию без параметра.

// В этом случае подпись – это Оргкомитет

Message("С уважением, Вася");

// В этом случае подпись

// будет "С уважением, Вася"

?>

Пример 5.4. Значения аргументов по умолчанию

Результатом работы этого скрипта будет:

Следующее собрание состоится завтра.

Оргкомитет.

Следующее собрание состоится завтра.

С уважением, Вася.

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

Например, мы хотим внести описание статьи в каталог. Пользователь должен ввести такие характеристики статьи, как ее название, автор и краткое описание. Если пользователь не вводит имя автора статьи, считаем, что это Иванов Иван.

<?php

function Add_article($title, $description,

$author="Иванов Иван"){

echo "Заносим в каталог статью: $title,";

echo"автор $author";

echo"<br>Краткое описание: ";

echo "$description <hr>";

}

Add_article("Информатикаимы",

"Это статья про информатику ...",

"Петров Петр");

Add_article("Кто такие хакеры",

"Это статья про хакеров ...");

?>

В результате работы скрипта получим следующее

Заносим в каталог статью: Информатика и мы,

автор Петров Петр.

Краткое описание:

Это статья про информатику...

Заносим в каталог статью: Кто такие хакеры,

автор Иванов Иван.

Краткое описание:

Это статья про хакеров...

Если же мы напишем вот так:

<?php

function Add_article($author="ИвановИван",

$title, $description){

// ...действия как в предыдущем примере

}

Add_article("Кто такие хакеры",

"Это статья про хакеров...");

?>

То в результате получим:

Warning: Missing argument 3 for

add_article() in

c:&bsol;users&bsol;nina&bsol;tasks&bsol;func&bsol;def_bad.php

on line 2

Возвращаемые значения

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

Например, составим функцию, которая возвращает возраст человека. Если человек не умер, то возраст считается относительно текущего года.

<?php

/* если второй параметр вычисляется

как true, то он рассматривается как

датасмерти, */

function Age($birth, $is_dead){

if ($is_dead) return $is_dead-$birth;

else return date("Y")-$birth;

}

echo Age(1971, false); // выведет33

echo Age(1971, 2001); // выведет30

?>

В этом пример можно было и не использовать функцию return, а просто заменить ее функцией вывода echo. Однако если мы все же делаем так, что функция возвращает какое-то значение (в данном случае возраст человека), то в программе мы можем присвоить любой переменной значение этой функции: $my_age = Age(1981, 2004);