initial commit

This commit is contained in:
nihonium 2022-09-01 16:37:41 +03:00
commit 2369f801af
Signed by: nihonium
GPG key ID: 0251623741027CFC
76 changed files with 4273 additions and 0 deletions

View file

@ -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?
*/

View file

@ -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
*/

View file

@ -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 -- неправильно
}

View file

@ -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;
}

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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;
}

View file

@ -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;
}
*/

View file

@ -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);
}