Модуль 7. Функции. Описание и использование функций. Параметры функции. Рекурсия

Содержание

Слайд 2

Определение:[ класс ] тип имя ([ список_формальных параметров ]) { тело

Определение:[ класс ] тип имя
([ список_формальных параметров ])
{ тело функции

}

Функции

Класс:
extern — глобальная видимость во всех модулях программы (по умолчанию);
static — видимость только в пределах модуля, в котором определена функция.

inline

Возврат значения функции
1) return выражение;
2) return;
void f2(){ return 1; }
//неправильно, f2 не должна
возвращать значение
double f3{ return 1; }
//правильно, 1 преобразуется к типу double

int* f(){
int a = 5;
return &a;
// нельзя!
}

Объявление: [ класс ] тип имя ([ список_ формальных_параметров ])

Слайд 3

#include int sum(int x, int y); // объявление int main(){ int

#include
int sum(int x, int y); // объявление
int main(){
int a =

2, b = 3, c, d;
c = sum(a, b); // вызов
cin >> d;
cout << sum(c, d); // вызов
}
int sum(int x, int y){ // определение
return (a + b);
}

Объявление и определение функции

Слайд 4

Пример использования функции int main () {float a; printf (“input a”);

Пример использования функции
int main ()
{float a;
printf (“input a”);
scanf (“%f”,&a);
float p;
p=pr(a);
printf (“perimetr=%f”,p);
}

начало

а

p

конец
float

pr(float x);
{
return 3*x;
}

начало

конец

pr=3*x

Вычислить периметр равностороннего треугольника

P=pr(a)

Слайд 5

Использование функцией глобальных переменных int a,b; //глобальные переменные void change() {int

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

int a,b; //глобальные переменные
void change()
{int r; //локальная переменная
r=a;a=b;b=r;
}
void

main()
{
cin>>a,b;
change();
cout<<”a=”<}
Слайд 6

#include void f(int a){ cout while (a--){ static int n =

#include
void f(int a){
cout << "n m\n";
while (a--){
static int n =

0;
int m = 0;
cout << n++ << ' ' << m++ << '\n';
}
}
int main(){ f(3);}

n m
0 0
1 0
2 0

Локальные статические переменные

Слайд 7

Передача параметров по значению 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));
//формула Герона
}
Вызов:
1) s1=square(2.5,2,1);
2) double a=2.5,b=2,c=1;
double s2=square(a,b,c);

Стек:

Слайд 8

Передача параметров по ссылке void swap( int &a, int &b )

Передача параметров по ссылке

void swap( int &a, int &b )


// определение функции обмена
// значениями двух переменных
{
int t = a; a = b; b = t; }
// ...
int x = 5, y = 6;
swap( x, y );
// вызов функции обмена
Слайд 9

#include void f(int i, int* j, int& k); int main(){ int

#include
void f(int i, int* j, int& k);
int main(){
int i =

1, j = 2, k = 3;
cout <<“ i j k\n";
cout <<“до ” << i <<' '<< j <<' '< f(i, &j, k);
cout <<“после ” << i << ' ‘ << j << ' ‘ << k;
}
void f(int i, int* j, int& k){
i++; (*j)++; k++;
}

Пример использования различных способов передачи параметров

i j k
до 1 2 3
после 1 3 4

char* t(char* a, const int* b);

Слайд 10

#include int sum(const int* mas, const int n); int const n

#include
int sum(const int* mas, const int n);
int const n =

