Website Summary Files Commits Branches @commit @diff @stats
path: root / Sem. 09
diff options
context:
space:
mode:
Commit8cf1283a4ffb9fe1901c29c087fa376de82726af (patch)
Author
 angeld55 <angel_dimitriev@abv.bg>
2022-02-19 23:30:52 +0200
Committer
 angeld55 <angel_dimitriev@abv.bg>
2022-02-19 23:30:52 +0200
Filesabdfe6bf526100dcce87a88563100e02adf7605e /Sem. 09
Object-oriented_programming_FMI-8cf1283a4ffb9fe1901c29c087fa376de82726af.tar
Object-oriented_programming_FMI-8cf1283a4ffb9fe1901c29c087fa376de82726af.tar.gz
Object-oriented_programming_FMI-8cf1283a4ffb9fe1901c29c087fa376de82726af.zip
Parentd73a7ec225516657dec74472a0491330e9999217 (diff)
clean up
diff --git a/Sem. 09/README.md b/Sem. 09/README.md
deleted file mode 100644
index 3ec48cc..0000000
--- a/Sem. 09/README.md
+++ /dev/null
@@ -1,230 +0,0 @@
-# Композиция на обекти. Масиви от обекти. Шаблони.
-## Композиция
-Композиция – класове като елементи на други класове (влагане на класове) Един клас може да включва в себе си обекти от други класове като член-данни. Когато обект от даден клас се дефинира, автоматично се извиква неговият конструктор. Ако класът съдържа член-данни, в неговия конструктор трябва да се укаже кои конструктори на член-данните да се извикват.
-#### Пример 1
-```c++
-class A
-{
- .
- .
- .
-}
-class B
-{
- int n;
- A obj;
-}
- ```
-В тази ситуация се извикват **default-ните те конструктори на n и obj**.
-#### Пример 2
-```c++
-class A
-{
- A(int a, int b)
- .
- .
- .
-}
-class B
-{
- B() : A(1, 2)
- {}
-
- int n;
- A obj;
-}
- ```
-Тук A няма default-ен конструктор. Това означава, че в конструктора на B трябва да се извика **експлицитно** някой от неговите конструктори
-### Композиция на обекти с динамична памет
-Когато имаме композиция и в главния клас има динамично заделяне на памет, то трябва в реализацията на копи-конструктора и оператор= **експлицитно** да се извикват копи-конструкторите и оператора = за всички член-данни (композирани обекти).
-```c++
-class B;
-
-class A
-{
- void copyFrom(const A& other)
- {
- arr = new int[other.size];
- for (int i = 0; i < other.size; i++)
- arr[i] = other.arr[i];
- size = other.size;
- }
- void free()
- {
- delete[] arr;
- }
-
-public:
- B nestedObject;
- int* arr; //dynamic array
- size_t size;
-
- A(int n) : size(n)
- {
- arr = new int[n];
- }
- A(const A& other) : nestedObject(other.objTest), size(other.size)
- {
- copyFrom(other);
- }
- A& operator=(const A& other)
- {
- nestedObject= other.nestedObject;
- size = other.size;
-
- if (this != &other)
- {
- free();
- copyFrom(other);
- }
- return *this;
- }
-
- ~A()
- {
- free();
- }
-};
- ```
- **ВАЖНО**: Деструкторите на член-данните **НЕ** трябва да се извикват експлицитно в деструктора на класа.
-
-## Масиви от обекти
-#### Статичен масив от обекти
-
-```c++
-class A;
-int main()
-{
- A arr[5]; //5 def. constr.
-} //5 destr
- ```
-Създава **статичен** масив с 5 обекта от тип A. На всеки от тях се е извикал конструктора по подразбиране.
-Масивът ще се изтрие, когато приключи функцията.
-#### Статичен масив от указатели към обекти
-```c++
-class A;
-int main()
-{
- A* arr[10]; //5 empty pointers.
-
- arr[0] = new A();
- arr[2] = new A();
-
- delete arr[0];
- delete arr[2];
-}
- ```
-Създава **статичен** масив с 5 указателя . Само на 2 от тези указатели присвояваме обекти, които са заделени в динамичната памет.
-Масивът ще се изтрие, когато приключи функцията.
-#### Динамичен масив от обекти
-```c++
-class A;
-int main()
-{
- A* arr = new A[5]; //5 def constr.
- delete[] arr; //5 destr
-}
- ```
-Създава **динамичен** масив с 5 обекта от тип A. На всеки от тях се е извикал конструктора по подразбиране.
-Масивът ще се изтрие (и ще се изтрият обектите), когато се извика delete[] върху него.
-
-#### Динамичен масив от указатели към обекти
-```c++
-class A;
-int main()
-{
- A** arr = new A*[5]; //5 empty pointers.
-
- arr[0] = new A(); //def constr.
- arr[2] = new A(); //def constr.
-
- delete arr[0]; //destr.
- delete arr[2]; //destr.
-
- delete[] arr;
-}
- ```
- Създава **динамичен** масив с 5 указателя . Само на 2 от тези указатели присвояваме обекти, които са заделени в динамичната памет.
-Масивът ще се изтрие (и ще се изтрият обектите), когато се извика delete[] върху него.
-
-
-
-## Задачи
-
-**Задача 1:**
-Трябва да реализирате библиотека за работа с факултатитен курс.
-Курсът ще има преподаватели - лектор и асистенти - имената им се приемат като параметри.
-Асистентите могат да са най-много 3.
-
-**Пример**:
- ```c++
-int main()
-{
- OOPcourse p("Lecturer1", "Assistant1");
-
- p.addStudent("Ivan Petrov", 45123);
- p.addStudent("Aleksandur Mironov", 45123);
- p.addStudent("Stefan Popov", 45123);
-
- p.addGrade(45123, "HW1", 4, "Assistant1");
- p.addGrade(45222, "HW1", 6, "Lecturer1");
- p.addGrade(45222, "K1", 5, "Assistant1");
-
- p.getAverage("HW1"); // 4.5;
-
- p.removeStudent(45123);
-
- p.getAverageGradePerTask("HW1"); // 5;
-
- p.getAverageFromTeacher("Lecturer1"); //6
-
-}
- ```
-Функционални изисквания:
- - Всеки студент трябва да има най-много една оценка за дадено задание.
- - Записана оценка за дадено задание може да се променя, но не може да се изтрива!
- - Във всеки момент трябва да може да се види каква е средната оценка, която е написал лекторът или асистентът.
- - Студент може да има най-много 20 оценки.
- - Студентите имат имена с макс дължина 30 символа.
-
-
- **Задача 2:**
- Релизирайте клас стринг, който ще се ползва за работа със символни низове. Стрингът трябва да има като минимум следния интерфейс:
-
-
- - Конструктор по подразбиране (по поразбиране ще е празният низ)
- - Конструктор, който приема константен указател към масив от символи.
- - Член-функция, която приема друг стринг и връща дали е подстринг на текущия.
- - Член-функция, която приема цяло число k и връща подстринг на текущия, но започващ от k-ти символ
- - Член-функция, която приема две цели числа k и t и връща подстринг на текущия, но започващ от k-ти символ и завършващ на t-ти символ.
- - Предефиниран оператор [] за достъп до произвол символ.
-- Предефиниран оператори + и += за конкатенация на стрингове.
-- Предефиниран оператор *, който приема стринг и цяло число k и мултиплицира съдържаниято на стринга k пъти.
-- Предефинирани оператори << и >>.
-- Предефинирани опратори за сравнение (<, >, <=, >=, ==, !=). Стринговете да се сравняват лексикографско!
-
-**Пример**:
- ```c++
-int main()
-{
- myString s1; // ""
- myString s2("Test");
-
- s2.substr(2); // st
-
- s2.substr(1,2); // es
-
- s1 = "pronto";
-
- s2.contains(s1); //false
-
- myString s3 = s1 + s2; // prontoTest
-
- s3 *= 3; //prontoTestprontoTestprontoTest
-
- cin >> s3;
- cout << s3 << endl;
-
- s3 == s1; //false;
-}
- ```
diff --git a/Sem. 09/task1 (not finished)/Grade.cpp b/Sem. 09/task1 (not finished)/Grade.cpp
deleted file mode 100644
index 4302166..0000000
--- a/Sem. 09/task1 (not finished)/Grade.cpp
+++ /dev/null
@@ -1,69 +0,0 @@
-#include "Grade.h"
-
-
-Grade::Grade() : taskName(nullptr)
-{
- setTaskName("Unknown");
- setGrade(2);
-}
-
-Grade::Grade(const char* taskName, size_t gradeValue) : taskName(nullptr)
-{
- setTaskName(taskName);
- setGrade(gradeValue);
-}
-
-void Grade::free()
-{
- delete[] taskName;
-}
-void Grade::copyFrom(const Grade& other)
-{
- gradeValue = other.gradeValue;
-
- taskName = new char[strlen(other.taskName) + 1];
- strcpy(taskName, other.taskName);
-}
-
-Grade::Grade(const Grade& other)
-{
- copyFrom(other);
-}
-
-Grade& Grade::operator=(const Grade& other)
-{
- if (this != &other)
- {
- free();
- copyFrom(other);
- }
- return *this;
-}
-Grade::~Grade()
-{
- free();
-}
-
-const char* Grade::getTaskName() const
-{
- return taskName;
-}
-size_t Grade::getGrade() const
-{
- return gradeValue;
-}
-
-void Grade::setGrade(size_t grade)
-{
- if (grade < 2 || grade > 6)
- throw std::exception("error!");
-
- gradeValue = grade;
-}
-
-void Grade::setTaskName(const char* name)
-{
- delete[] taskName;
- taskName = new char[strlen(name) + 1];
- strcpy(taskName, name);
-} \ No newline at end of file
diff --git a/Sem. 09/task1 (not finished)/Grade.h b/Sem. 09/task1 (not finished)/Grade.h
deleted file mode 100644
index d0cb2e7..0000000
--- a/Sem. 09/task1 (not finished)/Grade.h
+++ /dev/null
@@ -1,26 +0,0 @@
-#pragma once
-
-#include <iostream>
-
-class Grade
-{
- size_t gradeValue;
- char* taskName;
-
- void free();
- void copyFrom(const Grade& other);
-public:
- Grade();
-
- Grade(const char* taskName, size_t gradeValue);
-
- Grade(const Grade& other);
- Grade& operator=(const Grade& other);
- ~Grade();
-
- const char* getTaskName() const;
- size_t getGrade() const;
-
- void setTaskName(const char* name);
- void setGrade(size_t grade);
-}; \ No newline at end of file
diff --git a/Sem. 09/task1 (not finished)/Student.cpp b/Sem. 09/task1 (not finished)/Student.cpp
deleted file mode 100644
index 99d26dc..0000000
--- a/Sem. 09/task1 (not finished)/Student.cpp
+++ /dev/null
@@ -1,45 +0,0 @@
-#include "Student.h"
-
-Student::Student(const char* name, size_t fn)
-{
- setName(name);
- setFn(fn);
-}
-
-void Student::setFn(size_t fn)
-{
- if (fn < 80000 || fn > 83000)
- throw std::exception("Invalid fn");
-
- this->fn = fn;
-}
-void Student::setName(const char* name)
-{
- if (strlen(name) > MAX_NAME_LENGTH)
- throw std::exception("Name is too long!");
-
- strcpy(this->name, name);
-}
-
-size_t Student::getFN() const
-{
- return fn;
-}
-const char* Student::getName() const
-{
- return name;
-}
-
-void Student::addGrade(const char* taskName, size_t grade)
-{
- if (gradesCount == MAX_GRADES_COUNT)
- throw std::exception("Error! Too many grades!");
-
- Grade currentGrade(taskName, grade);
- grades[gradesCount++] = currentGrade;
-}
-
-void Student::print() const
-{
- std::cout << name << " " << fn << std::endl;
-} \ No newline at end of file
diff --git a/Sem. 09/task1 (not finished)/Student.h b/Sem. 09/task1 (not finished)/Student.h
deleted file mode 100644
index 5c09792..0000000
--- a/Sem. 09/task1 (not finished)/Student.h
+++ /dev/null
@@ -1,29 +0,0 @@
-#include "Grade.h"
-
-const size_t MAX_NAME_LENGTH = 30;
-const size_t MAX_GRADES_COUNT = 20;
-class Student
-{
-public:
-
- Student(const char* name, size_t fn);
-
- void setFn(size_t fn);
- void setName(const char* name);
-
- size_t getFN() const;
- const char* getName() const;
-
- void addGrade(const char* taskName, size_t grade);
-
-
- void print() const;
-private:
- char name[MAX_NAME_LENGTH + 1];
- size_t fn;
-
- Grade grades[MAX_GRADES_COUNT];
- size_t gradesCount;
-
-
-}; \ No newline at end of file
diff --git a/Sem. 09/task1 (not finished)/UniCourse.cpp b/Sem. 09/task1 (not finished)/UniCourse.cpp
deleted file mode 100644
index c854b82..0000000
--- a/Sem. 09/task1 (not finished)/UniCourse.cpp
+++ /dev/null
@@ -1,135 +0,0 @@
-#include "UniCourse.h"
-
-UniCourse::UniCourse(const char* lecturerName) : UniCourse(lecturerName, "", "", "")
-{}
-UniCourse::UniCourse(const char* lecturerName, const char* assistant1Name) : UniCourse(lecturerName, assistant1Name, "", "")
-{}
-UniCourse::UniCourse(const char* lecturerName, const char* assistant1Name, const char* assistant2Name) : UniCourse(lecturerName, assistant1Name, assistant2Name, "")
-{}
-
-UniCourse::UniCourse(const char* lecturerName, const char* assistant1Name, const char* assistant2Name, const char* assistant3Name)
-{
- this->lecturerName = new char[strlen(lecturerName) + 1];
- strcpy(this->lecturerName, lecturerName);
-
- assistantsNames[0] = new char[strlen(assistant1Name) + 1];
- strcpy(assistantsNames[0], assistant1Name);
-
- assistantsNames[1] = new char[strlen(assistant2Name) + 1];
- strcpy(assistantsNames[1], assistant2Name);
-
- assistantsNames[2] = new char[strlen(assistant3Name) + 1];
- strcpy(assistantsNames[2], assistant3Name);
-
- capacity = 8;
- size = 0;
-
- students = new Student*[capacity];
-}
-
-
-void UniCourse::copyFrom(const UniCourse& other)
-{
- lecturerName = new char[strlen(other.lecturerName) + 1];
- strcpy(lecturerName, other.lecturerName);
-
- for (int i = 0; i < 3; i++)
- {
- if (other.assistantsNames[i] != nullptr)
- {
- assistantsNames[i] = new char[strlen(other.assistantsNames[i]) + 1];
- strcpy(assistantsNames[i], other.assistantsNames[i]);
- }
- }
-
-
- students = new Student*[other.capacity];
-
- for (int i = 0; i < other.size; i++)
- students[i] = new Student(*other.students[i]);
-
- capacity = other.capacity;
- size = other.size;
-
-}
-void UniCourse::free()
-{
- delete[] lecturerName;
-
- for (int i = 0; i < 3; i++)
- delete[] assistantsNames[i];
-
- for (int i = 0; i < size; i++)
- delete students[i];
-
- delete[] students;
-}
-
-UniCourse::UniCourse(const UniCourse& other)
-{
- copyFrom(other);
-}
-
-UniCourse& UniCourse::operator=(const UniCourse& other)
-{
- if (this != &other)
- {
- free();
- copyFrom(other);
- }
- return *this;
-}
-UniCourse::~UniCourse()
-{
- free();
-}
-void UniCourse::addStudent(const char* name, size_t fn)
-{
- if (size == capacity)
- resize();
-
- Student* current = new Student(name, fn);
- students[size++] = current;
-}
-
-void UniCourse::resize()
-{
- Student** temp = new Student*[capacity *= 2];
-
- for (int i = 0; i < size; i++)
- temp[i] = students[i];
-
- delete[] students;
-
- students = temp;
-}
-
-size_t UniCourse::findStudentByFn(size_t fn)
-{
- for (int i = 0; i < size; i++)
- {
- if (students[i]->getFN() == fn)
- return i;
- }
- return -1;
-}
-void UniCourse::removeStudent(size_t fn)
-{
- size_t indexOfStudent = findStudentByFn(fn);
- if (fn == -1)
- return;
-
- delete students[indexOfStudent];
-
- for (int i = indexOfStudent; i < size - 1; i++)
- students[i] = students[i + 1];
-
- size--;
-
-}
-
-void UniCourse::print()
-{
- for (int i = 0; i < size; i++)
- students[i]->print();
-} \ No newline at end of file
diff --git a/Sem. 09/task1 (not finished)/UniCourse.h b/Sem. 09/task1 (not finished)/UniCourse.h
deleted file mode 100644
index fde1518..0000000
--- a/Sem. 09/task1 (not finished)/UniCourse.h
+++ /dev/null
@@ -1,35 +0,0 @@
-#include "Student.h"
-
-class UniCourse
-{
- char* lecturerName;
- char* assistantsNames[3];
-
- Student** students;
- size_t capacity;
- size_t size;
-
- void copyFrom(const UniCourse& other);
- void free();
-
- size_t findStudentByFn(size_t fn);
-
- void resize();
-
-public:
- UniCourse(const char* lecturerName);
- UniCourse(const char* lecturerName, const char* assistant1Name);
- UniCourse(const char* lecturerName, const char* assistant1Name, const char* assistant2Name);
- UniCourse(const char* lecturerName, const char* assistant1Name, const char* assistant2Name, const char* assistant3Name);
-
-
- UniCourse(const UniCourse& other);
- UniCourse& operator=(const UniCourse& other);
- ~UniCourse();
-
- void addStudent(const char* name, size_t fn);
- void removeStudent(size_t fn);
-
- void print();
-
-}; \ No newline at end of file
diff --git a/Sem. 09/task1 (not finished)/main.cpp b/Sem. 09/task1 (not finished)/main.cpp
deleted file mode 100644
index 6b727fa..0000000
--- a/Sem. 09/task1 (not finished)/main.cpp
+++ /dev/null
@@ -1,15 +0,0 @@
-#include "UniCourse.h"
-
-int main()
-{
- UniCourse u("ddz");
-
- u.addStudent("ivan", 80123);
- u.addStudent("angel", 80125);
- u.addStudent("petur", 80126);
- u.addStudent("ivan2", 81000);
- //u.print();
-
- u.removeStudent(80125);
- u.print();
-} \ No newline at end of file