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,48 @@
#include <iostream>
using std::cout, std::endl;
/*
Предположим, что мы захотели создать структуру, который будет хранить время (для простоты, только минуты и секунды)
Нам может понадобиться функция, которая будет добавлять ко времени, некоторое количество секунд
*/
struct Time
{
int minutes;
int seconds;
};
Time add(Time t, int x)
{
Time result = t;
result.seconds += x;
result.minutes += (result.seconds / 60);
result.seconds %= 60;
return result;
}
int main()
{
Time a = {20, 10};
Time b = add(a, 90);
cout << b.minutes << " " << b.seconds << endl;
}
/*
Задача:
1) Напишите функцию, которая будет складывать не время и число, а два времени
Time add(Time ta, Time tb)
*/

View file

@ -0,0 +1,44 @@
#include <iostream>
using std::cout, std::endl;
struct Time
{
int minutes;
int seconds;
};
Time add(Time t, int x)
{
Time result = t;
result.seconds += x;
result.minutes += (result.seconds / 60);
result.seconds %= 60;
return result;
}
Time add(Time ta, Time tb)
{
Time result = ta;
result.seconds += 60 * tb.minutes + tb.seconds;
result.minutes += (result.seconds / 60);
result.seconds %= 60;
return result;
}
int main()
{
Time a = {20, 10};
Time b = add(a, 90);
Time c = add(a, b);
cout << b.minutes << " " << b.seconds << endl;
cout << c.minutes << " " << c.seconds << endl;
}

View file

@ -0,0 +1,63 @@
#include <iostream>
using std::cout, std::endl;
/*
Использовать функции может быть не так удобно как операторы.
Возможно было бы удобней для добавления времени использовать не функцию add, а оператор +
Можно перегрузить оператор функцией, для этого нужно назвать функцию так: operator@
где за место @ нужно подставить оператор, который вы хотите перегрузить
Например, функция Time operator+(Time t, int x) перегружает оператор + для типов Time и int соответственно (обязательно в таком порядке)
Теперь, когда компилятор встретит в коде сложение с таким операндами он вызовет эту функцию
В этом примере a + 90 при компиляции преобразуется в вызов функции operator+(a, 90)
*/
struct Time
{
int minutes;
int seconds;
};
Time operator+(Time t, int x)
{
Time result = t;
result.seconds += x;
result.minutes += (result.seconds / 60);
result.seconds %= 60;
return result;
}
int main()
{
Time a = {20, 10};
Time b = a + 90;
cout << b.minutes << " " << b.seconds << endl;
}
/*
Задача:
1) Что если операторы сложения поменяются местами
Time b = 90 + a;
Сработает ли в этом случае наша функция operator+ и, если нет, что нужно добавить, чтобы такое сложение сработало?
2) Напишите перегруженный оператор, который будет складывать не время и число, а два времени
Time operator+(Time ta, Time tb)
*/

View file

@ -0,0 +1,50 @@
#include <iostream>
using std::cout, std::endl;
struct Time
{
int minutes;
int seconds;
};
Time operator+(Time t, int x)
{
Time result = t;
result.seconds += x;
result.minutes += (result.seconds / 60);
result.seconds %= 60;
return result;
}
Time operator+(int x, Time t)
{
return t + x;
}
Time operator+(Time ta, Time tb)
{
Time result = ta;
result.seconds += 60 * tb.minutes + tb.seconds;
result.minutes += (result.seconds / 60);
result.seconds %= 60;
return result;
}
int main()
{
Time a = {20, 10};
Time b = a + 90;
Time c = 90 + a;
Time d = a + b;
cout << b.minutes << " " << b.seconds << endl;
cout << c.minutes << " " << c.seconds << endl;
cout << d.minutes << " " << d.seconds << endl;
}

View file

@ -0,0 +1,71 @@
#include <iostream>
using std::cout, std::endl;
/*
Помимо перегрузки операторов, принимающих 2 аргумента (бинарных)
можно перегружать и унарные операторы - принимающие один аргумент
При этом, так как operator+ это функция, то работает перегрузка функций
*/
struct Time
{
int minutes;
int seconds;
};
Time operator+(Time ta, Time tb)
{
cout << "binary operator +" << endl;
Time result = ta;
result.seconds += 60 * tb.minutes + tb.seconds;
result.minutes += (result.seconds / 60);
result.seconds %= 60;
return result;
}
Time operator+(Time t)
{
cout << "unary operator +" << endl;
return t;
}
int main()
{
Time a = {20, 10};
Time b = {40, 30};
Time c = a + b;
Time d = +a;
cout << c.minutes << " " << c.seconds << endl;
cout << d.minutes << " " << d.seconds << endl;
}
/*
Задача:
1) Что если операторы сложения поменяются местами
Time b = 90 + a;
Сработает ли в этом случае наша функция operator+ и, если нет, что нужно добавить, чтобы такое сложение сработало?
2) Напишите перегруженный оператор, который будет складывать не время и число, а два времени
Time operator+(Time ta, Time tb)
*/

