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