10;
void main(){
int marks[n] = {3, 4, 5, 4, 4};
cout << "Сумма эл-в: " << sum(marks, n);
}
int sum(const int* mas, const int n){
// варианты: int sum(int mas[], int n)
// или int sum(int mas[n], int n)
// (величина n должна быть константой)
int s = 0;
for (int i = 0; i return s;
}

Сумма элементов одномерного массива

Слайд 11

... int sum(const int *a, const int nstr, const int nstb);

...
int sum(const int *a, const int nstr, const int nstb);
void main(){
int

b[2][2] = {{2, 2}, {4, 3}};
printf(" %d\n", sum(&b[0][0], 2, 2));
int i, j, nstr, nstb, *a;
printf("Введите кол. строк и столбцов: \n");
scanf("%d%d", &nstr, &nstb);
a = (int *)malloc( nstr * nstb * sizeof(int) );
for (i = 0; i for (j = 0; j scanf("%d", &a[i * nstb + j]);
printf(" %d\n", sum(a, nstr, nstb));}

Сумма элементов двумерного массива

Слайд 12

int sum(const int *a, const int nstr, const int nstb){ int

int sum(const int *a, const int nstr, const int nstb){
int i,

j, s = 0;
for (i = 0; i for (j = 0; j s += a[i * nstb + j];
return s;
}

Функция вычисления суммы элементов двумерного массива

Слайд 13

... int sum(const int **a, const int nstr, const int nstb);

...
int sum(const int **a, const int nstr, const int nstb);
void main(){
int

nstr, nstb;
cin >> nstr >> nstb;
int **a;
a = new int* [nstr];
for (int i = 0; i a[i] = new int [nstb];
/* формирование матрицы a */
...
cout << sum(a, nstr, nstb);
}

Пример 3 - сумма элементов массива

Слайд 14

int sum(const int **a, const int nstr, const int nstb){ int

int sum(const int **a, const int nstr, const int nstb){
int i,

j, s = 0;
for (i = 0; i for (j = 0; j s += a[i][j];
return s;
}

Пример 3 - сумма элементов массива

Слайд 15

Передача двумерных массивов в функции (альтернативный способ) #include using namespace std;

Передача двумерных массивов в функции
(альтернативный способ)

#include
using namespace std;
int sum(const int

**a, const int nstr, const int nstb);
void main()
{
int nstr, nstb;
cin >> nstr >> nstb;
int **a;
a = new int* [nstr];
for (int i = 0; i a[i] = new int [nstb];
/* * формирование матрицы a */
cout << sum(a, nstr, nstb);
}
int sum(const int **a, const int nstr, const int nstb)
{
int i, j, s = 0;
for (i = 0; ifor (j = 0; jreturn s;
}
Слайд 16

Умалчивание значений параметров void print(char*name=”Номер дома: ”,int value=1) {cout Вызовы: 1.

Умалчивание значений параметров

void print(char*name=”Номер дома: ”,int value=1)
{cout<<”\n”<Вызовы:
1. print();
Вывод: Номер дома: 1
2.

print(“Номер квартиры”,15);
Вывод: Номер квартиры: 15
3. print(,15); - ошибка, т. к. параметры можно опускать только с конца
Функцию лучше переписать так:
void print(int value=1, char*name=”Номер дома: ”)
{cout<<”\n”<Вызовы:
1. print();
Вывод: Номер дома: 1
2. print(15);
Вывод: Номер дома: 15
3. print(6, “Число жильцов”);
Вывод: Число жильцов: 6
Слайд 17

Функции с переменным числом параметров Определение функции с переменным числом параметров:

Функции с переменным числом параметров

Определение функции с переменным числом параметров:
тип имя

(явные параметры,. . . )
{тело функции }
int printf(const char* ...);
printf("Введите исходные данные");
printf("Сумма: %5.2f рублей", sum);
printf("%d %d %d %d", a, b, c, d);

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

Слайд 18

Перегрузка функций int max(int, int); char* max(char*, char*); int max (int,

Перегрузка функций

int max(int, int);
char* max(char*, char*);
int max (int, char*);
int max (char*,

int);
void f(int a, int b, char* c, char* d){
cout << max (a, b) << max(c, d)
<< max(a, c) << max(c, b);
}
Слайд 19

Неоднозначность может появиться при: преобразовании типа; использовании параметров-ссылок; использовании аргументов по

Неоднозначность может появиться при:
преобразовании типа;
использовании параметров-ссылок;
использовании аргументов по умолчанию.

#include
float f(float

i){...}
double f(double i){...}
int main(){
float x = 10.09;
double y = 10.09;
cout << f(x) << endl;
cout << f(y) << endl;
// cout << f(10) << endl; Неоднозначность!
}

Неоднозначность

Слайд 20

int f(int a, int b) {…} int f(int a, int &b)

int f(int a, int b) {…}
int f(int a, int &b) {…}


#include
int f(int a){return a;}
int f(int a, int b = 1){return a * b;}
int main(){
cout << f(10, 2);
/* cout << f(10); Неоднозначность — что вызывается:
f(int, int) или f(int) ? */
}

Неоднозначность

Слайд 21

Функция main() // без параметров: тип main(){ ... } // с

Функция main()

// без параметров:
тип main(){ ... }
// с двумя

параметрами:
тип main(int argc, char* argv[]){ ... }

#include
void main(int argc, char* argv[]){
for (int i = 0; i}

d:\cpp\main.exe one two three

D:\CPP\MAIN.EXE
one
two
three