Скачать презентацию Функции Часть 1 Функция это именованная Скачать презентацию Функции Часть 1 Функция это именованная

Функции ч.1.pptx

  • Количество слайдов: 23

Функции Часть 1 Функции Часть 1

Функция – это именованная последовательность описаний и операторов, выполняющая законченное действие, например, формирование массива, Функция – это именованная последовательность описаний и операторов, выполняющая законченное действие, например, формирование массива, печать массива и т. д. Функция, во-первых, является одним из производных типов СИ++, а , во-вторых, минимальным исполняемым модулем программы. Любая функция должна быть объявлена и определена

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

Объявление функции должно находиться в тексте раньше вызова функции, чтобы компилятор мог осуществить проверку Объявление функции должно находиться в тексте раньше вызова функции, чтобы компилятор мог осуществить проверку правильности вызова. Если функция имеет тип не void, то ее вызов может быть операндом выражения. double line(double x 1, double y 1); bool triangle(double , double ); void temp(int n);

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

Все функции можно разбить на две категории: те, которые не возвращают значений, и те, Все функции можно разбить на две категории: те, которые не возвращают значений, и те, которые их возвращают. Функции, не возвращающие значений, называются функциями типа void и имеют следующую общую форму: void имя. Функции(список. Параметров) { оператор (ы) return; // не обязательно }

Например, функция, которая должна напечатать слово “Hello world! Например, функция, которая должна напечатать слово “Hello world!" заданное число раз (п) может выглядеть следующим образом: void Hello. World (int n) // возвращаемое значение отсутствует { for (int i = 0; i < n; i++) cout « " Hello world!"; cout <

Функция с возвращаемым значением передает генерируемое ею значение функции, которая ее вызвала. double cube(double Функция с возвращаемым значением передает генерируемое ею значение функции, которая ее вызвала. double cube(double x) { return x * x; } Тип возвращаемого значения может быть любым, кроме массива и функции, но может быть указателем на массив или функцию.

Параметры функции Существует два способа передачи параметров в функцию: по адресу и по значению. Параметры функции Существует два способа передачи параметров в функцию: по адресу и по значению. При передаче по значению выполняются следующие действия: • вычисляются значения выражений, стоящие на месте фактических параметров; • в стеке выделяется память под формальные параметры функции; • каждому фактическому параметру присваивается значение формального параметра, при этом проверяются соответствия типов и при необходимости выполняются их преобразования.

Пример: double square(double a, double b, double c) { //функция возвращает площадь треугольника, заданного Пример: double square(double a, double b, double c) { //функция возвращает площадь треугольника, заданного длинами сторон а, b, c double s, p=(a+b+c)/2; return s=sqrt(p*(p-a)*(p-b)*(p-c)); //формула Герона } double s 1=square(2. 5, 2, 1); double a=2. 5, b=2, c=1; double s 2=square(a, b, c);

При передаче по адресу в стек заносятся копии адресов параметров, следовательно, у функции появляется При передаче по адресу в стек заносятся копии адресов параметров, следовательно, у функции появляется доступ к ячейке памяти, в которой находится фактический параметр и она может его изменить. void Change(int *a, int *b) {int r=*a; *a=*b; *b=r; } int x=1, y=5; Change(&x, &y); cout<<”x=”<

Для передачи по адресу также могут использоваться ссылки. При передаче по ссылке в функцию Для передачи по адресу также могут использоваться ссылки. При передаче по ссылке в функцию передается адрес указанного при вызове параметра, а внутри функции все обращения к параметру неявно разыменовываются. void Change(int &a, int &b) {int r=a; a=b; b=r; } int x=1, y=5; Change(x, y); cout<<”x=”<

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

Пример: void add. Karma(User& user, int amount = 1) { user += amount; } Пример: void add. Karma(User& user, int amount = 1) { user += amount; } add. Karma(some. User); add. Karma(some. User, 1); // то же самое add. Karma(some. User, 5); // +5

Локальные и глобальные переменные Переменные, которые используются внутри данной функции, называются локальными. Память для Локальные и глобальные переменные Переменные, которые используются внутри данной функции, называются локальными. Память для них выделяется в стеке, поэтому после окончания работы функции они удаляются из памяти. Нельзя возвращать указатель на локальную переменную, т. к. память, выделенная такой переменной будет освобождаться. int*f() { int a; . . return&a; // НЕВЕРНО }

Статические локальные переменные • объявляются внутри функции с помощью спецификатора класса памяти static • Статические локальные переменные • объявляются внутри функции с помощью спецификатора класса памяти static • инициализируются нулём, если значение не задано явно • область видимости, как и у других локальных переменных, ограничена блоком, в котором они объявлены • время жизни – вся программа значение переменной сохраняется между вызовами функции void add. Karma(User& user, int amount = 1) { static int call. Cnt = 0; call. Cnt++; user+=amount; }

Глобальные переменные – это переменные, описанные вне функций. Они видны во всех функциях, где Глобальные переменные – это переменные, описанные вне функций. Они видны во всех функциях, где нет локальных переменных с такими именами. Пример: int a, b; //глобальные переменные void change() { int r; //локальная переменная r=a; a=b; b=r; } void main() { cin>>a, b; change(); cout<<”a=”<

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

Пример: Удалить из массива все четные элементы #include <iostream. h> #include <stdlib. h> int Пример: Удалить из массива все четные элементы #include #include int form(int a[100]) { int n; cout<<"n. Enter n"; cin>>n; for(int i=0; i

Передача многомерных массивов в функцию При передаче многомерных массивов в функцию все размерности должны Передача многомерных массивов в функцию При передаче многомерных массивов в функцию все размерности должны передаваться в качестве параметров. По определению многомерные массивы в Си и СИ++ не существуют. Если мы описываем массив с несколькими индексами, например, массив int mas[3][4], то это означает, что мы описали одномерный массив mas, элементами которого являются указатели на одномерные массивы int[4].

По определению массив должен быть одномерным, и его элементы должны иметь одинаковую длину. void По определению массив должен быть одномерным, и его элементы должны иметь одинаковую длину. void transp(int a[][4], int n)//размер каждой строки будет 4, а размер массива указателей будет вычисляться. void transp(int a[][4], int n)== void transp(int (*a)[4], int n)

Пример: int sum(int ar 2[] [4], int size) { int total = 0; for Пример: int sum(int ar 2[] [4], int size) { int total = 0; for (int r = 0; r < size; r++) for (int с = 0; с < 4; C++) total += ar 2[r] [c] ; return total; }

Упражнение: Напишите программу, которая многократно запрашивает у пользователя пару чисел до тех пор, пока Упражнение: Напишите программу, которая многократно запрашивает у пользователя пару чисел до тех пор, пока хотя бы одно из этой пары не будет равно 0. С каждой парой программа должна использовать функцию для вычисления среднего гармонического этих чисел. Функция должна возвращать ответ main () для отображения результата. Среднее гармоническое чисел — это инверсия среднего значения их инверсий; она вычисляется следующим образом: