aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSyndamia <kamen@syndamia.com>2024-04-03 17:47:07 +0300
committerSyndamia <kamen@syndamia.com>2024-04-03 17:47:07 +0300
commit44d085f265583f0e3cbef294bbe2c8e300aaa452 (patch)
tree4899165f82a51beca1d4726db441a2749b628b9f
parent6a8154ad7f2cbfbb2ae4f2ddda1cd0db0e430e44 (diff)
downloadoop-2023-solutions-44d085f265583f0e3cbef294bbe2c8e300aaa452.tar
oop-2023-solutions-44d085f265583f0e3cbef294bbe2c8e300aaa452.tar.gz
oop-2023-solutions-44d085f265583f0e3cbef294bbe2c8e300aaa452.zip
[w6] Added exercise descriptions and solutions to 1-9
-rw-r--r--week06/Exercise01.cpp64
-rw-r--r--week06/Exercise02.cpp35
-rw-r--r--week06/Exercise03.cpp16
-rw-r--r--week06/Exercise04.cpp69
-rw-r--r--week06/Exercise05.cpp31
-rw-r--r--week06/Exercise06.cpp42
-rw-r--r--week06/Exercise07.cpp37
-rw-r--r--week06/Exercise08.cpp53
-rw-r--r--week06/Exercise09.cpp55
-rw-r--r--week06/README.md84
10 files changed, 486 insertions, 0 deletions
diff --git a/week06/Exercise01.cpp b/week06/Exercise01.cpp
new file mode 100644
index 0000000..9e7a14d
--- /dev/null
+++ b/week06/Exercise01.cpp
@@ -0,0 +1,64 @@
+#include <cstring>
+
+struct WoodPlank {
+private:
+ unsigned height;
+ unsigned width;
+ unsigned depth;
+ float price;
+ char type[1024];
+
+ void copyFrom(const WoodPlank& other) {
+ this->height = other.height;
+ this->width = other.width;
+ this->depth = other.depth;
+ this->price = other.price;
+ strcpy(this->type, other.type);
+ }
+
+public:
+ unsigned GetHeight() {
+ return height;
+ }
+ void SetHeight(unsigned newHeight) {
+ height = newHeight;
+ }
+
+ unsigned GetWidth() {
+ return width;
+ }
+ void SetWidth(unsigned newWidth) {
+ width = newWidth;
+ }
+
+ unsigned GetDepth() {
+ return depth;
+ }
+ void SetDepth(unsigned newDepth) {
+ depth = newDepth;
+ }
+
+ float GetPrice() {
+ return price;
+ }
+ void SetPrice(float newPrice) {
+ price = newPrice;
+ }
+
+ const char* GetType() {
+ return type;
+ }
+ void SetType(char newType[1024]) {
+ strcpy(type, newType);
+ }
+
+ WoodPlank(const WoodPlank& other) {
+ copyFrom(other);
+ }
+ WoodPlank& operator=(const WoodPlank& other) {
+ if (this != &other) {
+ copyFrom(other);
+ }
+ return *this;
+ }
+};
diff --git a/week06/Exercise02.cpp b/week06/Exercise02.cpp
new file mode 100644
index 0000000..63daeac
--- /dev/null
+++ b/week06/Exercise02.cpp
@@ -0,0 +1,35 @@
+#include <cstring>
+
+struct DynamicString {
+private:
+ char* str;
+ unsigned size;
+
+ void free() {
+ delete[] str;
+ }
+ void copyFrom(const DynamicString& other) {
+ this->str = new char[other.size];
+ strcpy(this->str, other.str);
+ this->size = other.size;
+ }
+
+public:
+ DynamicString() {
+ str = nullptr;
+ size = 0;
+ }
+ ~DynamicString() {
+ free();
+ }
+ DynamicString(const DynamicString& other) {
+ copyFrom(other);
+ }
+ DynamicString& operator=(const DynamicString& other) {
+ if (this != &other) {
+ free();
+ copyFrom(other);
+ }
+ return *this;
+ }
+};
diff --git a/week06/Exercise03.cpp b/week06/Exercise03.cpp
new file mode 100644
index 0000000..f4f0229
--- /dev/null
+++ b/week06/Exercise03.cpp
@@ -0,0 +1,16 @@
+#include <fstream>
+#include <iostream>
+
+int main() {
+ char fileName[1024];
+ std::cin.getline(fileName, 1024);
+
+ std::ofstream file(fileName);
+ if (!file.is_open()) {
+ std::cout << "Couldn't open file!" << std::endl;
+ return 1;
+ }
+
+ file << "Hello World!";
+ file.close();
+}
diff --git a/week06/Exercise04.cpp b/week06/Exercise04.cpp
new file mode 100644
index 0000000..95aa007
--- /dev/null
+++ b/week06/Exercise04.cpp
@@ -0,0 +1,69 @@
+#include <fstream>
+#include <iostream>
+
+// Отивайки в края и тръгвайки към началото
+void Method1(std::ifstream& file) {
+ file.seekg(0, std::ios::end);
+ size_t endPos = file.tellg();
+
+ while (!file.fail() && file.peek() != '\n') {
+ file.seekg(-1, std::ios::cur);
+ }
+ file.clear();
+
+ if (file.tellg() > 0) {
+ file.seekg(1, std::ios::cur);
+ }
+ size_t lineLength = endPos - file.tellg() + 1;
+
+ char* buffer = new char[lineLength + 1];
+ file.getline(buffer, lineLength);
+ buffer[lineLength] = '\0';
+
+ std::cout << buffer << std::endl;
+
+ delete[] buffer;
+}
+
+// Започвайки от началото и ходейки към края
+void Method2(std::ifstream& file) {
+ file.seekg(0, std::ios::end);
+ size_t lastIndex = file.tellg();
+
+ file.seekg(0, std::ios::beg);
+ size_t lastNewLine = 0;
+
+ while (!file.eof()) {
+ if (file.get() == '\n') {
+ lastNewLine = file.tellg();
+ }
+ }
+ file.clear();
+
+ file.seekg(lastNewLine, std::ios::beg);
+ size_t lineLength = lastIndex - file.tellg() + 1;
+
+ char* buffer = new char[lineLength + 1];
+ file.getline(buffer, lineLength);
+ buffer[lineLength] = '\0';
+
+ std::cout << buffer << std::endl;
+
+ delete[] buffer;
+}
+
+int main() {
+ char fileName[1024];
+ std::cin.getline(fileName, 1024);
+
+ std::ifstream file(fileName);
+ if (!file.is_open()) {
+ std::cout << "Couldn't open file!" << std::endl;
+ return 1;
+ }
+
+ Method1(file);
+ Method2(file);
+
+ file.close();
+}
diff --git a/week06/Exercise05.cpp b/week06/Exercise05.cpp
new file mode 100644
index 0000000..f677043
--- /dev/null
+++ b/week06/Exercise05.cpp
@@ -0,0 +1,31 @@
+#include <fstream>
+#include <iostream>
+
+int main() {
+ char fileName[1024];
+ std::cin.getline(fileName, 1024);
+
+ std::ifstream file(fileName);
+ if (!file.is_open()) {
+ std::cout << "Couldn't open file!" << std::endl;
+ return 1;
+ }
+
+ unsigned lines = 0;
+ unsigned words = 0;
+ char prev = '\0';
+
+ while (!file.eof()) {
+ if (file.peek() == '\n') {
+ lines++;
+ }
+ if ((prev == ' ' || prev == '\t' || prev == '\n') && file.peek() != ' ' && file.peek() != '\t' && file.peek() != '\n') {
+ words++;
+ }
+
+ prev = file.get();
+ }
+ file.close();
+
+ std::cout << lines << " " << words << std::endl;
+}
diff --git a/week06/Exercise06.cpp b/week06/Exercise06.cpp
new file mode 100644
index 0000000..d05f495
--- /dev/null
+++ b/week06/Exercise06.cpp
@@ -0,0 +1,42 @@
+#include <fstream>
+#include <iostream>
+
+int main() {
+ char fileName1[1024];
+ std::cin.getline(fileName1, 1024);
+ char fileName2[1024];
+ std::cin.getline(fileName2, 1024);
+
+ std::fstream file1(fileName1);
+ if (!file1.is_open()) {
+ std::cout << "Couldn't open file!" << std::endl;
+ return 1;
+ }
+
+ std::ifstream file2(fileName2);
+ if (!file2.is_open()) {
+ std::cout << "Couldn't open file!" << std::endl;
+ return 1;
+ }
+
+ file1.seekg(0, std::ios::end);
+ size_t endIndex = file1.tellg();
+ size_t middleIndex = endIndex / 2;
+ size_t latterHalfSize = endIndex - middleIndex;
+
+ file1.seekg(middleIndex, std::ios::beg);
+ char* buffer = new char[latterHalfSize];
+ file1.read(buffer, latterHalfSize);
+ file1.clear();
+
+ file1.seekp(middleIndex, std::ios::beg);
+ while (file2.peek() > -1) {
+ file1.put(file2.get());
+ }
+ file1.write(buffer, latterHalfSize);
+
+ delete[] buffer;
+
+ file1.close();
+ file2.close();
+}
diff --git a/week06/Exercise07.cpp b/week06/Exercise07.cpp
new file mode 100644
index 0000000..2e07a0c
--- /dev/null
+++ b/week06/Exercise07.cpp
@@ -0,0 +1,37 @@
+#include <fstream>
+#include <iostream>
+
+int main() {
+ int m, n;
+ std::cin >> m >> n;
+
+ char fileName[1024];
+ std::cin.ignore();
+ std::cin.getline(fileName, 1024);
+
+ std::ifstream file(fileName);
+ if (!file.is_open()) {
+ std::cout << "Couldn't open file!" << std::endl;
+ return 1;
+ }
+
+ unsigned lineIndex = 1;
+ while (!file.eof()) {
+ if (file.peek() == '\n') {
+ lineIndex = 1;
+ file.get();
+ std::cout << std::endl;
+ continue;
+ }
+
+ if (m <= lineIndex && lineIndex <= n) {
+ std::cout << (char)file.peek();
+ }
+
+ lineIndex++;
+ file.get();
+ }
+ std::cout << std::endl;
+
+ file.close();
+}
diff --git a/week06/Exercise08.cpp b/week06/Exercise08.cpp
new file mode 100644
index 0000000..bcd4339
--- /dev/null
+++ b/week06/Exercise08.cpp
@@ -0,0 +1,53 @@
+#include <fstream>
+
+struct FileBuffer {
+private:
+ char* data;
+ size_t size;
+
+ void free() {
+ delete[] data;
+ }
+ void copyFrom(const FileBuffer& other) {
+ this->size = other.size;
+ this->data = new char[size];
+ for (int i = 0; i < size; i++) {
+ this->data[i] = other.data[i];
+ }
+ }
+
+public:
+ FileBuffer(const char* fileName) {
+ std::ifstream file(fileName);
+ if (!file.is_open()) {
+ throw "Couldn't open file!";
+ }
+
+ file.seekg(0, std::ios::end);
+ size = file.tellg();
+ data = new char[size];
+
+ file.seekg(0, std::ios::beg);
+ file.read(data, size);
+
+ file.close();
+ }
+
+ FileBuffer() {
+ data = nullptr;
+ size = 0;
+ }
+ ~FileBuffer() {
+ free();
+ }
+ FileBuffer(const FileBuffer& other) {
+ copyFrom(other);
+ }
+ FileBuffer& operator=(const FileBuffer& other) {
+ if (this != &other) {
+ free();
+ copyFrom(other);
+ }
+ return *this;
+ }
+};
diff --git a/week06/Exercise09.cpp b/week06/Exercise09.cpp
new file mode 100644
index 0000000..97a9c27
--- /dev/null
+++ b/week06/Exercise09.cpp
@@ -0,0 +1,55 @@
+#include <cstring>
+#include <fstream>
+#include <iostream>
+
+struct Person {
+private:
+ char name[1024];
+ unsigned age;
+
+public:
+ Person(const char name[1024], unsigned age) {
+ strcpy(this->name, name);
+ this->age = age;
+ }
+
+ const char* GetName() {
+ return name;
+ }
+ unsigned GetAge() {
+ return age;
+ }
+
+ void Save(const char* fileName) {
+ std::ofstream outFile(fileName, std::ios::binary);
+ if (!outFile.is_open()) {
+ std::cout << "Couldn't open file!" << std::endl;
+ return;
+ }
+
+ outFile.write((const char*)&age, sizeof(age));
+ outFile.write((const char*)&name, sizeof(name));
+ outFile.close();
+ }
+
+ void Load(const char* fileName) {
+ std::ifstream inFile(fileName, std::ios::binary);
+ if (!inFile.is_open()) {
+ std::cout << "Couldn't open file!" << std::endl;
+ return;
+ }
+
+ inFile.read((char*)&age, sizeof(age));
+ inFile.read((char*)&name, sizeof(name));
+ }
+};
+
+int main() {
+ Person p1("Jordan", 22);
+ p1.Save("ex9.dat");
+
+ Person p2("Michael", 89);
+ p2.Load("ex9.dat");
+
+ std::cout << p2.GetName() << " " << p2.GetAge() << std::endl;
+}
diff --git a/week06/README.md b/week06/README.md
new file mode 100644
index 0000000..3675b0e
--- /dev/null
+++ b/week06/README.md
@@ -0,0 +1,84 @@
+# Задачи - ООП, Седмица 6, 28.03.2024
+
+*Този файл е копие на задачите от: [syndamia.com/teaching/oop-2023/week6](https://syndamia.com/teaching/oop-2023/week6)*
+
+&:warn В задачите за файлове имплементирайте всички нужни проверки и затваряния
+
+## Преговорни
+
+### 1 задача - Копиращ конструктор и оператор=
+
+Имплементирайте структура `WoodenPlank`, която скрито запазва ширина, дължина и височина на дъската (целочислено), цената ѝ (число с плаваща запетая) и типа дърво (низ с максимум 1024 знака).
+
+Имплементирайте get-ъри, set-ъри, копиращ конструктор, оператор=
+
+### 2 задача - Голяма четворка
+
+Имплементирайте структура `DynamicString`, която скрито запазва указател към низ (в динамичната памет) и неговия размер.
+
+Имплементирайте голяма четворка.
+
+## Лесни задачи
+
+### 3 задача
+
+Имплементирайте програма, която отваря файл (създава го, ако вече не е създаден) и вкарва текста "Hello World!" във файла.
+Името на файла се подава от стандартния вход на един ред.
+
+### 4 задача
+
+Имплементирайте програма, която приема име на файл от стандартния вход.
+Изкарайте последния ред от файла.
+
+Редовете са разделени със знака `\n`.
+
+### 5 задача
+
+Имплементирайте програма, която приема име на файл от стандартния вход.
+Изкарайте броя редове и броя думи във файла.
+
+### 6 задача
+
+От стандартния вход получавате, на два отделни реда, две имена на файлове.
+Вмъкнете съдържанието на втория файл по средата на първия файл.
+
+### 7 задача
+
+От стандартния вход получавате числата m и n, както и името на файл (на свой си ред).
+Изкарайте на екрана от m-тата до n-тата буква (включително) от всеки ред във файла.
+Първата буква на един ред е на индекс 1.
+
+### 8 задача
+
+Имплементирайте структура `FileBuffer`, която в конструктора си приема име на файл, отваря го и запазва (копира) цялото му съдържание в динамичната памет (с указател член-данна).
+
+&:question Кога трябва да затворим файла?
+
+Имплементирайте голяма четворка.
+
+### 9 задача
+
+Имплементирайте структура `Person`, която приема име на човек (низ с максимална дължина от 1024 знака) и неговата възраст (целочислена стойност).
+Имплементирайте методи `Save` и `Load`, които съответно запазват/прочитат данните в (двоичен) файл с подадено име.
+
+## Трудни задачи
+
+### 10 задача
+
+Имплементирайте структура `Table`, която запазва произволен брой колони и редове с низови стойности.
+Броя редове/колони може да се уразмерява по време на изпълнение.
+Имплементирайте голяма четворка.
+
+Имплементирайте методи `AddRow` и `AddColumn`, които вмъкват подадените стойности като нов ред/колона на дадения индекс.
+Аналогично имплементирайте методи `RemoveRow` и `RemoveColumn`.
+**Чрез всички тези** имплементирайте метода `ModifyValue`, който променя стойността на клетката на дадените индекси.
+
+Имплементирайте методи `Save` и `Load`, които запазват/зреждат таблицата в/от файл с подадено име, в текстовия CSV формат (всеки ред в таблицата е ред във файла, всички стойности в реда от таблицата са разделени със запетая в реда във файла).
+
+### 11 задача
+
+Имплементирайте структура `City`, която запазва името на даден град (низ с максимална дължина от 1024 знака) и масив от указатели към други градове, които са негови съседи.
+Имплементирайте методи `AddNeighbour` и `RemoveNeighbour` (броя съседи може да се променя), както и голяма четворка.
+
+Имплементирайте методи `Save` и `Load`, които запазват/зреждат всичките достижими градове от сегашния в/от (бинарен) файл с подадено име.
+Подсказвам, че не можете да запазите указателите ей-така.