From d244e1bda10d420062c6a2a07f3c41a4fe9f7306 Mon Sep 17 00:00:00 2001 From: Angel Dimitriev Date: Fri, 16 Apr 2021 15:50:43 +0300 Subject: Rename READ to README.md --- Sem. 08/README.md | 162 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 Sem. 08/README.md (limited to 'Sem. 08/README.md') diff --git a/Sem. 08/README.md b/Sem. 08/README.md new file mode 100644 index 0000000..bf2065d --- /dev/null +++ b/Sem. 08/README.md @@ -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; +} + ``` + -- cgit v1.3.1-23-gd82d From e8d4fa4fd758b74b2e5ef2257e33ad6ebe5b48af Mon Sep 17 00:00:00 2001 From: Angel Dimitriev Date: Fri, 16 Apr 2021 16:53:20 +0300 Subject: Update README.md --- Sem. 08/README.md | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) (limited to 'Sem. 08/README.md') diff --git a/Sem. 08/README.md b/Sem. 08/README.md index bf2065d..ad6397f 100644 --- a/Sem. 08/README.md +++ b/Sem. 08/README.md @@ -17,16 +17,16 @@ |------------------------------------------------|---------------------------------| | () [] -> . ++ - - | лявоасоциативните | | + - ! ~ ++ - - (type)* & sizeof | дясноасоциативните | -| * / % | лявоасоциативните | -| + - | лявоасоциативните | -| << >> | лявоасоциативните | -| < <= > >= | лявоасоциативните | -| == != | лявоасоциативните | -| & | лявоасоциативните | -| ^ | лявоасоциативните | -| \| | лявоасоциативните | -| && | лявоасоциативните | -| \|\| | лявоасоциативните | +| * / % | лявоасоциативен | +| + - | лявоасоциативен| +| << >> | лявоасоциативен| +| < <= > >= | лявоасоциативен| +| == != | лявоасоциативен| +| & | лявоасоциативен | +| ^ | лявоасоциативен | +| \| | лявоасоциативен| +| && | лявоасоциативен| +| \|\| | лявоасоциативен| | ?: | дясноасоциативните | | = += -= *= /= %= >>= <<= &= ^= | дясноасоциативните | @@ -159,4 +159,3 @@ int main() cout << result << endl; } ``` - -- cgit v1.3.1-23-gd82d From 518334c53a6a16f6092b786dc9f56c4929ee430b Mon Sep 17 00:00:00 2001 From: Angel Dimitriev Date: Fri, 16 Apr 2021 16:53:39 +0300 Subject: Update README.md --- Sem. 08/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'Sem. 08/README.md') diff --git a/Sem. 08/README.md b/Sem. 08/README.md index ad6397f..063d946 100644 --- a/Sem. 08/README.md +++ b/Sem. 08/README.md @@ -16,7 +16,7 @@ | Оператор | Асоциативност | |------------------------------------------------|---------------------------------| | () [] -> . ++ - - | лявоасоциативните | -| + - ! ~ ++ - - (type)* & sizeof | дясноасоциативните | +| + - ! ~ ++ - - (type)* & sizeof | дясноасоциативен | | * / % | лявоасоциативен | | + - | лявоасоциативен| | << >> | лявоасоциативен| @@ -27,8 +27,8 @@ | \| | лявоасоциативен| | && | лявоасоциативен| | \|\| | лявоасоциативен| -| ?: | дясноасоциативните | -| = += -= *= /= %= >>= <<= &= ^= | дясноасоциативните | +| ?: | дясноасоциативен | +| = += -= *= /= %= >>= <<= &= ^= | дясноасоциативен | ### Предефиниране на оператор (пример) ```c++ -- cgit v1.3.1-23-gd82d From 9aa9147fcc7d0469262ac02071a8c9fc54734d27 Mon Sep 17 00:00:00 2001 From: Angel Dimitriev Date: Fri, 16 Apr 2021 16:53:51 +0300 Subject: Update README.md --- Sem. 08/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Sem. 08/README.md') diff --git a/Sem. 08/README.md b/Sem. 08/README.md index 063d946..41e40f4 100644 --- a/Sem. 08/README.md +++ b/Sem. 08/README.md @@ -15,7 +15,7 @@ ### Списъка на операторите в C++: | Оператор | Асоциативност | |------------------------------------------------|---------------------------------| -| () [] -> . ++ - - | лявоасоциативните | +| () [] -> . ++ - - | лявоасоциативен | | + - ! ~ ++ - - (type)* & sizeof | дясноасоциативен | | * / % | лявоасоциативен | | + - | лявоасоциативен| -- cgit v1.3.1-23-gd82d