diff --git a/Streams and STL/Data.h b/Streams and STL/Data.h index e9526ee35cbf42c6fdb5db9ffa780d81d597e158..68c6490aadd19469c35c6836db407b03b15733f6 100644 --- a/Streams and STL/Data.h +++ b/Streams and STL/Data.h @@ -4,28 +4,32 @@ #include #include #include +#include void createData(const std::string&); void createDataContainer(const std::string&); -template +template class Data { private: - std::vector cont; //!!! По заданию работать нужно с произвольными типами последовательных контейнеров. - //!!! Поэтому класс должен быть параметризован типом контейнера. (НЕ ИСПРАВЛЕНО) + Container cont; //!!! По заданию работать нужно с произвольными типами последовательных контейнеров. + //!!! Поэтому класс должен быть параметризован типом контейнера. (исправлено) //!!! КЛАСС ДОЛЖЕН БЫТЬ ПАРАМЕТРИЗОВАН ТИПОМ КОНТЕЙНЕРА, А НЕ ТИПОМ ЭЛЕМЕНТА КОНТЕЙНЕРА. //!!! Внутри любого контейнера есть value_type + + using Type = Container::value_type; + public: Data() : cont() {} Data(int size) : cont(size) {} - std::vector loadData(const std::string& filepath) { + Container loadData(const std::string& filepath) { std::ifstream file(filepath); if (!file) throw FileException(1); - T a; + Type a; while (!file.eof()) { file >> a; cont.push_back(a); @@ -33,20 +37,20 @@ public: return cont; } - std::vector streamloadData(const std::string& filepath) { + Container streamloadData(const std::string& filepath) { std::ifstream file(filepath); - std::copy(std::istream_iterator(file), std::istream_iterator(), std::back_inserter(cont)); + std::copy(std::istream_iterator(file), std::istream_iterator(), std::back_inserter(cont)); return cont; } void modify() { int count = 0; - T S = T(); + Type S = Type(); for (auto i = cont.begin(); i != cont.end(); ++i) S += *i; - T m = S / cont.size(); + Type m = S / cont.size(); for (auto i = cont.begin(); i != cont.end(); ++i) { if (*i > 0) { ++count; @@ -58,16 +62,16 @@ public: } } - static void modify_iterator(std::vector::iterator a, std::vector::iterator b) { + static void modify_iterator(Container::iterator a, Container::iterator b) { int count = 0; - T S = T(); + Type S = Type(); for (auto i = a; i != b; ++i) { S += *i; ++count; } - T m = S / count; + Type m = S / count; count = 0; for (auto i = a; i != b; ++i) { if (*i > 0) { @@ -85,15 +89,15 @@ public: } void modify_for_each() { - T S = T(); + Type S = Type(); for (auto i = cont.begin(); i != cont.end(); ++i) S += *i; - T m = S / cont.size(); + Type m = S / cont.size(); - std::for_each(cont.begin(), cont.end(), - [m](T& x) { + std::for_each(cont.begin(), cont.end(), + [m](Type& x) { static int count = 0; if (x > 0) { ++count; @@ -102,7 +106,7 @@ public: x = m; } } - }; + } ); } @@ -118,6 +122,6 @@ public: std::ofstream file(filepath); if (!file) throw FileException(1); - std::copy(cont.begin(), cont.end(), std::ostream_iterator(file, " ")); + std::copy(cont.begin(), cont.end(), std::ostream_iterator(file, " ")); } }; \ No newline at end of file diff --git a/Streams and STL/Main.cpp b/Streams and STL/Main.cpp index 4b43ea450f39f259ef2e9558b60e624dbe80e3e9..316408aeb1157fa2bf7b54de9909e8843e111275 100644 --- a/Streams and STL/Main.cpp +++ b/Streams and STL/Main.cpp @@ -11,11 +11,12 @@ void first_test() { std::cout << "10: clear screen\n11: exit" << std::endl; int code; std::cin >> code; - Data d; - auto print = [](std::vector cont) { //!!! Копирование вектора + Data> d; + auto print = [](const std::vector& cont) { //!!! Копирование вектора (исправлено) for (auto i = cont.begin(); i != cont.end(); ++i) { std::cout << *i << " "; } + std::cout << std::endl; }; try { switch (code) { @@ -61,7 +62,7 @@ void second_test() { case 2: data.add(file_write); break; case 3: data.delete_data(file2_write, file_read); break; case 4: data.replacement(file2_write, file_read, data); break; - case 5: TravelCompany::convert_to_txt(file3_write, file2_read); break; //!!! Это вообще не понятно, что такое. Смена расширения не делает файл бинарным. (исправлено) + case 5: TravelCompany::convert_to_txt(file3_write, file_read); break; //!!! Это вообще не понятно, что такое. Смена расширения не делает файл бинарным. (исправлено) case 6: system("cls"); break; case 7: b = false; break; default: std::cout << "Entered code is wrong!" << std::endl; diff --git a/Streams and STL/Streams and STL.vcxproj b/Streams and STL/Streams and STL.vcxproj index ac8f9b1b812afc0a420fcac0bb11364b4ef41fdc..92a9ced7acb61856357af02759c1bcb1481765cb 100644 --- a/Streams and STL/Streams and STL.vcxproj +++ b/Streams and STL/Streams and STL.vcxproj @@ -116,6 +116,7 @@ true _DEBUG;_CONSOLE;%(PreprocessorDefinitions) true + stdcpplatest Console diff --git a/Streams and STL/TravelCompany.cpp b/Streams and STL/TravelCompany.cpp index c73f8a1694f040354659ca400689209838b3cb5c..a20a08e8d68e8a2910ca0294bb9e7b72015819e5 100644 --- a/Streams and STL/TravelCompany.cpp +++ b/Streams and STL/TravelCompany.cpp @@ -2,14 +2,14 @@ std::ostream& operator << (std::ostream& out, const TravelCompany& data) { for (auto i = data.cont.begin(); i != data.cont.end(); ++i) { - out << std::endl << std::setw(13) << i->tour_name << "|" << - std::setw(11) << i->surname << "|" << - std::setw(9) << i->price << "|" << - std::setw(8) << i->days << "|" << - std::setw(15) << i->moving_cost << "|" << - std::setw(17) << i->exchange_rate << "|" << - std::setw(10) << i->amount << "|" << - std::setw(15) << i->travel_cost << "|" << std::endl; + out << std::endl << std::setw(14) << i->tour_name << std::setw(6) << "|" << + std::setw(12) << i->surname << std::setw(6) << "|" << + std::setw(8) << i->price << std::setw(8) << "|" << + std::setw(8) << i->days << std::setw(7) << "|" << + std::setw(12) << i->moving_cost << std::setw(10) << "|" << + std::setw(14) << i->exchange_rate << std::setw(10) << "|" << + std::setw(9) << i->amount << std::setw(8) << "|" << + std::setw(12) << i->travel_cost << std::setw(10) << "|" << std::endl; } return out; } @@ -56,7 +56,7 @@ bool TravelCompany::operator == (const TravelCompany& data) { void TravelCompany::add(std::ofstream& file) { for (auto i = cont.begin(); i != cont.end(); ++i) { - file.write(reinterpret_cast(&*i), sizeof(*i)); //!!! Лучше sizeof(Data) + file.write(reinterpret_cast(&*i), sizeof(Data)); //!!! Лучше sizeof(Data) (исправлено) } //file << *this; } @@ -66,7 +66,7 @@ void TravelCompany::read(std::ifstream& file) { TravelCompany::Data d; file.read(reinterpret_cast(&d), sizeof(d)); - this->cont.insert(d); //!!! Не нужно писать this там, где он не нужен. + cont.insert(d); //!!! Не нужно писать this там, где он не нужен. (исправлено) } // file >> *this; } @@ -77,6 +77,7 @@ void TravelCompany::create_file(std::ofstream& file) { data.add(file); } + void TravelCompany::delete_data(std::ofstream& file_write, std::ifstream& file_read) { TravelCompany data; data.read(file_read); @@ -98,11 +99,16 @@ void TravelCompany::replacement(std::ofstream& file_write, std::ifstream& file_r void TravelCompany::convert_to_txt(std::ofstream& file_write, std::ifstream& file_read) { - //!!! Шапку нужно не руками пасать, а программно форматировать и выравнивать текст по центру + //!!! Шапку нужно не руками пасать, а программно форматировать и выравнивать текст по центру (исправлено) - file_write << "Tour name |" << "Surname |" << "Price |" - << "Days |" << "Moving cost |" << "Exchange rate |" - << "Amount |" << "Travel cost |"; + file_write << std::setw(14) << "Tour name" << std::setw(6) << "|" << + std::setw(12) << "Surname" << std::setw(6) << "|" << + std::setw(10) << "Price" << std::setw(6) << "|" << + std::setw(9) << "Days" << std::setw(6) << "|" << + std::setw(16) << "Moving cost" << std::setw(6) << "|" << + std::setw(18) << "Exchange rate" << std::setw(6) << "|" << + std::setw(11) << "Amount" << std::setw(6) << "|" << + std::setw(16) << "Travel cost" << std::setw(6) << "|"; while (!file_read.eof()) { TravelCompany data; diff --git a/Streams and STL/TravelCompany.h b/Streams and STL/TravelCompany.h index 36f786005d566139350b6fdde7e5411d1e6a9557..33a346f67f2d9f4eac5ca544b7e651ada80b3aa3 100644 --- a/Streams and STL/TravelCompany.h +++ b/Streams and STL/TravelCompany.h @@ -17,15 +17,15 @@ private: int amount; int travel_cost; - //!!! Среди полей есть массивы. Где конструктор копирования и оператор присваивания? + //!!! Среди полей есть массивы. Где конструктор копирования и оператор присваивания? (исправлено) Data() : - price(0.0f), + price(0), days(0), - moving_cost(0.0f), - exchange_rate(0.0f), - amount(0.0f), - travel_cost(0.0f) + moving_cost(0), + exchange_rate(0), + amount(0), + travel_cost(0) { tour_name[0] = '\0'; surname[0] = '\0'; @@ -55,12 +55,65 @@ private: surname[std::min(strlen(sname), size_t(127))] = '\0'; } + Data(const Data& data) { + for (int i = 0; i < 128; ++i) { + if (i < strlen(data.tour_name)) + tour_name[i] = data.tour_name[i]; + else { + tour_name[i] = '\0'; + break; + } + } + + for (int i = 0; i < 128; ++i) { + if (i < strlen(data.surname)) + surname[i] = data.surname[i]; + else { + surname[i] = '\0'; + break; + } + } + + price = data.price; + days = data.days; + moving_cost = data.moving_cost; + exchange_rate = data.exchange_rate; + amount = data.amount; + travel_cost = data.travel_cost; + } + + Data& operator = (const Data& data) { + for (int i = 0; i < 128; ++i) { + if (i < strlen(data.tour_name)) + tour_name[i] = data.tour_name[i]; + else { + tour_name[i] = '\0'; + break; + } + } + + for (int i = 0; i < 128; ++i) { + if (i < strlen(data.surname)) + surname[i] = data.surname[i]; + else { + surname[i] = '\0'; + break; + } + } + + price = data.price; + days = data.days; + moving_cost = data.moving_cost; + exchange_rate = data.exchange_rate; + amount = data.amount; + travel_cost = data.travel_cost; + } bool operator == (const Data& data) { //!!! Убрать лишние this (исправлено) - return (tour_name == data.tour_name && - surname == data.surname && + return (std::strcmp(tour_name, data.tour_name) == 0 && + std::strcmp(surname, data.surname) == 0 && price == data.price && days == data.days && moving_cost == data.moving_cost && @@ -87,7 +140,6 @@ private: }; std::multiset cont; - public: TravelCompany() : cont(std::multiset()) {}