View file

@ -0,0 +1,38 @@
#include <iostream>
using std::cout, std::endl;
/*
В прошлом семестре, для хранения результатов логических операций, мы использовали целочисленные типы (например int).
В языке C++ есть встроенный тип bool, который может принимать 2 значения (true и false).
Для хранения значения логических переменных желательно использовать этот тип
При печати на экран с помощью std::cout переменных типа bool печатается либо 0 либо 1
Чтобы на экран печаталось false или true нужно в std::cout передать специальный объект std::boolalpha
*/
bool isEven(int a)
{
return a % 2 == 0;
}
int main()
{
bool a = isEven(10);
bool b = isEven(15);
bool c = a || b;
if (c)
cout << "Yes" << endl;
else
cout << "No" << endl;
cout << c << endl;
cout << std::boolalpha << c << endl;
}

View file

@ -0,0 +1,68 @@
#include <iostream>
using std::cout, std::endl;
/*
Помимо арифметических операторов можно перегружать и операторы сравнения (и многие другие операторы)
Желательно, чтобы операторы сравнения возвращали bool
*/
struct Time
{
int minutes;
int seconds;
};
Time operator+(Time ta, Time tb)
{
Time result = ta;
result.seconds += 60 * tb.minutes + tb.seconds;
result.minutes += (result.seconds / 60);
result.seconds %= 60;
return result;
}
bool operator>(Time ta, Time tb)
{
bool result = false;
if (ta.minutes > tb.minutes)
result = true;
else if (ta.minutes == tb.minutes && ta.seconds > tb.seconds)
result = true;
return result;
}
int main()
{
Time a = {10, 20};
Time b = {10, 40};
Time c = {0, 20};
cout << std::boolalpha;
cout << (a > b) << endl;
cout << (b > a) << endl;
cout << (a + c > b) << endl;
}
/*
Задача:
1) Заметьте, что при выводе на экран сравнение было взято в скобки
cout << (a > b) << endl;
Что будет, если эти скобки не писать и почему
cout << a > b << endl;
2) Напишите перегруженные операторы < >= <= == != для сравнения объектов структур типа Time друг с другом
*/

View file

@ -0,0 +1,110 @@
#include <iostream>
using std::cout, std::endl;
/*
Помимо арифметических операторов можно перегружать и операторы сравнения (и многие другие операторы)
Желательно, чтобы операторы сравнения возвращали bool
*/
struct Time
{
int minutes;
int seconds;
};
Time operator+(Time ta, Time tb)
{
Time result = ta;
result.seconds += 60 * tb.minutes + tb.seconds;
result.minutes += (result.seconds / 60);
result.seconds %= 60;
return result;
}
bool operator>(Time ta, Time tb)
{
bool result = false;
if (ta.minutes > tb.minutes)
result = true;
else if (ta.minutes == tb.minutes && ta.seconds > tb.seconds)
result = true;
return result;
}
bool operator==(Time ta, Time tb)
{
bool result = false;
if (ta.minutes == tb.minutes && ta.seconds == tb.seconds)
result = true;
return result;
}
bool operator!=(Time ta, Time tb)
{
return !(ta == tb);
}
bool operator>=(Time ta, Time tb)
{
return ta > tb || ta == tb;
}
bool operator<(Time ta, Time tb)
{
return !(ta >= tb);
}
bool operator<=(Time ta, Time tb)
{
return !(ta > tb);
}
int main()
{
Time a = {10, 20};
Time b = {10, 40};
Time c = {0, 20};
cout << std::boolalpha;
cout << (a == b) << endl;
cout << (a != b) << endl;
cout << (a < b) << endl;
cout << (a <= b) << endl;
cout << (a > b) << endl;
cout << (a >= b) << endl;
cout << (a + c >= b) << endl;
}
/*
Задача:
1) Заметьте, что при выводе на экран сравнение было взято в скобки
cout << (a > b) << endl;
Что будет, если эти скобки не писать и почему
cout << a > b << endl;
Ошибка происходит из-за того, что приоритет операции << выше, чем у операций сравнения
В результате сначала проводится
cout << a
затем получившийся объект сравнивается с b. Это и приводит к ошибке.
*/

