Основы информатики Лекция. Функции Заикин Олег Сергеевич
Функция это проименованная часть программы, которая может вызываться из других частей программы столько раз, сколько необходимо. Функция, в отличие от процедуры, обязательно возвращает значение. Функция - «строительный блок» C++ программы. Функция – подпрограмма, которая содержит одну или несколько инструкций C++ и выполняет одну или несколько задач.Функции
тип имя (спецификации параметров) { // тело функции } Пример int mul(int x, int y) { return x * y; // результат – произведение 2 чисел } тип: int имя: mul спецификации параметров: int x, int y тело функции: return x * y; Общий формат функции
Пользовательские функции - написанные программистом. Стандартные функции - из стандартной библиотеки. Например, sin() или sqrt(). Виды функций
Тип функции это тип возвращаемого функцией результата. Если функция не возвращает никакого результата, то для нее указывается тип void (аналог процедуры). Функции могут иметь любой тип. // у функции mul тип int int mul(int x, int y) { return x * y; // результат – произведение 2 чисел } Тип функций
Имя функции идентификатор, задаваемый программистом (исключение – функция main). Функциям можно дать любые имена: начинающиеся с буквы латинского алфавита либо с символа _ состоять из символов латинского алфавита, цифр, символов _ не совпадающие с зарезервированными. main, sqrt – недопустимые имена (зарезервированы) func, fun45c, sum_int_numbers – допустимые имена 84abc, $bv – недопустимые имена. Имя функции
Спецификации параметров это либо «пусто», либо список имен формальных параметров функции с указанием типа для каждого из них. В списке спецификации разделены запятой. Пример int mul(int x, int y) { return x * y; // результат – произведение 2 чисел } int x – первый параметр int y – второй параметр Спецификации параметров
Значения функций Функция завершается после выполнения return Может быть несколько return (например, в условном операторе). // функция для вычисления модуля целого числа int abs_int(int x) { if ( x >= 0 ) return x; else return (-x); } Как записать тело функции с одним return?
Значения функций // вычисление модуля целого числа int abs_int(int x) { return x >= 0 ? x : -x; } // блок с 1 return
Преимущества функций: 1.Можно использовать один и тот же исходный код для многих входных значений. Следствие – сокращение объема исходного кода. 2.Улучшение читаемости кода – программа разбивается на связанные блоки. 3.Уменьшение вероятности ошибиться – если есть ошибка, то она в функции и она однотипная для всех входных значений. Пример использования
// расстояние между 2 точками на плоскости double dist(double x1, y1, x2, y2){ return(sqrt(sqr(x1-x2)+sqr(y1-y2))); } // в программе нужно посчитать 3 расстояния main(){ cout
В исходном коде функция должна быть объявлена выше инструкции в которой она вызывается. Прототип объявляет функцию до ее первого использования. Прототип позволяет компилятору узнать тип функции, количество параметров и их типы.Прототипы
#include using namespace std; int square(int a); // прототип 1 void main() { cout
main() – первая функция, которая вызывается при выполнении программы. Программа начинается с выполнения функции main() независимо от того, где она расположена. Обычно main() размещают первой, чтобы ее было проще найти. Функция main() не требует прототипа. Функция main()
Параметры функции main() Параметры задаются после имени программы в командной строке. int argc – количество аргументов Имя программы тоже учитывается, поэтому если аргументов нет, argc равен 1. char **argv – указатель на массив символьных указателей Каждый указатель argv ссылается на строку, содержащую аргумент командной строки. argv[0] – имя программы.
Числовые аргументы main() Можно использовать функции atoi(), atol(), atof() для преобразования строк в числа. Пример. void main( int argc, char **argv ) { if (argc > 1) int a = atoi(argv[1]); // 1-ый параметр } mypog.exe
Локальная переменная известна только функции, в которой она определена. Int MyFunc() { int i; // локальная переменная } Глобальная переменная известна всей программе. int MyVar; // глобальная переменная int main() … Локальные и глобальные переменные
Распространенные ошибки Объявление новой функции внутри функции main() Функции нужно объявлять отдельно друг от друга. Для каждого варианта набора входных значений сделана отдельная функция Если действия над входными данными одни и те же, должна быть одна функция. Действия с локальной переменной как с глобальной Причина - использование локальной и глобальной переменных с одинаковым именем.
#include using namespace std; char c=\t; short int s=1; int i; Long long int l; int main() { char c; // имя как у глобальной float f; double d; long double D; cout
#include using namespace std; void myfunc( int a; float b ); // прототип функции Int main() { cout
Аргумент – конкретное значение, передаваемое функции при вызове. Параметр – переменная, которая принимает передаваемый функции аргумент. Функции можно передать несколько аргументов. void mul(int x, int y) { cout
Вариант 1. Функции передается значение аргумента. Значение аргумента копируется в параметр функции. В блоке, в котором произошел вызов функции, значение аргумента не меняется. Пример. int MyFunc( int x ) { x = 10; } … x = 5; MyFunc( x ); cout
Вариант 2. Функции передается адрес аргумента (при вызове по ссылке). В параметр копируется адрес аргумента. Поэтому изменения параметра окажут влияние и на аргумент. Пример. Int MyFunc( int &x ) { x = 10; } x = 5; MyFunc( x ); … // после вызова MyFunc() x равно 10 Передача аргументов функции
Вариант 1. Функции передается значение указателя. Значение указателя копируется в параметр функции. Пример. int MyFunc( int *arr ) { arr[0] = 10; arr[1] = 20; arr++; } … int *arr = new int[2]; MyFunc( arr ); … // после вызова MyFunc() arr как и прежде указывает на // начало массива Передача указателей в качестве аргументов функции
Вариант 2. Функции передается ссылка на указатель. В параметр копируется адрес указателя. Пример. int MyFunc( int *&arr ) { arr[0] = 10; arr[1] = 20; arr++; } … int *arr = new int[2]; MyFunc( arr ); … // после вызова MyFunc() arr указывает на последний // элемент массива Передача указателей в качестве аргументов функции
Вариант 1. int MyFunc( int *&arr ) { arr[0] = 10; } Вариант 2. int MyFunc( int *arr ) { arr[0] = 10; } В обоих вариантах значения массива после вызова функций поменяются. Почему? Передача указателей в качестве аргументов функции
Аргументы по умолчанию Можно придать параметру значение, на случай если функция вызывается без аргумента, который соответствует этому параметру. void myfunc(double num = 0.0); void main() { myfunc(10.3); // значение передается явно myfunc(); // значение по умолчанию }
Перегрузка функций Позволяет двум функциям с разными параметрами иметь одинаковые имена. По типу аргументов и их количеству компилятор определяет какую именно версию функции вызвать. В языке C есть 3 разные функции для определения модуля числа: abs(), labs() и fabs() – для int, long int и float. В С++ функция abs() одна, но перегружаемая.
Перегрузка функций Пример. void f(int a) { cout
Перегрузка функций Допускается задавать версиям функции произвольные действия. Но правильнее, чтобы они были «родственными».