From 44d085f265583f0e3cbef294bbe2c8e300aaa452 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Wed, 3 Apr 2024 17:47:07 +0300 Subject: [w6] Added exercise descriptions and solutions to 1-9 --- week06/Exercise01.cpp | 64 +++++++++++++++++++++++++++++++++++++++ week06/Exercise02.cpp | 35 +++++++++++++++++++++ week06/Exercise03.cpp | 16 ++++++++++ week06/Exercise04.cpp | 69 ++++++++++++++++++++++++++++++++++++++++++ week06/Exercise05.cpp | 31 +++++++++++++++++++ week06/Exercise06.cpp | 42 ++++++++++++++++++++++++++ week06/Exercise07.cpp | 37 +++++++++++++++++++++++ week06/Exercise08.cpp | 53 ++++++++++++++++++++++++++++++++ week06/Exercise09.cpp | 55 +++++++++++++++++++++++++++++++++ week06/README.md | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 486 insertions(+) create mode 100644 week06/Exercise01.cpp create mode 100644 week06/Exercise02.cpp create mode 100644 week06/Exercise03.cpp create mode 100644 week06/Exercise04.cpp create mode 100644 week06/Exercise05.cpp create mode 100644 week06/Exercise06.cpp create mode 100644 week06/Exercise07.cpp create mode 100644 week06/Exercise08.cpp create mode 100644 week06/Exercise09.cpp create mode 100644 week06/README.md (limited to 'week06') 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 + +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 + +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 +#include + +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 +#include + +// Отивайки в края и тръгвайки към началото +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 +#include + +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 +#include + +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 +#include + +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 + +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 +#include +#include + +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`, които запазват/зреждат всичките достижими градове от сегашния в/от (бинарен) файл с подадено име. +Подсказвам, че не можете да запазите указателите ей-така. -- cgit v1.2.3