View file

@ -0,0 +1,49 @@
#include <iostream>
using std::cout, std::endl;
/*
Перегрузка оператора << для вывода на экран
Напомним, что объект под названием cout имеет тип ostream (сокращение от output stream - выходной поток)
и хранится в библиотеке iostream в пространстве имён std
То есть где-то внутри библиотеки iostream объявлена глобальная переменная по имени cout типа ostream
ostream cout;
Мы можем перегрузить оператор << с первым аргументом типа std::ostream, а вторым аргументом - нашим типом,
чтобы удобно выводить на экран объекты нашего типа.
*/
struct Time
{
int minutes;
int seconds;
};
void operator<<(std::ostream& out, Time t)
{
out << t.minutes << ":" << t.seconds;
}
int main()
{
Time a = {10, 20};
cout << a;
}
/*
Задача:
cout << a; работает, но
cout << a << endl; выдаёт ошибку в данной программе.
Из-за чего это происходит и как исправить эту ошибку?
*/

View file

@ -0,0 +1,63 @@
#include <iostream>
using std::cout, std::endl;
struct Time
{
int minutes;
int seconds;
};
Time operator+(Time ta, Time tb)
{
Time result = ta;
result.seconds += 60 * tb.minutes + tb.seconds;
result.minutes += (result.seconds / 60);
result.seconds %= 60;
return result;
}
std::ostream& operator<<(std::ostream& out, Time t)
{
out << t.minutes << ":" << t.seconds;
return out;
}
int main()
{
Time a = {10, 20};
Time b = {15, 50};
cout << a << endl << b << endl;
cout << a + b << endl;
}
/*
Задача:
cout << a; работает, но
cout << a << endl; выдаёт ошибку в данной программе.
Из-за чего это происходит и как исправить эту ошибку?
Решение:
Ошибка происходила из-за того, что оператор << ничего не возвращал.
В строке cout << a << endl;
результат cout << a был void и к нему нельзя применить оператор << ещё раз.
Результат cout << a должен быть тоже быть равен cout
Но, поскольку глобальный объект cout копировать мы не можем, у нас остаётся единственный выход:
принимать и возвращать объект cout по ссылке.
*/

View file

@ -0,0 +1,52 @@
#include <iostream>
using std::cout, std::endl;
struct Complex
{
float re, im;
};
Complex operator+(Complex first, Complex second)
{
Complex result = {first.re + second.re, first.im + second.im};
return result;
}
int main()
{
Complex z1 = {3, 7};
Complex z2 = {2, -4};
Complex z = z1 + z2;
cout << z.re << " + " << z.im << "i" << endl;
}
/*
Задачи:
1) Перегрузите следующие операторы:
- Вычитание
- Умножение
- Деление
- Унарный минус
- Унарный плюс
- Сравнение ==
- Сопряжение - это операция, которая меняет знак мнимой части комплексного числа
Для сопряжения используйте оператор унарная звёздочка *
2) Перегрузите оператор вывода <<
3) Напишите функцию exp(z)
/*
cout << z1 - z2 << endl;
cout << z1 * z2 << endl;
cout << z1 / z2 << endl;
cout << -z1 << endl;
cout << *z1 << endl; // (Комплексно-сопряжённое)
z = exp(z1 + z2)/(z1 * z2);
cout << z << endl;
*/

View file

@ -0,0 +1,52 @@
#include <iostream>
#include <iomanip>
using std::cout, std::endl;
/*
В библиотеки iomanip содержатся специальные функции, для работы с потоками ostream
setw - установить минимальный размер в символах для печати следующего объекта
setfill - если размер печати меньше минимального, то замостить оставшееся соответствующим символом
setprecision - установить точность (для вещественных чисел)
*/
struct Time
{
int minutes;
int seconds;
};
Time operator+(Time ta, Time tb)
{
Time result = ta;
result.seconds += 60 * tb.minutes + tb.seconds;
result.minutes += (result.seconds / 60);
result.seconds %= 60;
return result;
}
std::ostream& operator<<(std::ostream& out, Time t)
{
out << std::setfill('0') << std::setw(2) << t.minutes << ":" <<
std::setfill('0') << std::setw(2) << t.seconds;
return out;
}
int main()
{
Time a = {1, 5};
Time b = {4, 20};
cout << a << endl << b << endl;
cout << a + b << endl;
}