initial commit
This commit is contained in:
commit
2369f801af
76 changed files with 4273 additions and 0 deletions
|
|
@ -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)
|
||||
|
||||
*/
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
@ -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)
|
||||
|
||||
|
||||
|
||||
|
||||
*/
|
||||
|
|
@ -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;
|
||||
|
||||
}
|
||||
|
|
@ -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)
|
||||
|
||||
|
||||
|
||||
|
||||
*/
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -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 друг с другом
|
||||
|
||||
*/
|
||||
|
|
@ -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. Это и приводит к ошибке.
|
||||
*/
|
||||
|
|
@ -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; выдаёт ошибку в данной программе.
|
||||
|
||||
Из-за чего это происходит и как исправить эту ошибку?
|
||||
|
||||
*/
|
||||
|
|
@ -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 по ссылке.
|
||||
|
||||
*/
|
||||
|
|
@ -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;
|
||||
*/
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in a new issue