Лекция: Примеры. Правила оформления и вызова функций
Пример 1. Пусть необходимо дважды вывести горизонтальную линию, состоящую из 40 символов псевдографики “-” с кодом 196.
// 1-й вариант (без функции)
int main()
{ cout<<«Testing of function: \n the first line »;
cout<<endl; for (int i=1; i<=40; i++) cout<<'-'; cout<<endl;
cout<<" The second line";
cout<<endl; for (int i=1; i<=40; i++) cout<<'-'; cout<<endl;
getch(); return 0; }
Выделенная часть, как видно, повторяется дважды. Оформим её в виде функции, которая только выводит и никаких результатов, в смысле значений переменных, не получает. В виде функции можно оформить любую, не обязательно повторяющуюся, логически завершённую часть программы.
// 2-й вариант (с функцией)
#include <iostream.h>
#include <conio.h>
// Прототип (объявление) функции.
void LINE1();
int main()
{ // Начало функцииmain()
cout<<«Testing of function: \n the first line »;
LINE1(); // Вызов функции.
cout<<" The second line";
LINE1(); // Вызов функции.
getch(); return 0;} // Конец функцииmain()
/* Повторяем заголовок функции без символа “;” в конце */
void LINE1()
/* Описание (определение) функции, т. е. её текст */
{ int i; cout<<endl;
for (i=1; i<=40; i++) cout<<'-';
cout<<endl; }
Перед функцией main() записываем прототип (объявление, заголовок) функции. Ключевое слово voidв данном примере означает, что функция не возвращает результаты. В следующем параграфе будет показано, что функцию типа void можно использовать и для других целей. Далее следует имя функции по обычным правилам записи идентификаторов. Пустые круглые скобки означают, что функция не имеет никаких параметров, ни входных, ни выходных (результатов). Слово void при этом в круглых скобках (но не в начале!) можно не писать, как это было в “старом” языке С. Заметим, что после прототипа обязательно записывается символ “;” (точка с запятой), а при описании функции после main этот символ не пишем.
Описание функции размещаем после текста функции main(). Повторяем заголовок, но без “;” в конце, и затем в фигурных скобках записываем её текст. При необходимости внутри функции объявляются так называемые локальные переменные (переменная i для счётчика в нашем примере). Они не являются ни входными, ни выходными переменными для функции, а предназначены для хранения промежуточных величин. Такие переменные можно использовать только внутри данной функции. Здесь, как и раньше, переменную i можно было объявить в заголовке оператора for.
Пример 2. Усложним задачу. Пусть надо первый раз вывести, например, 20 символов “*” в пятой, а не в текущей строке, а второй — линию из 40 символов псевдографики “–” в десятой строке. Поэтому функция будет иметь три входных параметра: Len для длины линии, y для номера строки экрана, в которой будем выводить линию, и ch для выводимого символа.
void LINE2(int Len, int y, char ch);
int main()
{ cout<<" \n The first call of function";
LINE2 ( 20, 5, '*');
int LEN, Y, C=196; cout<<" \n The second call of function";
cin>>LEN>>Y; LINE2(LEN, Y, C);
getch(); return 0;}
void LINE2(int Len, int y, char ch)
{ gotoxy(1,y); for (int i=1; i<=Len; i++) cout<<ch;
cout<<endl; }
В прототипе функции и при её описании в заголовке обязательно надо записывать типы параметров, даже если они повторяются. Поэтому следующая запись void LINE2(int Len, y, char ch) неправильна!
Имена параметров обязательны только в заголовке описания, а в прототипе можно указать только их типы: void LINE2(int, int, char).
Вызов функции типа void выполняется так, как вызов процедуры (Procedure) на языке Pascal, без использования дополнительного оператора, как это имеет место в некоторых других системах. Достаточно записать имя функции и в скобках, если есть, входные и выходные (в нашем примере их нет) фактические параметры. Если параметры отсутствуют, то и в прототипе, и в описании, и при вызове функции необходимо обязательно записать пустые круглые скобки.
Выполнение программы с функцией всегда начинается с main. Когда встретится вызов функции (а не её описание), выполняется следующая последовательность действий:
1) запоминается точка возврата, то есть адрес следующей команды;
2) значение каждого фактического параметра значения (но не параметра-ссылки, не указателя и не элементы массива) копируется на место формального. Заметим, что значения формальных входных параметров в функции определять вводом или другим способом не надо, хотя это синтаксически и не запрещается;
3) управление передаётся на первый выполняемый оператор функции;
4) выполняется функция;
5) если выполнился последний оператор функции или встретился return, управление передаётся в ту точку, откуда функция была вызвана. Заметим, что передача управления из точки вызова функции и обратно выполняется автоматически, без дополнительных операторов.
Если встретился повторный вызов этой же функции, описанные выше действия повторяются.