Компания ALT Linux
Опубликован: 07.03.2015 | Доступ: свободный | Студентов: 2135 / 486 | Длительность: 24:14:00
Лекция 4:

Использование функций при программировании на C++

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

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

Подпрограмма — именованная, логически законченная группа операторов языка, которую можно вызвать для выполнения любое количество раз из различных мест программы. В языке C++ подпрограммы реализованы в виде функций [4 ]

4.1. Общие сведения о функциях. Локальные и глобальные переменные

Функция — это поименованный набор описаний и операторов, выполняющих определённую задачу. Функция может принимать параметры и возвращать значение. Информация, передаваемая в функцию для обработки, называется параметром, а результат вычисления функции её значением. Обращение к функции называют вызовом. Как известно (п. 2.8), любая программа на C++ состоит из одной или нескольких функций. При запуске программы первой выполняется функция main. Если среди операторов функции main встречается вызов функции, то управление передаётся операторам функции. Когда все операторы функции будут выполнены, управление возвращается оператору, следующему за вызовом функции.

Перед вызовом функция должна быть обязательно описана. Описание функции состоит из заголовка и тела функции:

тип имя_функции(список_переменных)
{
	тело_функции
}
		

Заголовок функции содержит:

  • тип возвращаемого функцией значения, он может быть любым; если функция не возвращает значения, указывают тип void;
  • имя_функции;
  • список_переменных — перечень передаваемых в функцию величин (аргументов), которые отделяются друг от друга запятыми; для каждой переменной из списка указывается тип и имя; если функция не имеет аргументов, то в скобках указывают либо тип void, либо ничего.

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

В общем виде структура программы на C++ может иметь вид:

директивы компилятора
тип имя_1(список_переменных)
{
	тело_функции_1;
}
тип имя_2(список_переменных)
{
	тело_функции_2;
}
...
тип имя_n(список_переменных)
{
	тело_функции_n;
}
int main (список_переменных)
{
	//Тело функции может содержать операторы вызова функций имя_1, имя_2, ..., имя_n
	тело_основной_функции;
}
		

Однако допустима и другая форма записи программного кода :

директивы компилятора
тип имя_1(список_переменных);
тип имя_2(список_переменных);
...
тип имя_n(список_переменных);
int main (список_переменных)
{
	//Тело функции может содержать операторы вызова функций имя_1, имя_2, ..., имя_n
	тело_основной_функции;
}
тип имя_1(список_переменных)
{
	тело_функции_1;
}
тип имя_2(список_переменных)
{
	тело_функции_2;
}
...
тип имя_n(список_переменных)
{
	тело_функции_n;
}
		

Здесь функции описаны после функции main(), однако до неё перечислены заголовки всех функций. Такого рода опережающие заголовки называют прототипами функций. Прототип указывает компилятору тип данных, возвращаемых функцией, тип переменных, выступающих в роли аргументов, и порядок их следования. Прототипы используются для проверки правильности вызова функций в основной программе. Имена переменных, указанные в прототипе функции, компилятор игнорирует:

//Записи равносильны.
int func ( int a, int b );
int func ( int, int );
		

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

имя_функции(список_переменных);
		

Рассмотрим пример. Создадим функцию f(), которая не имеет входных значений и не формирует результат. При вызове этой функции на экран выводится строка символов "С Новым Годом, ".

#include <iostream>
using namespace std;
void f ( ) //Описание функции.
{
	cout << "С Новым Годом, ";
}
int main ( )
{
	f ( ); //Вызов функции.
	cout <<"Студент!" << endl;
	f ( ); //Вызов функции.
	cout <<"Преподаватель!" << endl;
	f ( ); //Вызов функции.
	cout <<"Народ!" << endl;
}
		

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

С Новым Годом, Студент!
С Новым Годом, Преподаватель!
С Новым Годом, Народ!
		

Далее приведён пример программы, которая пять раз выводит на экран фразу "Здравствуй, мир!". Операция вывода строки символов оформлена в виде функции fun(). Эта функция также не имеет входных значений и не формирует результат. Вызов функции осуществляется в цикле:

#include <iostream>
using namespace std;
void fun ( )
{
	cout << "Здравствуй, мир!" << endl;
}
int main ( )
{
	for ( int i =1; i <=5; fun ( ), i ++);
}
		

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

return (выражение);
		

Далее приведён пример программы, которая вычисляет значение выражения \sin^2(\alpha)+\cos^2(\alpha) при заданном значении α. Здесь функция radian выполняет перевод градусной меры угла в радианную1Чтобы найти радианную меру какого-нибудь угла по заданной градусной мере, нужно помножить число градусов на \frac{\pi}{180}, число минут на \frac{\pi}{180\cdot 60}, число секунд на \frac{\pi}{180\cdot 60\cdot 60} и найденные произведения сложить..

#include <iostream>
#include <math.h>
#define PI 3.14159
using namespace std;
double radian ( int deg, int min, int sec )
{
	return ( deg * PI/180+min* PI /180/60+ sec * PI /180/60/60);
}
int main ( )
{
	int DEG, MIN, SEC; double RAD;
	//Ввод данных.
	cout<<" Input :"<<endl; //Величина угла:
	cout<<" DEG ="; cin >>DEG; //градусы,
	cout<<" MIN ="; cin >>MIN; //минуты,
	cout<<" SEC ="; cin >>SEC; //секунды.
	//Величина угла в радианах.
	RAD=radian (DEG, MIN, SEC); //Вызов функции.
	cout << " Value in radian A="<<RAD << endl;
	//Вычисление значения выражения и его вывод.
	cout << " sin (A) ^2+ cos (A) ^2= ";
	cout << pow( sin (RAD), 2 )+pow( cos (RAD), 2 ) << endl;
	return 0;
}
			

Переменные, описанные внутри функции, а также переменные из списка аргументов, являются локальными. Например, если программа содержит пять разных функций, в каждой из которых описана переменная N, то для C++ это пять различных переменных. Область действия локальной переменной не выходит за рамки функции. Значения локальных переменных между вызовами одной и той же функции не сохраняются.

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

Сергей Радыгин
Сергей Радыгин

Символы кириллицы выводит некорректно. Как сделать чтобы выводился читабельный текст на русском языке?

Тип приложения - не Qt,

Qt Creator 4.5.0 основан на Qt 5.10.0. Win7.

 

Юрий Герко
Юрий Герко

Кому удалось собрать пример из раздела 13.2 Компоновка (Layouts)? Если создавать проект по изложенному алгоритму, автоматически не создается  файл mainwindow.cpp. Если создавать этот файл вручную и добавлять в проект, сборка не получается - компилятор сообщает об отсутствии класса MainWindow. Как правильно выполнить пример?