1.1. Примеры. Правила оформления и вызова функций
П р и м е р 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в данном случае означает, что функция не возвращает результаты. Далее следует имя функции по обычным правилам записи идентификаторов (см. 1.5). Пустые круглые скобки означают, что функция не имеет никаких параметров, ни входных, ни выходных (результатов). Слово void при этом в круглых скобках (но не в начале ! ) можно не писать, как это было в “старом” языке С. Заметим, что после прототипа обязательно записывается символ “;” (точка с запятой), а при описании функции этот символ не пишем.
Описание функции размещаем после текста функции main(). Повторяем заголовок, но без “;” в конце, и затем записываем её текст. При необходимости внутри функции объявляются так называемые локальные переменные (переменная i для счётчика). Они не являются ни входными, ни выходными переменными, а предназначены для хранения промежуточных величин. Такие переменные можно использовать только внутри данной функции. Здесь, как и раньше, переменную i можно было объявить в заголовке оператора for.
П р и м е р 2. Усложним задачу. Пусть надо первый раз вывести, например, 20 символов “*” в 5-й, а не в текущей строке, а второй — линию из 40 символов “–” в 10-й строке. Поэтому функция будет иметь три входных параметра: Len для длины линии, y для номера строки экрана, в которой будем выводить линию, и ch для выводимого символа.
void LINE2(int Len, int y, char ch);
int main()
{ cout<<"Testing of function: \n The first call of function";
LINE2 ( 20 , 5 , '*');
int LEN, Y, C=196;
cout<<" 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 выполняется, как и на Pascal, без использования дополнительного оператора, как это имеет место в некоторых других языках. Достаточно записать имя функции и в скобках, если есть, параметры. Если параметры отсутствуют, то и в прототипе, и в описании, и при вызове функции необходимо обязательно записать пустые круглые скобки.