Лекция: Функция как компонент структуры программы
Функция в программировании — это поименованная часть программы, которая может вызываться из других частей программы нужное количество раз. Логически программа на С++ представляет собой набор функций, одна из которых, главная, имеет имя main() (в простейшем случае функция main() является единственной). Программа начинает работу с функции main(), являющейся точкой входа в программу и получающей управление первойпосле запуска программы на выполнение.
Обычно программа на С++состоит из большого числа небольших функций. Рассмотрим примеры программ, демонстрирующих вывод в стиле С и в стиле С++:
| /* proba_1_1.cpp вывод в стиле С */ #include[4] <stdio.h> //для ввода/вывода #include <conio.h> //для _getch() int main() { printf («Ivanov Ivan\n»); printf («Ok\n»); _getch();// функция _getch() приостанавливает выполнение программы до «нажатия любой // клавиши», это позволит увидеть результат вывода return 0[5]; } |
| //proba_1_2.cpp вывод в стиле С++ */ #include <iostream> //для ввода/вывода #include <conio.h> //для _getch() int main() { std[6]::cout << «Ivanov Ivan\n»; std::cout << «Ok»<< std::endl[7]; _getch(); return 0; } |
| //proba_1_3.cpp вывод в стиле С++ с использованием пространства имен std*/ #include <iostream> #include <conio.h> using namespace std[8]; int main() { cout << «Ivanov Ivan\n»; cout << «Ok»<< endl; _getch(); return 0; } |
Результат выполнения любой из программ в режиме консольных приложений:
Ivanov Ivan
Ok
Пояснения к примерам:
Для удобства работы целесообразно в начало каждого текстового файла программы помещать строку комментария с именем файла. В третьей и четвертой строках программ – директивы препроцессора, обеспечивающие включение в программу средств связи со стандартными потоками ввода/вывода данных и прототипа функции _getch(). В строке, содержащей заголовок функции main(), служебное словоint указывает, что функция возвращает целое значение. Круглые скобки после main()соответствуют синтаксису заголовка любой функции. В них помещается, при необходимости, список параметров.
В фигурных скобках представлено тело функции (последовательность описаний, определений и операторов, каждое из которых заканчивается символом «точка с запятой»). В наших примерах тело функции содержит только операторы вывода текста. С++ обеспечивает выполнение вывода в стандартный поток std::cout с использованием оператора <<, а ввода из стандартного потока std::cin – с использованием оператора >>. В то же время, доступны, как и в С, функции вывода printf() и ввода scanf().
Одна из принципиальных особенностей С++ – расширение действия стандартных операций, или перегрузка. Конструкция (лексема) <<, при условии, что слева от нее находится имя объекта std::cout ( std::cout <<) означает операцию«поместить в поток»,в противном случае, означает, как и в языке С, операцию сдвига влево двоичного представления значения левого операнда (например, запись x <<2 означает сдвиг значения переменной x на 2 разряда влево, т.е. умножение на 4).
Оператор return – оператор возврата, завершающий выполнение программы и передающий в точку ее вызова значение выражения (returnвыражение;). Для функции main() это значение должно быть равно нулю (return0;), если исполнение программы прошло успешно. Так как программа «запускается» на исполнение по команде операционной системы, то и возврат будет выполнен к операционной системе (точнее, в стандартный модуль, который автоматически «прикомпоновывается» к программе и из которого осуществляется ее вызов).
Заголовок функции – имя (идентификатор) функции, за которым в круглых скобках может следовать список описаний формальных параметров и перед которым указывается тип функции (тип возвращаемого функцией значения).
Формат заголовка функции:
void имя_функции ( ) // нет ни параметров, ни возвращаемого значения
void имя_функции (void ) // нет ни параметров, ни возвращаемого значения
void имя_функции (список_параметров) // есть параметры и нет возвращаемого значения
тип_функции имя_функции (список_параметров)
// есть параметры и есть возвращаемое значение
тип_функции имя_функции ( ) // нет параметров и есть возвращаемое значение
Прототип функции – это заголовок функции, заканчивающийся символом «;» :
char* strcpy(char*, const char*);
Объявление функции–указание ее прототипа.
Сигнатура функции– часть заголовка функции, позволяющая средствам трансляции идентифицировать функцию среди других. В С++ простая функция однозначно опознаётся компилятором по её имени и последовательности типов её параметров, что составляет сигнатуру функции в этом языке: заголовок функции, за вычетом типа_функции:
имя_функции (список_параметров)
Если функция является методом некоторого класса, то в сигнатуре будет участвовать и имя класса:
Complex::add (Complex& x, Complex& y)
//функция addпринадлежит классу Complex
Тело функции – группа операторов, реализующая алгоритм решения некоторой части задачи. Тело функции должно быть заключено в фигурные скобки:
{описание данных
операторы;
return [выражение]; // [выражение ] может отсутствовать
}
Тип функции – это тип возвращаемого функцией значения. Оператор return выражение; возвращает значение выражения в точку вызова функции. Оператор return; записываемый без выражения означает, что функция не имеет возвращаемого значения и имеет тип void. При этом управление из функции возвращается либо при выполнении этого оператора, либо при достижении правой фигурной скобки, завершающей функцию (при отсутствии ключевого слова return).
return; //функция не возвращает значения и имеет тип void;
return 3; //возвращаемое функцией значение = 3;
return (a + b); //возвращаемое значение = значению выражения (а + b);
//скобки необязательны, используются для улучшения читаемости кода
Тело функции main() – это блокпрограммы. Любой фрагмент текста программы в фигурных скобках называют составным оператором (блоком операторов) или просто блоком. В общем случае, тело любой функции может содержать сколько угодно блоков.
Определение функции–это совокупность ее заголовка и тела.
Вызов функции – указание имени функции и в круглых скобках списка фактических параметров (аргументов), которые необходимо ей передать (если они есть):
_getch();strcpy(s,aaaaa);aaaaas int i = f1(5);if1 f2(x); double x = sin(1.2) + cos(0.7);xОператор вызова функции состоит из ее имени, за которым в круглых скобках располагается список фактических параметров (если они есть) или только из идентификатора функции, если параметров нет. Выполнение оператора вызова функции приводит к активизации действий, описанных в ее теле: если в программе встречается имя функции, то происходит ее вызов (обращение к ней), т.е. функции передается управление. После завершения работы функции управление возвращается в точку ее вызова. Функция, которая вызывает какую-либо другую функцию, называется вызывающей функцией, а функция, которую вызывают на выполнение, называется вызываемой функцией.
Указанные в операторе фактические параметры (аргументы) должны соответствовать описанным в заголовке функции формальным параметрам по типу, количеству и порядку следования. Перед активизацией тела функции происходит передача в нее значений фактических параметров, соответствующих формальным параметрам (с учетом способа передачи):
double CUB_X (double x)
{
return (x*x*x);
void main ()
{
double a = 10.0, y;
y = CUB_X(a);return ;
}
Вызвать функцию можно после ее объявления или определения. Объявление функции из стандартной библиотеки выполняется подключением соответствующего файла директивой препроцессора #include.
Если функция возвращает значение некоторого типа, то необходимо принять (сохранить) это значение в переменную того же типа, либо вывести его на экран, либо использовать в составном выражении. Например, функцияsqrt() (#include <math.h>), извлекающая квадратный корень, принимает как аргумент значение, из которого корень следует извлечь, и возвращает значение этого корня:
sqrt()" "sqrt()С++ не позволяет определять функции внутри других функций. Связь между функциями осуществляется с помощью передаваемых функции фактических параметров (аргументов) и возвращаемых значений или через глобальные (внешние) переменные. Определение «внешние» используется главным образом для того, чтобы подчеркнуть отличие от «внутренних» информационных объектов – аргументов и переменных, определяемых внутри функции.