Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекций -=Вычислительная техника и прог...docx
Скачиваний:
11
Добавлен:
01.05.2025
Размер:
2 Мб
Скачать
☆

4.1.2. Определение функций

Определение функции содержит, кроме объявления, тело функции, представляющее собой последовательность операторов.

Формат:

[класс] тип имя ( [список_параметров] ) [throw(исключения)]

{тело функции}

Здесь:

— исключения — список исключений, которые может порождать функция (т.е. ошибки).

4.1.3. Вызов функций

Формат:

имя_функции ( [список_параметров] ) ;

Примечание:

1. В определении, в объявлении и при вызове одной и той же функции типы и порядок следования параметров должны совпадать.

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

3. В прототипах имена списка параметров игнорируются и служат исключительно для улучшения читаемости программы.

Пример:

#include <iostream.h>

//объявление функции:

int sum (int x, int y) ; // <– – Вариант 1

//int sum (int, int) ; <– – Вариант 2

main() {

int a=2 , b=3 , c , d ;

c=sum(a , b) ; // вызов функции

cin>> d ;

cout<< sum(c , d) ; // вызов функции

cout<< sum(a*10+5 , b+3-a/2) ;// вызов функции

return 0 ;

}

// определение функции

int sum (int x , int y)

{

return (x+y) ; // <– – Здесь x и y – локальные переменные

}

В следующем примере все величины, описанные внутри функций являются локальными.

4.1.4. Передача параметров в функцию

Параметры, перечисленные в заголовке описания функции, называют формальными, а записанные в операторе вызова функции — фактическими параметрами, или аргументами.

Кроме этого в функцию можно передавать параметры специальным образом, например:

sum ( a*10+5 , b+3–a/2 ) ;

Параметры, перечисленные в заголовке описания функции, называют формальными, а записанные в операторе вызова функции — фактическими параметрами, или аргументами.

Существует два основных способа передачи параметров в функцию (см. рис. 4.1.): по значению и по адресу.

Рисунок 4.1 — Способы передачи параметров в функцию

Пример:

#include <iostream.h>

void increm (int a, int *b, int &c) ; // объявление функции

main() {

int a=1 , b=2 , c=3 ;

cout<<''a b c \n'' ;

cout<<a<<' '<<b<<' '<<c<<'\n' ;

increm(a , &b, c) ; //вызов функции

cout<< a<<' '<<b<<' '<<c<<'\n' ;

return 0 ;

}

void increm(int a , int *b , int &c)

{ // определение функции

a++, (*b)++, c++

}

Результат выполнения программы:

a b c

1 2 3

1 3 4

В примере:

— первый параметр (а) передаётся в функцию по значению, его изменение в функции не влияет на исходное значение переменной;

— второй параметр (b) передаётся по адресу с помощью указателя; передача фактического параметра (аргумента) осуществляется с помощью операции взятия адреса (&); в самой функции используется операция реадресации (разыменования, *);

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

4.1.5. Передача массивов в функцию

При использовании массива в качестве параметра функции, в функцию передаётся указатель на тип элемента массива, а точнее — на первый элемент массива.

Рассмотрим пример передачи одномерного массива:

/* Передача одномерного массива в функцию */

#include <iostream.h>

int sum (const int *mas, const int n) ; //объявление функции

const int n=10; //объявление константы – кол-ва элементов массива

main()

{

int marks[n] = {1, 2, 3, 4, 5, 6} ; //объявление и иниц-ция массива

cout<< “Сумма эл-тов массива: ”<<sum(marks, n) ; //вызов ф-ции

return 0;

}

int sum(const int *mas, const int n) //определение функции

{ // или int sum(int mas[], int n)

// или int sum(int mas[n], int n)

int s=0;

for (int i=0; i<n; i++) s += mas[i] ; //суммирование элементов м.

return s ;

}

Результат выполнения программы:

Сумма эл-тов массива: 21

Рассмотрим пример передачи двумерного массива в функцию:

/* Передача двумерного массива в функцию */

#include <iostream.h>

int sum (int **a, const int n_str, const int n_slb) ; //1

main()

{ int n_str, n_slb;

int **a, i, j ;

cout<< “Кол-во строк: ” ; cin>>n_str; //2

cout<< “Кол-во столбцов: ” ; cin>>n_slb; //2

a = new int *[n_str] ; //3

for (i=0; i<n_str; i++) a[i] = new int [n_slb] ; //3

for (i=0; i<n_str; i++) //4

for (j=0; j<n_slb;j++) //4

{ cout<<“a[”<<i<<“,”<<j<<“]=”; //4

cin>>a[i][j] ; //4

}

cout<<“Сумма эл-тов массива: ”<<sum(a, n_str, n_slb) ; //5

...

return 0 ;

}

int sum(int **a, const int n_str, const int n_slb) //6

{ for(int s=0, i=0; i<n_str; i++) //7

for(int j=0; j<n_slb; j++) s+=a[i][j] ; //7

return s ; //8

}

Результат выполнения программы при вводе кол-ва строк — 2 и количества столбцов —2, и значений элементов массива a[0,0]=1, a[0,1]=2, a[1,0]=3, a[1,1]=4:

Сумма эл-тов массива: 10