From 022cf915d2afab9ca87ac62ab01679de74cd8a77 Mon Sep 17 00:00:00 2001 From: Angel Dimitriev Date: Fri, 16 Apr 2021 15:50:35 +0300 Subject: Create READ --- Sem. 08/READ | 162 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 Sem. 08/READ 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; +} + ``` + -- cgit v1.3.1-23-gd82d 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/READ | 162 ------------------------------------------------------ Sem. 08/README.md | 162 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 162 insertions(+), 162 deletions(-) delete mode 100644 Sem. 08/READ create mode 100644 Sem. 08/README.md diff --git a/Sem. 08/READ b/Sem. 08/READ deleted file mode 100644 index bf2065d..0000000 --- a/Sem. 08/READ +++ /dev/null @@ -1,162 +0,0 @@ -# Предефиниране на оператори. Приятелски класове и функции. -## 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; -} - ``` - 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 5486e82f4bb3137c5a8e13c85a9171ac53b0f44b Mon Sep 17 00:00:00 2001 From: Angel Dimitriev Date: Fri, 16 Apr 2021 15:51:04 +0300 Subject: Update Complex.cpp --- Sem. 08/Complex/Complex.cpp | 102 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) diff --git a/Sem. 08/Complex/Complex.cpp b/Sem. 08/Complex/Complex.cpp index e69de29..c604d0a 100644 --- a/Sem. 08/Complex/Complex.cpp +++ b/Sem. 08/Complex/Complex.cpp @@ -0,0 +1,102 @@ +#include "Complex.h" + +Complex::Complex() +{ + real = 0; + im = 0; +} +Complex::Complex(double real, double im) +{ + this->real = real; + this->im = im; +} +Complex& Complex::operator+=(const Complex& other) +{ + real += other.real; + im += other.im; + return *this; +} +Complex& Complex::operator-=(const Complex& other) +{ + real -= other.real; + im -= other.im; + return *this; +} +Complex& Complex::operator*=(const Complex& other) +{ + int oldReal = real; + real = real*other.real - im*other.im; + im = oldReal*other.im + im * other.real; + return *this; +} +Complex& Complex::operator/=(const Complex& other) // a/=b +{ + Complex Conjugated = other.getConjugated(); //взимаме комплексно спрегнатата на другата дроб (b) + + Complex otherCopy(other);// копираме другата (b), за да не я промяняме. + + //Умножаваме двете по комплексно спрегнатата. + *this *= Conjugated; + otherCopy *= Conjugated; //Тук трябва да остане само реална част. + + if (otherCopy.real != 0) + { + real /= otherCopy.real; + im /= otherCopy.real; + } + + return *this; +} + + +//След дефинирането на +=, -=, *= и /=, можем лесно да дефинираме +, -, * и /, преизползвайки вече написаните опратори. +Complex operator+(const Complex& lhs, const Complex& rhs) { //a+b + + Complex result(lhs); // Създаваме нов обект, който е копие на a (използваме копи-конструктора) + result += rhs; //към копието на a, добавяме b (Използваме вече дефинирания оператор +=) + + return result; +} +//Операторите -, *, / са аналогични с +. +Complex operator-(const Complex& lhs, const Complex& rhs) { + Complex result(lhs); + result -= rhs; + + return result; +} + +Complex operator*(const Complex& lhs, const Complex& rhs) { + + Complex result(lhs); + result *= rhs; + + return result; +} + +Complex operator/(const Complex& lhs, const Complex& rhs) { + + Complex result(lhs); + result /= rhs; + + return result; +} + +Complex Complex::getConjugated() const +{ + Complex result(*this); + result.im *= -1; + + return result; +} + +// за да можем да правим cout<>c1 или да четем от файл и др. +std::istream& operator>>(std::istream& ifs, Complex& r) { + + return ifs >> r.real >> r.im; +} -- cgit v1.3.1-23-gd82d From 54e11f32b9f29795823c1a8c8007800daa3f2514 Mon Sep 17 00:00:00 2001 From: Angel Dimitriev Date: Fri, 16 Apr 2021 15:51:15 +0300 Subject: Update Complex.h --- Sem. 08/Complex/Complex.h | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/Sem. 08/Complex/Complex.h b/Sem. 08/Complex/Complex.h index e69de29..d76a2f3 100644 --- a/Sem. 08/Complex/Complex.h +++ b/Sem. 08/Complex/Complex.h @@ -0,0 +1,34 @@ +#include +class Complex +{ +private: + double real; + double im; + +public: + Complex(); + Complex(double real, double im); + + Complex getConjugated() const; //връща комплексно спрегнатото число на текущия обект. + + //assignment operators + // a+=b Към а се добавя стойността на b. а се променя , b не се. Операцията ще върне a за да може да се правят верижни изрази (a+=b+=c) + Complex& operator+=(const Complex&); + Complex& operator-=(const Complex&); + Complex& operator*=(const Complex&); + Complex& operator/=(const Complex&); + + + + //stream opeartors ( std::cout>> c1) (std::cin<>(std::istream&, Complex&); + +}; +// a+b. Операторът връща НОВА променлива(Complex), която е резултатът от операцията. +Complex operator+(const Complex&, const Complex&); +Complex operator-(const Complex&, const Complex&); +Complex operator*(const Complex&, const Complex&); +Complex operator/(const Complex&, const Complex&); + + -- cgit v1.3.1-23-gd82d From 9aebeb0658de877e80ec73fd09d56f4b773b575b Mon Sep 17 00:00:00 2001 From: Angel Dimitriev Date: Fri, 16 Apr 2021 15:51:34 +0300 Subject: Update Source.cpp --- Sem. 08/Complex/Source.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Sem. 08/Complex/Source.cpp b/Sem. 08/Complex/Source.cpp index e69de29..32f9e17 100644 --- a/Sem. 08/Complex/Source.cpp +++ b/Sem. 08/Complex/Source.cpp @@ -0,0 +1,9 @@ +#include "Complex.h" + +int main() +{ + Complex c(3, 4); + Complex c2(3, 4); + + std::cout << c* c2; +} -- cgit v1.3.1-23-gd82d From e3c97029202b4ccd89242a04bb61e462cd13d1d3 Mon Sep 17 00:00:00 2001 From: Angel Dimitriev Date: Fri, 16 Apr 2021 15:52:10 +0300 Subject: Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f0ec0f4..82155c0 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,4 @@ - **Тема 5:** Член-функции. Жизнен цикъл на обект. Конструктори и деструктор. **Капсулация**. Модификатори за достъп. Член-функции **get** и **set**. - **Тема 6:** Разделна компилация. **Абстракция**. Копиращ конструктор и оператор= - **Тема 7:** Динамична памет в класовете. Голямата четворка (**Rule of four**). + - **Тема 8:** Предефиниране на оператори. Приятелски класове и функции. -- 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(-) 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(-) 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(-) 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