Website Summary Files Commits Branches @commit @diff @stats
diff options
context:
space:
mode:
5 files changed, 307 insertions, 0 deletions
-rw-r--r--README.md1
-rw-r--r--Sem. 08/Complex/Complex.cpp102
-rw-r--r--Sem. 08/Complex/Complex.h34
-rw-r--r--Sem. 08/Complex/Source.cpp9
-rw-r--r--Sem. 08/README.md161
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:** Предефиниране на оператори. Приятелски класове и функции.
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::ostream& operator<<(std::ostream& ofs, const Complex& r) {
+
+ return ofs << r.real << ' ' << r.im << 'i';
+}
+
+// за да можем да правим cin>>c1 или да четем от файл и др.
+std::istream& operator>>(std::istream& ifs, Complex& r) {
+
+ return ifs >> r.real >> r.im;
+}
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 <iostream>
+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<<c1 )
+ friend std::ostream& operator<<(std::ostream&, const Complex&);
+ friend std::istream& operator>>(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&);
+
+
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;
+}
diff --git a/Sem. 08/README.md b/Sem. 08/README.md
new file mode 100644
index 0000000..41e40f4
--- /dev/null
+++ b/Sem. 08/README.md
@@ -0,0 +1,161 @@
+# Предефиниране на оператори. Приятелски класове и функции.
+## 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;
+}
+ ```