1 Модуль 7. Функции Описание и использование

Скачать презентацию 1 Модуль 7. Функции  Описание и использование Скачать презентацию 1 Модуль 7. Функции Описание и использование

tema_07.ppt

  • Размер: 315.5 Кб
  • Автор: Максим Репейков
  • Количество слайдов: 22

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

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

2 Определение : [ класс ] тип имя  ([ список_формальных параметров ]) {2 Определение : [ класс ] тип имя ([ список_формальных параметров ]) { тело функции } Функции Класс: extern — глобальная видимость во всех модулях программы (по умолчанию); static — видимость только в пределах модуля, в котором определена функция. inline Возврат значения функции 1) return выражение; 2) return; void f 2(){ return 1; } //неправильно, f 2 не должна возвращать значение double f 3{ return 1; } //правильно, 1 преобразуется к типу double int* f(){ int a = 5; return &a; // нельзя ! }Объявление: [ класс ] тип имя ([ список_ формальных_параметров ])

3#include iostream. h int sum(int a, int b); // объявление  int main(){ int3#include int sum(int a, int b); // объявление int main(){ int a = 2, b = 3, c, d; c = sum(a, b); // вызов cin >> d; cout << sum(c, d); // вызов } int sum(int a, int b){ // определение return (a + b); } Объявление и определение функции

4 Пример использования функции int main () {float a; printf (“input a”); scanf (“f”,4 Пример использования функции 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 r;5 Использование функцией глобальных переменных int a, b; //глобальные переменные void change() {int r; //локальная переменная r=a; a=b; b=r; } void main() { cin>>a, b; change(); cout<<”a=”<<a<<”b=”<<b; }

6#include iostream. h void f(int a){ cout  n m\n; while (a--){ static int6#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) {//функция7 Передача параметров по значению 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) s 1=square(2. 5, 2, 1); 2) double a=2. 5, b=2, c=1; double s 2=square(a, b, c); Стек: p s c 1 b 2 a 2.

8 Передача параметров по ссылке void swap ( int & a ,  int8 Передача параметров по ссылке void swap ( int & a , int & b ) // определение функции обмена // значениями двух переменных { int t = a; a = b; b = t; } //. . . int x = 5, y = 6; swap ( x , y ); // вызов функции обмена

9#include iostream. h void f(int i, int* j, int& k); int main(){ int i9#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 <<' '<<k<<'\n'; 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 iostream. h int sum(const int* mas, const int n); int const n =10#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<n; i++) s += mas[i]; return s; }Сумма элементов одномерного массива

11. . . int sum(const int *a, const int nstr, const int nstb); void11. . . 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<nstr; i++) for (j = 0; j<nstb; 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 i, j,12 int sum(const int *a, const int nstr, const int nstb){ int i, j, s = 0; for (i = 0; i<nstr; i++) for (j = 0; j<nstb; j++) s += a[i * nstb + j]; return s; } Функция вычисления суммы элементов двумерного массива

13. . . int sum(const int **a, const int nstr, const int nstb); void13. . . 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<nstr; 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 i, j,14 int sum(const int **a, const int nstr, const int nstb){ int i, j, s = 0; for (i = 0; i<nstr; i++) for (j = 0; j<nstb; j++) s += a[i][j]; return s; } Пример 3 — сумма элементов массива

15 Передача двумерных массивов в функции (альтернативный способ) #include iostream using namespace std; int15 Передача двумерных массивов в функции (альтернативный способ) #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<nstr; 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; i<nstr; i++) for (j = 0; j<nstb; j++)s += a[i][j]; return s ; }

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

17 Функции с переменным числом параметров Определение функции с переменным числом параметров: тип имя17 Функции с переменным числом параметров Определение функции с переменным числом параметров: тип имя (явные параметры, . . . ) {тело функции } int printf(const char*. . . ); printf(«Введите исходные данные»); printf(«Сумма: %5. 2 f рублей», sum); printf(«%d %d», a, b, c, d); Для доступа к необязательным параметрам внутри функции используются макросы библиотеки va_start, va_arg и va_end , находящиеся в заголовочном файле .

18 Перегрузка функций int max(int, int); char* max(char*, char*); int max (int, char*); int18 Перегрузка функций 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 Неоднозначность может появиться при:  преобразовании типа;  использовании параметров-ссылок;  использовании аргументов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) {…} #include20 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(){. . . }  //21 Функция main() // без параметров: тип main(){. . . } // с двумя параметрами: тип main(int argc, char* argv[]){ . . . } #include void main(int argc, char* argv[]){ for (int i = 0; i<argc; i++) cout << argv[i] << '\n'; } d: \cpp\main. exe one two three D: \CPP\MAIN. EXE one two three

22 Рекурсивные функции n!=n*(n-1)*… 2*1 0!=1 1!=1 long fact(long n){ if (n==0 || n==1)22 Рекурсивные функции n!=n*(n-1)*… 2*1 0!=1 1!=1 long fact(long n){ if (n==0 || n==1) return 1; return (n * fact(n — 1)); } Или: long fact(long n){ return (n > 1) ? n * fact(n — 1) : 1; }