diff options
clean up
8 files changed, 0 insertions, 584 deletions
| -rw-r--r-- | Sem. 09/README.md | 230 | ||||
| -rw-r--r-- | Sem. 09/task1 (not finished)/Grade.cpp | 69 | ||||
| -rw-r--r-- | Sem. 09/task1 (not finished)/Grade.h | 26 | ||||
| -rw-r--r-- | Sem. 09/task1 (not finished)/Student.cpp | 45 | ||||
| -rw-r--r-- | Sem. 09/task1 (not finished)/Student.h | 29 | ||||
| -rw-r--r-- | Sem. 09/task1 (not finished)/UniCourse.cpp | 135 | ||||
| -rw-r--r-- | Sem. 09/task1 (not finished)/UniCourse.h | 35 | ||||
| -rw-r--r-- | Sem. 09/task1 (not finished)/main.cpp | 15 |
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 |
