initial commit
This commit is contained in:
		
						commit
						2369f801af
					
				
					 76 changed files with 4273 additions and 0 deletions
				
			
		|  | @ -0,0 +1,61 @@ | |||
| #include <stdio.h> | ||||
| 
 | ||||
| /*
 | ||||
|     Это программа на языке C и компилировать её надо так: | ||||
|         gcc 00cfunctions.c | ||||
| 
 | ||||
| 
 | ||||
|     Известно, что в языке C нельзя создать две функции с одинаковым названием | ||||
|     Но часто требуется написать функции, которые будут делать похожие вещи, но для разных типов данных. | ||||
|     Простейший пример -- математические функции для разных численных типов данных | ||||
| 
 | ||||
|     В языке C эта проблема решается так, что функциям даются немного различающиеся имена | ||||
| 
 | ||||
| 
 | ||||
|     В данном примере мы создали функции для вычисления абсолютного значения для типов int и double | ||||
|     Всё работает хорошо, пока мы соблюдаем типы данных и функции | ||||
| 
 | ||||
|     Но стоит ошибиться и произойдёт сложно выявляемая ошибка | ||||
| 
 | ||||
| */ | ||||
| 
 | ||||
| int abs(int a) | ||||
| { | ||||
|     if (a < 0) | ||||
|         return -a; | ||||
|     else  | ||||
|         return a; | ||||
| } | ||||
| 
 | ||||
