diff options
1 files changed, 162 insertions, 0 deletions
| -rw-r--r-- | Sem. 08/READ | 162 |
diff --git a/Sem. 08/READ b/Sem. 08/READ new file mode 100644 index 0000000..bf2065d --- /dev/null +++ b/Sem. 08/READ @@ -0,0 +1,162 @@ +# Предефиниране на оператори. Приятелски класове и функции. +## Oператори +### Видове оператори. +в C++ има два вида оператори: + + - Унарни (на един аргумент) + - Бинарни (на два аргумента) + + +### Операторите се характеризират с: + - Приоритет + - Асоциативност + - Позиция на оператора спярмо аргумента - *префиксен*, *инфиксен* и *суфиксен* + +### Списъка на операторите в C++: +| Оператор | Асоциативност | +|------------------------------------------------|---------------------------------| +| () [] -> . ++ - - | лявоасоциативните | +| + - ! ~ ++ - - (type)* & sizeof | дясноасоциативните | +| * / % | лявоасоциативните | +| + - | лявоасоциативните | +| << >> | лявоасоциативните | +| < <= > >= | лявоасоциативните | +| == != | лявоасоциативните | +| & | лявоасоциативните | +| ^ | лявоасоциативните | +| \| | лявоасоциативните | +| && | лявоасоциативните | +| \|\| | лявоасоциативните | +| ?: | дясноасоциативните | +| = += -= *= /= %= >>= <<= &= ^= | дясноасоциативните | + +### Предефиниране на оператор (пример) +```c++ +Complex& Complex::operator+=(const Complex& other) +{ + real += other.real; + im += other.im; + return *this; +} + ``` +Вече може да правим следното: +```c++ +ina main() +{ + Complex c(1,3); //1 + 3i; + Complex c2(10,20) // 10 + 2i; + c += c2 // now c is 11 + 5i +} + ``` +При предефинирането на оператор **не могат** да се променят *приоритетът*, *асоциативността*, броят и позицията на *аргументите* му. + +## Приятелски класове и приятелски функции +Декларират се с на запазената дума **friend** пред прототипа на функцията. +Даденият friend-клас/фунцкия има достъп до всички компоненти на класа. +Т.е. всички членове на класа са public за friend-класовете/функциите приятели. +### Приятелски функции (пример) + + ```c++ +class Complex +{ + +private: + double real; + double im; +public: + friend double getModulos(const Complex& other); + . + . + . +} + ``` + ```c++ + +double getModulos(const Complex& other) +{ + return sqrt((other.real – other.real) * (other.real – other.real) + (other.im – other.im ) * (other.im – other.im)); +} + +``` +## Задачи + +**Задача 1:** +Реализирайте клас **Nvector**, който ще се използва за работа с математически вектор. +Предефинирайте оператори със следната функционалност: + - Събиране на вектори. + - Изваждане на вектори. + - Умножение на вектор със скалар. + - Проверка дали два вектора са успоредни. + - Проверка дали два вектора са перпендикулярни. + - Взимане на дължина на вектор. + - Достъп до произволен елемент на вектор. + - Вход и изход от потоци. + + ```c++ +int main() +{ + Nvector v(4); + cin >> v; + + Nvector v2(4); + cin >> v; + + Nvector result = v + v2; + + cout << result << endl; + +} + ``` + Релизирайте клас двумерната декартова координатна система, която приема 2 вектора, които са нейният базис. + Реализрайте следните функции: + - Връща вектор в базиса по подадени 2 координата. + - По подаден вектор връща координатите му в базиса. + + ```c++ +int main() +{ + Nvector v(4); + v[0] = 2; + v[1] = 1; + + Nvector v2(4); + v2[0] = 3; + v2[1] = 1; + + twoDimCoordSystem s(v1, v2); + + cout << s1.getVectorByCoordinates(7, 4); // [26, 11] + + cout << s1.getCoordinatesByVector(7, 4); // [5, -1] + + cout << result << endl; + +} + ``` + + **Задача 2:** +Реализирайте клас **Complex**, който ще се използва за работа с комплексни числа. +Предефинирайте оператори със следната функционалност: + - Събиране на комплексни числа. + - Изваждане на комплексни числа. + - Умножение на комплексни числа. + - Деление на комплексни числа + - Вход и изход от потоци. + +```c++ + + +int main() +{ + Complex c; + cin >> c; + + Complex c2; + cin >> c2; + + Complex result = c2 / c; + + cout << result << endl; +} + ``` + |
