diff options
1 files changed, 247 insertions, 1 deletions
| -rw-r--r-- | pract SI/week3/solution.cpp | 248 |
diff --git a/pract SI/week3/solution.cpp b/pract SI/week3/solution.cpp index e17a56a..e61ea78 100644 --- a/pract SI/week3/solution.cpp +++ b/pract SI/week3/solution.cpp @@ -1 +1,247 @@ -👀👀👀 +#include<iostream> +#include<fstream> +#include<cstring> + +// Fix problems with strcpy in visual studio +#pragma warning (disable : 4996) + +const int MAX_LENGTH = 25; +const char FILE_PATH[] = "offers-database.txt"; + +// Clear std::cin +void flushStream() { + std::cin.clear(); + std::cin.ignore(255, '\n'); +} + +struct jobOffer { + char name[MAX_LENGTH]; + int peopleCount; + int restDaysCount; + long long salary; +}; + +jobOffer createOffer(char name[MAX_LENGTH], int colCount, int restDays, long long salary) { + jobOffer toReturn; + strcpy(toReturn.name, name); + toReturn.peopleCount = colCount; + toReturn.restDaysCount = restDays; + toReturn.salary = salary; + + return toReturn; +} + +// Read offer from stdin +jobOffer readOffer() { + std::cout << "Enter company name [max " << MAX_LENGTH << " symbols!]: "; + char name[MAX_LENGTH]; + int colCount = 0; + int restDays = 0; + long long salary = 0; + + std::cin.getline(name, MAX_LENGTH, '\n'); + + std::cout << "Add colleague count: "; + + std::cin >> colCount; + std::cout << "Add rest days: "; + std::cin >> restDays; + std::cout << "Add salary: "; + std::cin >> salary; + + flushStream(); + return createOffer(name, colCount, restDays, salary); +} + +void saveOfferToFile(std::ofstream& outFile, const jobOffer& offer) { + /*int size = strlen(offer.name); + outFile.write((const char*)&size, sizeof(int)); + + outFile.write(offer.name, size * sizeof(char)); + + outFile.write((const char*)(&offer.peopleCount), sizeof(offer.peopleCount)); + + outFile.write((const char*)(&offer.restDaysCount), sizeof(offer.restDaysCount)); + + outFile.write((const char*)(&offer.salary), sizeof(offer.salary));*/ + outFile.write((const char*)&offer, sizeof(offer)); +} + +void drawLine(int length) { + for (int i = 0; i < length + 13; i++) + std::cout << '-'; + std::cout << std::endl; +} + +void printOffer(const jobOffer& j) { + int nameLen = strlen(j.name); + drawLine(nameLen); + std::cout << "Company name: " << j.name << + "\nPeople in team: " << j.peopleCount << + "\nRest days: " << j.restDaysCount << + "\nSalary: " << j.salary << std::endl; + drawLine(nameLen); + std::cout << std::endl; +} + +void readOffer(std::ifstream& inFile, jobOffer& toRead) { + /*int length = 0; + inFile.read((char*)&length, sizeof(length)); + inFile.read(toRead.name, length); + toRead.name[length] = '\0'; + + inFile.read((char*)&toRead.peopleCount, sizeof(toRead.peopleCount)); + inFile.read((char*)&toRead.restDaysCount, sizeof(toRead.restDaysCount)); + inFile.read((char*)&toRead.salary, sizeof(toRead.salary));*/ + inFile.read((char*)&toRead, sizeof(toRead)); +} + +void addOffers(const char* filePath, int n) { + std::ofstream outFile(filePath, std::ios::binary | std::ios::app); + + if (!outFile) { + std::cerr << "Problem with oppening file " << filePath; + return; + } + + for (int i = 0; i < n; i++) { + jobOffer toWrite = readOffer(); + saveOfferToFile(outFile, toWrite); + } + + outFile.close(); +} + +void filterOffers(const char* filePath, long long minSalary) { + std::ifstream inFile(filePath, std::ios::binary); + + if (!inFile) { + std::cerr << "Error"; + return; + } + + // Same as !inFile.eof() + while (inFile) { + jobOffer toRead; + readOffer(inFile, toRead); + if (!inFile) + break; + if (toRead.salary >= minSalary) + printOffer(toRead); + } + + inFile.close(); +} + +bool searchOffer(const char* filePath, const char* name) { + std::ifstream inFile(filePath, std::ios::binary); + + if (!inFile) { + std::cerr << "Error"; + return false; + } + + while (inFile) { + jobOffer toRead; + readOffer(inFile, toRead); + if (!inFile) + break; + if (!strcmp(toRead.name, name)) { + inFile.close(); + return true; + } + } + + inFile.close(); + return false; +} + +bool isPerfect(const jobOffer& j, int maxCoworkers, int minVacancyDays, int minSalary) { + return j.peopleCount <= maxCoworkers && j.restDaysCount >= minVacancyDays && j.salary >= minSalary; +} + +void saveOfferToTextFile(std::ofstream& outFile, const jobOffer& j) { + outFile << j.name << " " << j.peopleCount << " " << j.restDaysCount << " " << j.salary << std::endl; +} + +void perfectOffer(const char* filePath, int maxCoworkers, int minVacancyDays, int minSalary) { + std::ifstream inFile(filePath, std::ios::binary); + std::ofstream outFile("perfect.txt", std::ios::app); + + if (!inFile) { + std::cerr << "Error"; + return; + } + + while (inFile) { + jobOffer toRead; + readOffer(inFile, toRead); + if (!inFile) + break; + if (isPerfect(toRead, maxCoworkers, minVacancyDays, minSalary)) + saveOfferToTextFile(outFile, toRead); + } + + inFile.close(); +} + +void printAll(const char* filePath) { + std::ifstream inFile(filePath, std::ios::binary); + + if (!inFile) { + std::cerr << "Error"; + return; + } + + // eq to !inFile.eof() + while (inFile) { + jobOffer toRead; + readOffer(inFile, toRead); + if (!inFile) + break; + printOffer(toRead); + } + + inFile.close(); +} + +void runSystem(const char* filePath = FILE_PATH) { + bool running = true; + while (running) { + char c; + std::cin.get(c); + + switch (c) { + case 'a': + flushStream(); + addOffers(filePath, 1); + break; + case 'f': + long long salary; + std::cin >> salary; + filterOffers(filePath, salary); + break; + case 's': + flushStream(); + char name[MAX_LENGTH]; + std::cin.getline(name, MAX_LENGTH, '\n'); + if (searchOffer(filePath, name)) + std::cout << "Offer exist\n"; + else + std::cout << "No such offer\n"; + break; + case 'q': + running = false; + break; + case 'i': + printAll(filePath); + break; + default: + break; + } + } +} + +int main() { + runSystem(); +} |