| double fabs(double a) | ||||
| { | ||||
|     if (a < 0) | ||||
|         return -a; | ||||
|     else  | ||||
|         return a; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| int main() | ||||
| { | ||||
|     printf("%i\n", abs(-5)); | ||||
|     printf("%lf\n", fabs(-5.9)); | ||||
| 
 | ||||
| 
 | ||||
|     double x = abs(-5.9); | ||||
|     printf("%lf\n", x); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /*
 | ||||
|     Задача: | ||||
| 
 | ||||
|         1)  В данном примере переменная x равна ровно 5. Почему так происходит? | ||||
| 
 | ||||
|         2)  Что будет, если всё-таки назвать 2 функции одинаковым именем и скомпилировать программу с помощью gcc? | ||||
| 
 | ||||
| */ | ||||
|  | @ -0,0 +1,66 @@ | |||
| #include <iostream> | ||||
| using std::cout, std::endl; | ||||
| 
 | ||||
| /*
 | ||||
|     Это программа на языке C++ и компилировать её надо так: | ||||
|         g++ 01cppfunctions.c | ||||
| 
 | ||||
| 
 | ||||
|     В отличии от языка C в языке C++ есть возможность создать 2 и больше разных функции с одним и тем же названием, | ||||
|     но с разным количеством и/или типами аргументов. | ||||
| 
 | ||||
|     Компилятор сам догадается, какую функцию следует вызвать в зависимости от типа аргумента. | ||||
| 
 | ||||
| */ | ||||
| 
 | ||||
| int abs(int a) | ||||
| { | ||||
|     if (a < 0) | ||||
|         return -a; | ||||
|     else  | ||||
|         return a; | ||||
| } | ||||
| 
 | ||||
| double abs(double a) | ||||
| { | ||||
|     if (a < 0) | ||||
|         return -a; | ||||
|     else  | ||||
|         return a; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| int main() | ||||
| { | ||||
|     cout << abs(-5)   << endl; | ||||
|     cout << abs(-5.9) << endl; | ||||
| 
 | ||||
| 
 | ||||
|     double x = abs(-5.9); | ||||
|     cout << x << endl; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /*
 | ||||
|     Задачи: | ||||
| 
 | ||||
|     1)  Протестируйте, что компилятор действительно вызывает нужные функции | ||||
|         Для этого просто сделайте так, чтобы функция, которая принимает int печатала на экран слово int, | ||||
|         а функция, которая принимает double, печатала бы на экран слово double | ||||
| 
 | ||||
| 
 | ||||
|     2)  Что если на вход функции abs передать тип float? | ||||
|         Например, вот так:  | ||||
|             abs(1.5f) | ||||
| 
 | ||||
|         Какая из функций вызовется? | ||||
| 
 | ||||
| 
 | ||||
|     3)  Напишите ещё одну перегрузку функции abs для типа float | ||||
|         Протестируйте её в функции main | ||||
| 
 | ||||
| */ | ||||
|  | @ -0,0 +1,30 @@ | |||
| #include <iostream> | ||||
| using std::cout, std::endl; | ||||
| 
 | ||||
| /*
 | ||||
|     Задача: | ||||
| 
 | ||||
|         Напишите несколько перегруженных функций под названием max | ||||
| 
 | ||||
|         1) max, который вычисляет максимум от двух чисел типа int | ||||
|         2) max, который вычисляет максимум от двух чисел типа double | ||||
|         3) max, который вычисляет максимум от трёх чисел типа int | ||||
|         4) max, который вычисляет максимум от трёх чисел типа double | ||||
| 
 | ||||
| */ | ||||
| 
 | ||||
| int max(int a, int b) | ||||
| { | ||||
|     if (a > b) | ||||
|         return a; | ||||
|     else | ||||
|         return b; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| int main()  | ||||
| { | ||||
|     cout << max(4.2, 2.8) << endl;      // Выводит число 4 -- неправильно
 | ||||
| } | ||||
|  | @ -0,0 +1,53 @@ | |||
| #include <iostream> | ||||
| using std::cout, std::endl; | ||||
| 
 | ||||
| 
 | ||||
| int max(int a, int b) | ||||
| { | ||||
|     if (a > b) | ||||
|         return a; | ||||
|     else | ||||
|         return b; | ||||
| } | ||||
| 
 | ||||
| double max(double a, double b) | ||||
| { | ||||
|     if (a > b) | ||||
|         return a; | ||||
|     else | ||||
|         return b; | ||||
| } | ||||
| 
 | ||||
| int max(int a, int b, int c) | ||||
| { | ||||
|     int result = a; | ||||
|     if (b > result) | ||||
|         result = b; | ||||
|     if (c > result) | ||||
|         result = c; | ||||
|     return result; | ||||
| } | ||||
| 
 | ||||
| double max(double a, double b, double c) | ||||
| { | ||||
|     double result = a; | ||||
|     if (b > result) | ||||
|         result = b; | ||||
|     if (c > result) | ||||
|         result = c; | ||||
|     return result; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| int main()  | ||||
| { | ||||
|     cout << max(4.2, 2.8) << endl; | ||||
| 
 | ||||
|     cout << max(1, 2) << endl; | ||||
| 
 | ||||
|     cout << max(4, 2, 5) << endl; | ||||
| 
 | ||||
|     cout << max(1.2, 2.1, 0.5) << endl; | ||||
| } | ||||
|  | @ -0,0 +1,42 @@ | |||
| #include <iostream> | ||||
| using std::cout, std::endl; | ||||
| 
 | ||||
| /*
 | ||||
|     Задача: | ||||
| 
 | ||||
|         Напишите несколько перегруженных функций под названием printType | ||||
| 
 | ||||
|         Эти функции должны печатать тип переменной, которая поступает на вход | ||||
|      | ||||
| 
 | ||||
|         printType(15)       должен напечатать int | ||||
|         printType(1.5)      должен напечатать double | ||||
|         printType(1.5f);    должен напечатать float | ||||
|         printType("Hello"); должен напечатать char[] | ||||
| 
 | ||||
|         book b = {"War and Peace", 900, 1200}; | ||||
|         printType(b);       должен напечатать book | ||||
| 
 | ||||
| */ | ||||
| 
 | ||||
| struct book  | ||||
| { | ||||
|     char title[50]; | ||||
|     float price; | ||||
|     int pages; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| int main()  | ||||
| { | ||||
|     printType(15); | ||||
|     printType(1.5); | ||||
|     printType(1.5f); | ||||
|     printType("Hello"); | ||||
| 
 | ||||
|     book b = {"War and Peace", 900, 1200}; | ||||
|     printType(b); | ||||
| } | ||||
|  | @ -0,0 +1,66 @@ | |||
| #include <iostream> | ||||
| using std::cout, std::endl; | ||||
| 
 | ||||
| /*
 | ||||
|     Задача: | ||||
| 
 | ||||
|         Напишите несколько перегруженных функций под названием printType | ||||
| 
 | ||||
|         Эти функции должны печатать тип переменной, которая поступает на вход | ||||
|      | ||||
| 
 | ||||
|         printType(15)       должен напечатать int | ||||
|         printType(1.5)      должен напечатать double | ||||
|         printType(1.5f);    должен напечатать float | ||||
|         printType("Hello"); должен напечатать char[] | ||||
| 
 | ||||
|         book b = {"War and Peace", 900, 1200}; | ||||
|         printType(b);       должен напечатать book | ||||
| 
 | ||||
| */ | ||||
| 
 | ||||
| struct book  | ||||
| { | ||||
|     char title[50]; | ||||
|     float price; | ||||
|     int pages; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| void printType(int a) | ||||
| { | ||||
|     cout << "int" << endl; | ||||
| } | ||||
| 
 | ||||
| void printType(double a) | ||||
| { | ||||
|     cout << "double" << endl; | ||||
| } | ||||
| 
 | ||||
| void printType(float a) | ||||
| { | ||||
|     cout << "float" << endl; | ||||
| } | ||||
| 
 | ||||
| void printType(const char a[]) | ||||
| { | ||||
|     cout << "char[]" << endl; | ||||
| } | ||||
| 
 | ||||
| void printType(const book& a) | ||||
| { | ||||
|     cout << "book" << endl; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| int main()  | ||||
| { | ||||
|     printType(15); | ||||
|     printType(1.5); | ||||
|     printType(1.5f); | ||||
|     printType("Hello"); | ||||
| 
 | ||||
|     book b = {"War and Peace", 900, 1200}; | ||||
|     printType(b); | ||||
| } | ||||
|  | @ -0,0 +1,17 @@ | |||
| #include <iostream> | ||||
| #include <cmath> | ||||
| using std::cout, std::endl; | ||||
| 
 | ||||
| /*
 | ||||
|     В отличии от языка C в языке C++ стандартные математические функции уже перегружены и могут | ||||
|     работать с разными типами данных | ||||
| */ | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| int main()  | ||||
| { | ||||
|     cout << std::abs(-4) << endl; | ||||
|     cout << std::abs(-4.2) << endl; | ||||
|     cout << std::abs(-4.2f) << endl; | ||||
| } | ||||
|  | @ -0,0 +1,67 @@ | |||
| #include <iostream> | ||||
| using std::cout, std::endl; | ||||
| 
 | ||||
| /*
 | ||||
|     Функции можно перегружать и по указателю и ссылке | ||||
| 
 | ||||
|     Но в случае с перегрузкой по ссылке могут возникнуть ситуации при которых невозможно выбрать правильный | ||||
| 
 | ||||
|     Например, при вызове | ||||
| 
 | ||||
|         int a = 10; | ||||
|         func(a); | ||||
| 
 | ||||
|     Можно выбрать функцию void func(int x)  или  void func(int& x)  | ||||
|     Определить более правильную функцию в этом случае невозможно, это приведёт к ошибке | ||||
| */ | ||||
| 
 | ||||
| 
 | ||||
| void func(int x)  | ||||
| { | ||||
|     cout << "int x" << endl; | ||||
| } | ||||
| 
 | ||||
| void func(int* x)  | ||||
| { | ||||
|     cout << "int* x" << endl; | ||||
| } | ||||
|      | ||||
| 
 | ||||
| void func(int& x)  | ||||
| { | ||||
|     cout << "int& x" << endl; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| int main()  | ||||
| { | ||||
|     int a = 10; | ||||
|     int* p = &a; | ||||
|     int& r = a; | ||||
| 
 | ||||
|     func(a); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /*
 | ||||
|     Задачи: | ||||
| 
 | ||||
|     1)  Определите какая функция вызовется при следующих вызовах функции func или произойдёт ошибка | ||||
| 
 | ||||
|             1)  func(a) | ||||
|             2)  func(p) | ||||
|             3)  func(&a) | ||||
|             4)  func(20) | ||||
|             5)  func(r) | ||||
|             6)  func(&r) | ||||
| 
 | ||||
|      | ||||
|     2)  Если добавить перегрузку, принимающую по константной ссылке, то что изменится | ||||
|      | ||||
|             void func(const int& x)  | ||||
|             { | ||||
|                 cout << "const int& x" << endl; | ||||
|             } | ||||
| 
 | ||||
| 
 | ||||
| */ | ||||
|  | @ -0,0 +1,30 @@ | |||
| #include <iostream> | ||||
| using std::cout, std::endl; | ||||
| 
 | ||||
| struct Cat {}; | ||||
| struct Dog {}; | ||||
| struct Cow {}; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| void say(Cat a) | ||||
| { | ||||
|     cout << "Meow" << endl; | ||||
| } | ||||
| 
 | ||||
| void say(Dog a) | ||||
| { | ||||
|     cout << "Woof" << endl; | ||||
| } | ||||
| 
 | ||||
| void say(Cow a) | ||||
| { | ||||
|     cout << "Mooo" << endl; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| int main() | ||||
| { | ||||
|     Cow x; | ||||
|     say(x); | ||||
| } | ||||
		Reference in a new issue