Advertisement
Argerd14

T&MP Lb_6 v 0.9

May 28th, 2017
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 42.58 KB | None | 0 0
  1. Notebook.h
  2.  
  3. #pragma once
  4. #include "Stationery.h"
  5. #include <vector>
  6.  
  7. class Notebook :
  8.     public Stationery {
  9. private:
  10.     int number;
  11.     int countSheets;
  12.     string type;
  13.     double price;
  14.    
  15. public:
  16.     int getNumber();
  17.     int getCountSheets();
  18.     string getType();
  19.     double getPrice();
  20.  
  21.     // Метод, выводящий данные о тетрадях на экран
  22.     void outputData(vector<Notebook*> vec);
  23.  
  24.     // Метод, реализующий ввод данных о тетрадях с клавиатуры
  25.     void addData(vector<Notebook*> &vec);
  26.  
  27.     // Метод, реализующий удаление элемента из массива данных
  28.     void deleteElement(unsigned int num, vector<Notebook*> &vec);
  29.  
  30.     // Метод, реализующий сортировку данных в массиве
  31.     void sorting(vector<Notebook*> &vec);
  32.  
  33.     // Метод, реализующий поиск и редактирование записей
  34.     void searchAndRedaction(vector<Notebook*> vec);
  35.  
  36.     // Метод, реализующий редактирование записей (используется в методе searchAndRedaction)
  37.     void redaction(vector<Notebook*> &vec, int i);
  38.  
  39.     // Метод, записывающий данные в бинарный файл
  40.     void saveInBinaryFile(vector<Notebook*> vec);
  41.  
  42.     // Метод, записывающий данные из бинарного файла в массив
  43.     void loadFromBinaryFileInVector(vector<string> &vec);
  44.  
  45.     // Метод, релизующий меню
  46.     void menu();
  47. };
  48.  
  49. Notebook.cpp
  50.  
  51. #include "stdafx.h"
  52. #include "Notebook.h"
  53. #include <algorithm>
  54.  
  55. vector<Notebook*> arrNotebooks;
  56. vector<string> arrStrNotebooks;
  57.  
  58. // Метод, выводящий данные о тетрадях на экран
  59. void Notebook::outputData(vector<Notebook*> vec) {
  60.     if (!vec.empty()) {
  61.         for (vector<Notebook*>::iterator it = vec.begin(); it != vec.end(); ++it) {
  62.             cout << (*it)->number << ")" << (*it)->countSheets << " - " << (*it)->type
  63.                 << " - " << (*it)->price << endl;
  64.         }
  65.     } else {
  66.         cout << "Данные не были занесены в оперативную память компьютера!" << endl;
  67.     }
  68. }
  69.  
  70. // Метод, реализующий ввод данных о тетрадях с клавиатуры
  71. void Notebook::addData(vector<Notebook*> &vec) {
  72.     int choice;
  73.     do {
  74.         cout << "Если данные были записаны ранее, то новые записи будут добавлены в конец массива!" << endl;
  75.         cout << "Введите запись о канцелярских товарах!";
  76.         Notebook ntbk;
  77.         cin.get();
  78.         ntbk.number = vec.size() + 1;
  79.         cout << endl << "Введите цвет для " << vec.size() + 1 << " карандаша:";
  80.         cin >> ntbk.countSheets;
  81.         cout << endl << "Введите тип для " << vec.size() + 1 << " карандаша: ";
  82.         getline(cin, ntbk.type);
  83.         cout << endl << "Введите цену " << vec.size() + 1 << " канцелярского товара:" << endl;
  84.         cin >> ntbk.price;
  85.         vec.push_back(new Notebook(ntbk));
  86.  
  87.         cout << endl << "Хотите ввести еще одну запись? 1 - да, любое другое число - нет." << endl;
  88.         cin >> choice;
  89.         cout << endl;
  90.     } while (choice == 1);
  91. }
  92.  
  93. // Метод, реализующий удаление элемента из массива данных
  94. void Notebook::deleteElement(unsigned int num, vector<Notebook*> &vec) {
  95.     num--;
  96.     if (num > vec.size()) {
  97.         cout << "Такой записи не существует!" << endl;
  98.     } else {
  99.         vec.erase(vec.begin() + num);
  100.         cout << "Запись удалена." << endl;
  101.     }
  102. }
  103.  
  104. int Notebook::getNumber() {
  105.     return number;
  106. }
  107.  
  108. int Notebook::getCountSheets() {
  109.     return countSheets;
  110. }
  111.  
  112. string Notebook::getType() {
  113.     return type;
  114. }
  115.  
  116. double Notebook::getPrice() {
  117.     return price;
  118. }
  119.  
  120. struct NumberCmp {
  121.     bool operator() (Notebook *a, Notebook *b) const {
  122.         return a->getNumber() < b->getNumber();
  123.     }
  124. };
  125.  
  126. struct CountSheetsCmp {
  127.     bool operator() (Notebook *a, Notebook *b) const {
  128.         return a->getCountSheets() < b->getCountSheets();
  129.     }
  130. };
  131.  
  132. struct TypeCmp {
  133.     bool operator() (Notebook *a, Notebook *b) const {
  134.         return a->getType() < b->getType();
  135.     }
  136. };
  137.  
  138. struct PriceCmp {
  139.     bool operator() (Notebook *a, Notebook *b) const {
  140.         return a->getPrice() < b->getPrice();
  141.     }
  142. };
  143.  
  144. // Метод, реализующий сортировку данных в массиве
  145. void Notebook::sorting(vector<Notebook*> &vec) {
  146.     cout << endl << "Выберите действие: " << endl << "1 - сортировка по цене" << endl << "2 - по номеру (в порядке записи)" <<
  147.         endl << "3 - по количеству страниц" << endl << "4 - по типу" << endl;
  148.     int srt; cin >> srt;
  149.     switch (srt) {
  150.         case 1:
  151.             cout << "Сортировка по цене" << endl;
  152.             sort(vec.begin(), vec.end(), PriceCmp());
  153.             break;
  154.         case 2:
  155.             cout << "Сортировка по номеру (по порядку записи)" << endl;
  156.             sort(vec.begin(), vec.end(), NumberCmp());
  157.             break;
  158.         case 3:
  159.             cout << "Сортировка по цвету" << endl;
  160.             sort(vec.begin(), vec.end(), CountSheetsCmp());
  161.             break;
  162.         case 4:
  163.             cout << "Сортировка по типу" << endl;
  164.             sort(vec.begin(), vec.end(), TypeCmp());
  165.             break;
  166.     }
  167. }
  168.  
  169. // Метод, реализующий поиск и редактирование записей
  170. void Notebook::searchAndRedaction(vector<Notebook*> vec) {
  171.     cout << endl << "Сейчас Вы можете найти запись и её oтредактировать." << endl;
  172.     cout << "По какому полю структуры Вы будете искать запись:" << endl << "1 - номер записи" << endl <<
  173.         "2 - количество страниц" << endl << "3 - цена" << endl << "4 - тип тетради" << endl << endl;;
  174.  
  175.     bool result = false;
  176.     int choice; cin >> choice;
  177.     switch (choice) {
  178.         case 1:
  179.             cout << endl << "Введите номер записи:";
  180.             int key; cin >> key;
  181.             for (int i = 0; i < vec.size(); i++) {
  182.                 if (vec[i]->number == key) {
  183.                     result = true;
  184.                     cout << "Найденная Вами запись: " << endl;
  185.                     cout << vec[i]->number << ") " << vec[i]->countSheets << " - " << vec[i]->type << " - " << vec[i]->price << endl;
  186.                     cout << "Вы хотите редактировать эту запись (номер записи редактироваться не будет)"
  187.                         << endl << "1 - да " << endl << "любое другое (целое) число - нет" << endl;
  188.                     int red; cin >> red;
  189.                     if (red == 1) {
  190.                         redaction(arrNotebooks, i);
  191.                     }
  192.                     break;
  193.                 }
  194.             }
  195.             if (result == false) {
  196.                 cout << "Запись не найдена!" << endl;
  197.             }
  198.             break;
  199.  
  200.         case 2: {
  201.             cout << endl << "Введите цвет карандаша:";
  202.             int cKey; cin >> cKey;
  203.             for (int i = 0; i < vec.size(); i++) {
  204.                 if (vec[i]->countSheets == cKey) {
  205.                     result = true;
  206.                     cout << "Найденная Вами запись: " << endl;
  207.                     cout << vec[i]->number << ") " << vec[i]->countSheets << " - " << vec[i]->type << " - " << vec[i]->price << endl;
  208.                     cout << "Вы хотите редактировать эту запись (номер записи редактироваться не будет)"
  209.                         << endl << "1 - да " << endl << "любое другое (целое) число - нет" << endl;
  210.                     int red; cin >> red;
  211.                     if (red == 1) {
  212.                         redaction(arrNotebooks, i);
  213.                     }
  214.                     break;
  215.                 }
  216.             }
  217.             if (result == false) {
  218.                 cout << "Запись не найдена!" << endl;
  219.             }
  220.             break;
  221.         }
  222.  
  223.         case 3:
  224.             cout << endl << "Введите цену:";
  225.             double priceKey; cin >> priceKey;
  226.             for (int i = 0; i < vec.size(); i++) {
  227.                 if (vec[i]->price == priceKey) {
  228.                     result = true;
  229.                     cout << "Найденная Вами запись: " << endl;
  230.                     cout << vec[i]->number << ") " << vec[i]->countSheets << " - " << vec[i]->type << " - " << vec[i]->price << endl;
  231.                     cout << "Вы хотите редактировать эту запись (номер записи редактироваться не будет)"
  232.                         << endl << "1 - да " << endl << "любое другое (целое) число - нет" << endl;
  233.                     int red; cin >> red;
  234.                     if (red == 1) {
  235.                         redaction(arrNotebooks, i);
  236.                     }
  237.                     break;
  238.                 }
  239.             }
  240.             if (result == false) {
  241.                 cout << "Запись не найдена!" << endl;
  242.             }
  243.             break;
  244.  
  245.         case 4: {
  246.             cout << endl << "Введите тип карандаша:";
  247.             string typeKey; cin >> typeKey;
  248.             for (int i = 0; i < vec.size(); i++) {
  249.                 if (vec[i]->type == typeKey) {
  250.                     result == true;
  251.                     cout << "Найденная Вами запись: " << endl;
  252.                     cout << vec[i]->number << ") " << vec[i]->countSheets << " - " << vec[i]->type << " - " << vec[i]->price << endl;
  253.                     cout << "Вы хотите редактировать эту запись (номер записи редактироваться не будет)"
  254.                         << endl << "1 - да " << endl << "любое другое (целое) число - нет" << endl;
  255.                     int red; cin >> red;
  256.                     if (red == 1) {
  257.                         redaction(arrNotebooks, i);
  258.                     }
  259.                     break;
  260.                 }
  261.             }
  262.             if (result == false) {
  263.                 cout << endl << "Запись не найдена!" << endl;
  264.             }
  265.         }
  266.     }
  267. }
  268.  
  269. // Метод, реализующий редактирование записей (используется в методе searchAndRedaction)
  270. void Notebook::redaction(vector<Notebook*> &vec, int i) {
  271.     cin.get();
  272.     cout << endl << "Введите количество страниц:";
  273.     cin >> vec[i]->countSheets;
  274.     cout << endl << "Введите тип карандаша:";
  275.     getline(cin, vec[i]->type);
  276.     cout << endl << "Введите цену канцелярского товара:" << endl;
  277.     cin >> vec[i]->price;
  278.     cout << "Ваша запись после редактирования:" << endl;
  279.     cout << vec[i]->number << ") " << vec[i]->countSheets << " - " << vec[i]->type << " - " << vec[i]->price << endl;
  280. }
  281.  
  282. // Метод, записывающий данные в бинарный файл
  283. void Notebook::saveInBinaryFile(vector<Notebook*> vec) {
  284.     cout << endl;
  285.     fstream fout;
  286.     fout.open("NotebookBinary.txt", ios::out | ios::binary);
  287.     if (fout.is_open()) {
  288.         for (int i = 0; i < vec.size(); i++) {
  289.             fout << vec[i]->number << " | ";
  290.             fout << vec[i]->countSheets << " | ";
  291.             fout << vec[i]->type << " | ";
  292.             fout << vec[i]->price << endl;
  293.         }
  294.         fout.close();
  295.  
  296.         // Проверяем, была ли произведена запись в файл
  297.         fout.open("NotebookBinary.txt", ios::in | ios::ate);
  298.         if (fout.is_open()) {
  299.             if (fout.tellg() > 0) {
  300.                 cout << "Запись в файл была успешно проведена!" << endl;
  301.             } else {
  302.                 cout << "Запись в файл не была проведена из-за непредвиденной ошибки!!!" << endl;
  303.             }
  304.         } else {
  305.             cout << "Непредвиденная ошибка (файл не открывается для проверки)! Рекомендуется проверить, были ли записаны данные в файл вручную!" << endl;
  306.         }
  307.     } else {
  308.         cout << "Ошибка! Файл не может быть открыт!!" << endl;
  309.     }
  310. }
  311.  
  312. // Метод, записывающий данные из бинарного файла в массив
  313. void Notebook::loadFromBinaryFileInVector(vector<string> &vec) {
  314.     cout << endl;
  315.  
  316.     fstream out("NotebookBinary.txt");
  317.     string s;
  318.     while (getline(out, s))
  319.         vec.push_back(s);
  320.  
  321.     cout << "Данные, записанные из бинарного файла в массив" << endl;
  322.     if (!vec.empty()) {
  323.         for (vector<string>::iterator it = vec.begin(); it != vec.end(); ++it) {
  324.             cout << (*it) << endl;
  325.         }
  326.     } else {
  327.         cout << "Данные не были занесены в оперативную память компьютера!" << endl;
  328.     }
  329. }
  330.  
  331. // Метод, релизующий меню
  332. void Notebook::menu() {
  333.     int action;
  334.     while (true) {
  335.         cout << endl << "Меню программы! Нажмите:" << endl << "0 - для завершения работы с программой;" <<
  336.             endl << "1 - для записи данных;" << endl << "2 - для вывода данных (хранящихся в оперативной памяти) на экран;" <<
  337.             endl << "3 - удаление записи из массива данных;" <<
  338.             endl << "4 - сортировка данных;" <<
  339.             endl << "5 - поиск и редактирование записей;" <<
  340.             endl << "6 - запись данных в бинарный файл" <<
  341.             endl << "7 - запись данных из бинарного файла в массив и вывод его на экран" << endl;
  342.  
  343.         cout << "Введите номер действия: ";
  344.         cin >> action;
  345.         switch (action) {
  346.             case 0:
  347.                 exit(1);
  348.             case 1:
  349.                 cout << endl;
  350.                 addData(arrNotebooks);
  351.                 break;
  352.             case 2:
  353.                 cout << endl << "Введенная Вами структура данных о тетрадях будет выведена в формате: " << endl;
  354.                 cout << "Тип " << " - " << " Фирма производителя " << " - " << " Цена" << endl;
  355.                 outputData(arrNotebooks);
  356.                 break;
  357.             case 3:
  358.                 cout << "Введите номер записи, которую Вы хотите удалить: ";
  359.                 int num; cin >> num;
  360.                 deleteElement(num, arrNotebooks);
  361.                 break;
  362.             case 4:
  363.                 sorting(arrNotebooks);
  364.                 cout << "Отсортированные данные:" << endl;
  365.                 outputData(arrNotebooks);
  366.                 break;
  367.             case 5:
  368.                 searchAndRedaction(arrNotebooks);
  369.                 break;
  370.             case 6:
  371.                 saveInBinaryFile(arrNotebooks);
  372.                 break;
  373.             case 7:
  374.                 loadFromBinaryFileInVector(arrStrNotebooks);
  375.         }
  376.     }
  377. }
  378.  
  379. Pencils.h*
  380.  
  381. #pragma once
  382. #include "Stationery.h"
  383. class Pencils :
  384.     public Stationery {
  385. private:
  386.     int number;
  387.     string color;
  388.     string type;
  389.     double price;
  390.  
  391. public:
  392.     int getNumber();
  393.  
  394.     string getColor();
  395.  
  396.     string getType();
  397.  
  398.     double getPrice();
  399.  
  400.     void setNumber(int number);
  401.  
  402.     void setColor(string color);
  403.  
  404.     void setType(string type);
  405.  
  406.     void setPrice(double price);
  407.  
  408.     // Метод, выводящий данные о карандашах на экран
  409.     void outputData(vector<Pencils*> vec);
  410.  
  411.     // Метод, реализующий ввод данных о карандашах с клавиатуры
  412.     void addData(vector<Pencils*> &vec);
  413.  
  414.     // Метод, реализующий удаление элемента из массива данных
  415.     void deleteElement(unsigned int num, vector<Pencils*> &vec);
  416.  
  417.     // Метод, реализующий сортировку данных в массиве
  418.     void sorting(vector<Pencils*> &vec);
  419.  
  420.     // Метод, реализующий поиск и редактирование записей
  421.     void searchAndRedaction(vector<Pencils*> vec);
  422.  
  423.     // Метод, реализующий редактирование записей (используется в методе searchAndRedaction)
  424.     void redaction(vector<Pencils*> &vec, int i);
  425.  
  426.     // Метод, записывающий данные в бинарный файл
  427.     void saveInBinaryFile(vector<Pencils*> vec);
  428.  
  429.     // Метод, записывающий данные из бинарного файла в массив
  430.     void loadFromBinaryFileInVector(vector<string> &vec);
  431.  
  432.     // Метод, релизующий меню
  433.     void menu();
  434. };
  435.  
  436. Pencils.cpp
  437.  
  438. #include "stdafx.h"
  439. #include "Pencils.h"
  440. #include <algorithm>
  441.  
  442. vector<Pencils*> arrPencils;
  443. vector<string> strArrPencils;
  444.  
  445. int Pencils::getNumber() {
  446.     return number;
  447. }
  448.  
  449. string Pencils::getColor() {
  450.     return color;
  451. }
  452.  
  453. string Pencils::getType() {
  454.     return type;
  455. }
  456.  
  457. double Pencils::getPrice() {
  458.     return price;
  459. }
  460.  
  461. void Pencils::setNumber(int number) {
  462.     this->number = number;
  463. }
  464.  
  465. void Pencils::setColor(string color) {
  466.     this->color = color;
  467. }
  468.  
  469. void Pencils::setType(string type) {
  470.     this->type = type;
  471. }
  472.  
  473. void Pencils::setPrice(double price) {
  474.     this->price = price;
  475. }
  476.  
  477. // Метод, выводящий данные о карандашах на экран
  478. void Pencils::outputData(vector<Pencils*> vec) {
  479.     if (!vec.empty()) {
  480.         for (vector<Pencils*>::iterator it = vec.begin(); it != vec.end(); ++it) {
  481.             cout << (*it)->number << ")" << (*it)->color << " - " << (*it)->type
  482.                 << " - " << (*it)->price << endl;
  483.         }
  484.     } else {
  485.         cout << "Данные не были занесены в оперативную память компьютера!" << endl;
  486.     }
  487. }
  488.  
  489. // Метод, реализующий ввод данных о карандашах с клавиатуры
  490. void Pencils::addData(vector<Pencils*> &vec) {
  491.     int choice;
  492.     do {
  493.         cout << "Если данные были записаны ранее, то новые записи будут добавлены в конец массива!" << endl;
  494.         cout << "Введите запись о канцелярских товарах!";
  495.         Pencils pncls;
  496.         cin.get();
  497.         pncls.number = vec.size() + 1;
  498.         cout << endl << "Введите цвет для " << vec.size() + 1 << " карандаша:";
  499.         getline(cin, pncls.color);
  500.         cout << endl << "Введите тип для " << vec.size() + 1 << " карандаша: ";
  501.         getline(cin, pncls.type);
  502.         cout << endl << "Введите цену " << vec.size() + 1 << " канцелярского товара:" << endl;
  503.         cin >> pncls.price;
  504.         vec.push_back(new Pencils(pncls));
  505.  
  506.         cout << endl << "Хотите ввести еще одну запись? 1 - да, любое другое число - нет." << endl;
  507.         cin >> choice;
  508.         cout << endl;
  509.     } while (choice == 1);
  510. }
  511.  
  512. // Метод, реализующий удаление элемента из массива данных
  513. void Pencils::deleteElement(unsigned int num, vector<Pencils*> &vec) {
  514.     num--;
  515.     if (num > vec.size()) {
  516.         cout << "Такой записи не существует!" << endl;
  517.     } else {
  518.         vec.erase(vec.begin() + num);
  519.         cout << "Запись удалена." << endl;
  520.     }
  521. }
  522.  
  523. struct PNumCmp {
  524.     bool operator() (Pencils *a, Pencils *b) const {
  525.         return a->getNumber() < b->getNumber();
  526.     }
  527. };
  528.  
  529. struct TypeCmp {
  530.     bool operator() (Pencils *a, Pencils *b) const {
  531.         return a->getType() < b->getType();
  532.     }
  533. };
  534.  
  535. struct ColorCmp {
  536.     bool operator() (Pencils *a, Pencils *b) const {
  537.         return a->getColor() < b->getColor();
  538.     }
  539. };
  540.  
  541. struct PriceCmp {
  542.     bool operator() (Pencils *a, Pencils *b) const {
  543.         return a->getPrice() < b->getPrice();
  544.     }
  545. };
  546.  
  547. // Метод, реализующий сортировку данных в массиве
  548. void Pencils::sorting(vector<Pencils*> &vec) {
  549.     cout << endl << "Выберите действие: " << endl << "1 - сортировка по цене" << endl << "2 - по номеру (в порядке записи)" <<
  550.         endl << "3 - по цвету" << endl << "4 - по типу" << endl;
  551.     int srt; cin >> srt;
  552.     switch (srt) {
  553.         case 1:
  554.             cout << "Сортировка по цене" << endl;
  555.             sort(vec.begin(), vec.end(), PriceCmp());
  556.             break;
  557.         case 2:
  558.             cout << "Сортировка по номеру (по порядку записи)" << endl;
  559.             sort(vec.begin(), vec.end(), PNumCmp());
  560.             break;
  561.         case 3:
  562.             cout << "Сортировка по цвету" << endl;
  563.             sort(vec.begin(), vec.end(), ColorCmp());
  564.             break;
  565.         case 4:
  566.             cout << "Сортировка по типу" << endl;
  567.             sort(vec.begin(), vec.end(), TypeCmp());
  568.             break;
  569.     }
  570. }
  571.  
  572. // Метод, реализующий поиск и редактирование записей
  573. void Pencils::searchAndRedaction(vector<Pencils*> vec) {
  574.     cout << endl << "Сейчас Вы можете найти запись и её oтредактировать." << endl;
  575.     cout << "По какому полю структуры Вы будете искать запись:" << endl << "1 - номер записи" << endl <<
  576.         "2 - цвет карандаша" << endl << "3 - цена" << endl << "4 - тип карандаша" << endl << endl;;
  577.  
  578.     bool result = false;
  579.     int choice; cin >> choice;
  580.     switch (choice) {
  581.         case 1:
  582.             cout << endl << "Введите номер записи:";
  583.             int key; cin >> key;
  584.             for (int i = 0; i < vec.size(); i++) {
  585.                 if (vec[i]->number == key) {
  586.                     result = true;
  587.                     cout << "Найденная Вами запись: " << endl;
  588.                     cout << vec[i]->number << ") " << vec[i]->color << " - " << vec[i]->type << " - " << vec[i]->price << endl;
  589.                     cout << "Вы хотите редактировать эту запись (номер записи редактироваться не будет)"
  590.                         << endl << "1 - да " << endl << "любое другое (целое) число - нет" << endl;
  591.                     int red; cin >> red;
  592.                     if (red == 1) {
  593.                         redaction(arrPencils, i);
  594.                     }
  595.                     break;
  596.                 }
  597.             }
  598.             if (result == false) {
  599.                 cout << "Запись не найдена!" << endl;
  600.             }
  601.             break;
  602.  
  603.         case 2: {
  604.             cout << endl << "Введите цвет карандаша:";
  605.             string colKey; cin >> colKey;
  606.             for (int i = 0; i < vec.size(); i++) {
  607.                 if (vec[i]->color.compare(colKey) == 0) {
  608.                     result = true;
  609.                     cout << "Найденная Вами запись: " << endl;
  610.                     cout << vec[i]->number << ") " << vec[i]->color << " - " << vec[i]->type << " - " << vec[i]->price << endl;
  611.                     cout << "Вы хотите редактировать эту запись (номер записи редактироваться не будет)"
  612.                         << endl << "1 - да " << endl << "любое другое (целое) число - нет" << endl;
  613.                     int red; cin >> red;
  614.                     if (red == 1) {
  615.                         redaction(arrPencils, i);
  616.                     }
  617.                     break;
  618.                 }
  619.             }
  620.             if (result == false) {
  621.                 cout << "Запись не найдена!" << endl;
  622.             }
  623.             break;
  624.         }
  625.  
  626.         case 3:
  627.             cout << endl << "Введите цену:";
  628.             double priceKey; cin >> priceKey;
  629.             for (int i = 0; i < vec.size(); i++) {
  630.                 if (vec[i]->price == priceKey) {
  631.                     result = true;
  632.                     cout << "Найденная Вами запись: " << endl;
  633.                     cout << vec[i]->number << ") " << vec[i]->color << " - " << vec[i]->type << " - " << vec[i]->price << endl;
  634.                     cout << "Вы хотите редактировать эту запись (номер записи редактироваться не будет)"
  635.                         << endl << "1 - да " << endl << "любое другое (целое) число - нет" << endl;
  636.                     int red; cin >> red;
  637.                     if (red == 1) {
  638.                         redaction(arrPencils, i);
  639.                     }
  640.                     break;
  641.                 }
  642.             }
  643.             if (result == false) {
  644.                 cout << "Запись не найдена!" << endl;
  645.             }
  646.             break;
  647.  
  648.         case 4: {
  649.             cout << endl << "Введите тип карандаша:";
  650.             string typeKey; cin >> typeKey;
  651.             for (int i = 0; i < vec.size(); i++) {
  652.                 if (vec[i]->type == typeKey) {
  653.                     result == true;
  654.                     cout << "Найденная Вами запись: " << endl;
  655.                     cout << vec[i]->number << ") " << vec[i]->color << " - " << vec[i]->type << " - " << vec[i]->price << endl;
  656.                     cout << "Вы хотите редактировать эту запись (номер записи редактироваться не будет)"
  657.                         << endl << "1 - да " << endl << "любое другое (целое) число - нет" << endl;
  658.                     int red; cin >> red;
  659.                     if (red == 1) {
  660.                         redaction(arrPencils, i);
  661.                     }
  662.                     break;
  663.                 }
  664.             }
  665.             if (result == false) {
  666.                 cout << endl << "Запись не найдена!" << endl;
  667.             }
  668.         }
  669.     }
  670. }
  671.  
  672. // Метод, реализующий редактирование записей (используется в методе searchAndRedaction)
  673. void Pencils::redaction(vector<Pencils*> &vec, int i) {
  674.     cin.get();
  675.     cout << endl << "Введите цвет карандаша:";
  676.     getline(cin, vec[i]->color);
  677.     cout << endl << "Введите тип карандаша:";
  678.     getline(cin, vec[i]->type);
  679.     cout << endl << "Введите цену канцелярского товара:" << endl;
  680.     cin >> vec[i]->price;
  681.     cout << "Ваша запись после редактирования:" << endl;
  682.     cout << vec[i]->number << ") " << vec[i]->color << " - " << vec[i]->type << " - " << vec[i]->price << endl;
  683. }
  684.  
  685. // Метод, записывающий данные в бинарный файл
  686. void Pencils::saveInBinaryFile(vector<Pencils*> vec) {
  687.     cout << endl;
  688.     fstream fout;
  689.     fout.open("PencilsBinary.txt", ios::out | ios::binary);
  690.     if (fout.is_open()) {
  691.         for (int i = 0; i < vec.size(); i++) {
  692.             fout << vec[i]->number << " | ";
  693.             fout << vec[i]->color << " | ";
  694.             fout << vec[i]->type << " | ";
  695.             fout << vec[i]->price << endl;
  696.         }
  697.         fout.close();
  698.  
  699.         // Проверяем, была ли произведена запись в файл
  700.         fout.open("PencilsBinary.txt", ios::in | ios::ate);
  701.         if (fout.is_open()) {
  702.             if (fout.tellg() > 0) {
  703.                 cout << "Запись в файл была успешно проведена!" << endl;
  704.             } else {
  705.                 cout << "Запись в файл не была проведена из-за непредвиденной ошибки!!!" << endl;
  706.             }
  707.         } else {
  708.             cout << "Непредвиденная ошибка (файл не открывается для проверки)! Рекомендуется проверить, были ли записаны данные в файл вручную!" << endl;
  709.         }
  710.     } else {
  711.         cout << "Ошибка! Файл не может быть открыт!!" << endl;
  712.     }
  713. }
  714.  
  715. // Метод, записывающий данные из бинарного файла в массив
  716. void Pencils::loadFromBinaryFileInVector(vector<string> &vec) {
  717.     cout << endl;
  718.  
  719.     fstream out("PencilsBinary.txt");
  720.     string s;
  721.     while (getline(out, s))
  722.         vec.push_back(s);
  723.  
  724.     cout << "Данные, записанные из бинарного файла в массив" << endl;
  725.     if (!vec.empty()) {
  726.         for (vector<string>::iterator it = vec.begin(); it != vec.end(); ++it) {
  727.             cout << (*it) << endl;
  728.         }
  729.     } else {
  730.         cout << "Данные не были занесены в оперативную память компьютера!" << endl;
  731.     }
  732. }
  733.  
  734. // Метод, реализующий меню
  735. void Pencils::menu() {
  736.     int action;
  737.     while (true) {
  738.         cout << endl << "Меню программы! Нажмите:" << endl << "0 - для завершения работы с программой;" <<
  739.             endl << "1 - для записи данных;" << endl << "2 - для вывода данных (хранящихся в оперативной памяти) на экран;" <<
  740.             endl << "3 - удаление записи из массива данных;" <<
  741.             endl << "4 - сортировка данных;" <<
  742.             endl << "5 - поиск и редактирование записей;" <<
  743.             endl << "6 - запись данных в бинарный файл" <<
  744.             endl << "7 - запись данных из бинарного файла в массив и вывод его на экран" << endl;
  745.  
  746.         cout << "Введите номер действия: ";
  747.         cin >> action;
  748.         switch (action) {
  749.             case 0:
  750.                 exit(1);
  751.             case 1:
  752.                 cout << endl;
  753.                 addData(arrPencils);
  754.                 break;
  755.             case 2:
  756.                 cout << endl << "Введенная Вами структура данных о карандашах будет выведена в формате: " << endl;
  757.                 cout << "Тип " << " - " << " Фирма производителя " << " - " << " Цена" << endl;
  758.                 outputData(arrPencils);
  759.                 break;
  760.             case 3:
  761.                 cout << "Введите номер записи, которую Вы хотите удалить: ";
  762.                 int num; cin >> num;
  763.                 deleteElement(num, arrPencils);
  764.                 break;
  765.             case 4:
  766.                 sorting(arrPencils);
  767.                 cout << "Отсортированные данные:" << endl;
  768.                 outputData(arrPencils);
  769.                 break;
  770.             case 5:
  771.                 searchAndRedaction(arrPencils);
  772.                 break;
  773.             case 6:
  774.                 saveInBinaryFile(arrPencils);
  775.                 break;
  776.             case 7:
  777.                 loadFromBinaryFileInVector(strArrPencils);
  778.         }
  779.     }
  780. }
  781.  
  782. Stationery.h
  783.  
  784. #pragma once
  785. #include <string>
  786. #include <vector>
  787. #include <iostream>
  788. #include <fstream>
  789.  
  790. using namespace std;
  791.  
  792. class Stationery {
  793. private:
  794.     int number;
  795.     string firm;
  796.     double price;
  797.  
  798. public:
  799.     void setNumber(int number);
  800.     void setFirm(string firm);
  801.     void setPrice(double price);
  802.     int getNumber();
  803.     string getFirm();
  804.     double getPrice();
  805.  
  806.     // Метод, выводящий данные на экран
  807.     virtual void outputData(vector<Stationery*> vec);
  808.  
  809.     // Метод, реализующий ввод данных с клавиатуры
  810.     virtual void addData(vector<Stationery*> &vec);
  811.  
  812.     // Метод, реализующий удаление элемента из массива данных
  813.     virtual void deleteElement(unsigned int num, vector<Stationery*> &vec);
  814.  
  815.     // Метод, реализующий сортировку данных в массиве
  816.     virtual void sorting(vector<Stationery*> &vec);
  817.  
  818.     // Метод, реализующий поиск и редактирование записей
  819.     virtual void searchAndRedaction(vector<Stationery*> vec);
  820.  
  821.     // Метод, реализующий редактирование записей (используется в методе searchAndRedaction)
  822.     virtual void redaction(vector<Stationery*> &vec, int i);
  823.  
  824.     // Метод, записывающий данные в бинарный файл
  825.     virtual void saveInBinaryFile(vector<Stationery*> vec);
  826.  
  827.     // Метод, записывающий данные из бинарного файла в массив
  828.     virtual void loadFromBinaryFileInVector(vector<string> &vec);
  829.  
  830.     // Метод, реализующий меню
  831.     virtual void menu();
  832. };
  833.  
  834. Stationery.cpp
  835.  
  836. #include "stdafx.h"
  837. #include "Stationery.h"
  838. #include <algorithm>
  839.  
  840. vector<Stationery*> arrStationery;
  841. vector<string> arrData;
  842.  
  843. void Stationery::setNumber(int number) {
  844.     this->number = number;
  845. }
  846.  
  847. void Stationery::setFirm(string firm) {
  848.     this->firm = firm;
  849. }
  850.  
  851. void Stationery::setPrice(double price) {
  852.     this->price = price;
  853. }
  854.  
  855. int Stationery::getNumber() {
  856.     return number;
  857. }
  858.  
  859. string Stationery::getFirm() {
  860.     return firm;
  861. }
  862.  
  863. double Stationery::getPrice() {
  864.     return price;
  865. }
  866.  
  867. // Метод, выводящий данные на экран
  868. void Stationery::outputData(vector<Stationery*> vec) {
  869.     if (!vec.empty()) {
  870.         for (vector<Stationery*>::iterator it = vec.begin(); it != vec.end(); ++it) {
  871.             cout << (*it)->getNumber() << ")" << " - " << (*it)->getFirm()
  872.                 << " - " << (*it)->getPrice() << endl;
  873.         }
  874.     } else {
  875.         cout << "Данные не были занесены в оперативную память компьютера!" << endl;
  876.     }
  877. }
  878.  
  879. // Метод, реализующий ввод данных с клавиатуры
  880. void Stationery::addData(vector<Stationery*> &vec) {
  881.     int choice;
  882.     do {
  883.         cout << "Если данные были записаны ранее, то новые записи будут добавлены в конец массива!" << endl;
  884.         cout << "Введите запись о канцелярских товарах!";
  885.         Stationery stat;
  886.         cin.get();
  887.         stat.setNumber(vec.size() + 1);
  888.         cout << endl << "Введите название фирмы производителя для " << vec.size() + 1 << " канцелярского товара:" << endl;
  889.         getline(cin, stat.firm);
  890.         cout << endl << "Введите цену " << vec.size() + 1 << " канцелярского товара:" << endl;
  891.         cin >> stat.price;
  892.         vec.push_back(new Stationery(stat));
  893.  
  894.         cout << endl << "Хотите ввести еще одну запись? 1 - да, любое другое число - нет." << endl;
  895.         cin >> choice;
  896.         cout << endl;
  897.     } while (choice == 1);
  898. }
  899.  
  900. // Метод, реализующий удаление элемента из массива данных
  901. void Stationery::deleteElement(unsigned int num, vector<Stationery*> &vec) {
  902.     num--;
  903.     if (num > vec.size()) {
  904.         cout << "Такой записи не существует!" << endl;
  905.     } else {
  906.         vec.erase(vec.begin() + num);
  907.         cout << "Запись удалена." << endl;
  908.     }
  909. }
  910.  
  911. struct PriceCmp {
  912.     bool operator()(Stationery *a, Stationery *b) const {
  913.         return a->getPrice() < b->getPrice();
  914.     }
  915. };
  916.  
  917. struct NumCmp {
  918.     bool operator()(Stationery *a, Stationery *b) const {
  919.         return a->getNumber() < b->getNumber();
  920.     }
  921. };
  922.  
  923. struct FirmCmp {
  924.     bool operator()(Stationery *a, Stationery *b) const {
  925.         return a->getFirm() < b->getFirm();
  926.     }
  927. };
  928.  
  929. // Метод, реализующий сортировку данных в массиве
  930. void Stationery::sorting(vector<Stationery*> &vec) {
  931.     cout << endl << "Выберите действие: " << endl << "1 - сортировка по цене" << endl << "2 - по номеру (в порядке записи)" <<
  932.         endl << "3 - по названию фирмы" << endl;
  933.     int srt; cin >> srt;
  934.     switch (srt) {
  935.         case 1:
  936.             cout << "Сортировка по цене" << endl;
  937.             sort(vec.begin(), vec.end(), PriceCmp());
  938.             break;
  939.         case 2:
  940.             cout << "Сортировка по номеру (по порядку записи)" << endl;
  941.             sort(vec.begin(), vec.end(), NumCmp());
  942.             break;
  943.         case 3:
  944.             cout << "Сортировка по названию фирмы" << endl;
  945.             sort(vec.begin(), vec.end(), FirmCmp());
  946.             break;         
  947.     }
  948. }
  949.  
  950. // Метод, реализующий поиск и редактирование записей
  951. void Stationery::searchAndRedaction(vector<Stationery*> vec) {
  952.     cout << endl << "Сейчас Вы можете найти запись и её oтредактировать." << endl;
  953.     cout << "По какому полю структуры Вы будете искать запись:" << endl << "1 - номер записи" << endl <<
  954.         "2 - название фирмы" << endl << "3 - цена" << endl << endl;
  955.  
  956.     bool result = false;
  957.     int choice; cin >> choice;
  958.     switch (choice) {
  959.         case 1:
  960.             cout << endl << "Введите номер записи:" << endl;
  961.             int key; cin >> key;
  962.             for (int i = 0; i < vec.size(); i++) {
  963.                 if (vec[i]->number == key) {
  964.                     result = true;
  965.                     cout << "Найденная Вами запись: " << endl;
  966.                     cout << vec[i]->number << ") " << vec[i]->firm << " - " << vec[i]->price << endl;
  967.                     cout << "Вы хотите редактировать эту запись (номер записи редактироваться не будет)"
  968.                         << endl << "1 - да " << endl << "любое другое (целое) число - нет" << endl;
  969.                     int red; cin >> red;
  970.                     if (red == 1) {
  971.                         redaction(arrStationery, i);
  972.                     }
  973.                     break;
  974.                 }
  975.             }
  976.             if (result == false) {
  977.                 cout << "Запись не найдена!" << endl;
  978.             }
  979.             break;
  980.  
  981.         case 2: {
  982.             cout << endl << "Введите название фирмы:" << endl;
  983.             string firmKey; cin >> firmKey;
  984.             for (int i = 0; i < vec.size(); i++) {
  985.                 if (vec[i]->firm.compare(firmKey) == 0) {
  986.                     result = true;
  987.                     cout << "Найденная Вами запись: " << endl;
  988.                     cout << vec[i]->number << ") " << vec[i]->firm << " - " << vec[i]->price << endl;
  989.                     cout << "Вы хотите редактировать эту запись (номер записи редактироваться не будет)"
  990.                         << endl << "1 - да " << endl << "любое другое (целое) число - нет" << endl;
  991.                     int red; cin >> red;
  992.                     if (red == 1) {
  993.                         redaction(arrStationery, i);
  994.                     }
  995.                     break;
  996.                 }
  997.             }
  998.             if (result == false) {
  999.                 cout << "Запись не найдена!" << endl;
  1000.             }
  1001.             break;
  1002.         }
  1003.  
  1004.         case 3:
  1005.             cout << endl << "Введите цену:" << endl;
  1006.             double priceKey; cin >> priceKey;
  1007.             for (int i = 0; i < vec.size(); i++) {
  1008.                 if (vec[i]->price == priceKey) {
  1009.                     result = true;
  1010.                     cout << "Найденная Вами запись: " << endl;
  1011.                     cout << vec[i]->number << ") " << vec[i]->firm << " - " << vec[i]->price << endl;
  1012.                     cout << "Вы хотите редактировать эту запись (номер записи редактироваться не будет)"
  1013.                         << endl << "1 - да " << endl << "любое другое (целое) число - нет" << endl;
  1014.                     int red; cin >> red;
  1015.                     if (red == 1) {
  1016.                         redaction(arrStationery, i);
  1017.                     }
  1018.                     break;
  1019.                 }
  1020.             }
  1021.             if (result == false) {
  1022.                 cout << "Запись не найдена!" << endl;
  1023.             }
  1024.             break;
  1025.     }
  1026. }
  1027.  
  1028. // Метод, реализующий редактирование записей (используется в методе searchAndRedaction)
  1029. void Stationery::redaction(vector<Stationery*> &vec, int i) {
  1030.     cin.get();
  1031.     cout << endl << "Введите название фирмы производителя канцелярского товара:" << endl;
  1032.     getline(cin, vec[i]->firm);
  1033.     cout << endl << "Введите цену канцелярского товара:" << endl;
  1034.     cin >> vec[i]->price;
  1035.     cout << "Ваша запись после редактирования:" << endl;
  1036.     cout << vec[i]->number << ") " << vec[i]->firm << " - " << vec[i]->price << endl;
  1037. }
  1038.  
  1039. // Метод, записывающий данные в бинарный файл
  1040. void Stationery::saveInBinaryFile(vector<Stationery*> vec) {
  1041.     cout << endl;
  1042.     fstream fout;
  1043.     fout.open("StationeryBinary.txt", ios::out | ios::binary);
  1044.     if (fout.is_open()) {
  1045.         for (int i = 0; i < vec.size(); i++) {
  1046.             fout << vec[i]->number << " | ";
  1047.             fout << vec[i]->firm << " | ";
  1048.             fout << vec[i]->price << endl;
  1049.         }
  1050.         fout.close();
  1051.  
  1052.         // Проверяем, была ли произведена запись в файл
  1053.         fout.open("StationeryBinary.txt", ios::in | ios::ate);
  1054.         if (fout.is_open()) {
  1055.             if (fout.tellg() > 0) {
  1056.                 cout << "Запись в файл была успешно проведена!" << endl;
  1057.             } else {
  1058.                 cout << "Запись в файл не была проведена из-за непредвиденной ошибки!!!" << endl;
  1059.             }
  1060.         } else {
  1061.             cout << "Непредвиденная ошибка (файл не открывается для проверки)! Рекомендуется проверить, были ли записаны данные в файл вручную!" << endl;
  1062.         }
  1063.     } else {
  1064.         cout << "Ошибка! Файл не может быть открыт!!" << endl;
  1065.     }
  1066. }
  1067.  
  1068. // Метод, записывающий данные из бинарного файла в массив
  1069. void Stationery::loadFromBinaryFileInVector(vector<string> &vec) {
  1070.     cout << endl;
  1071.  
  1072.     fstream out("StationeryBinary.txt");
  1073.     string s;
  1074.     while (getline(out, s))
  1075.         vec.push_back(s);
  1076.  
  1077.     cout << "Данные, записанные из бинарного файла в массив" << endl;
  1078.     if (!vec.empty()) {
  1079.         for (vector<string>::iterator it = vec.begin(); it != vec.end(); ++it) {
  1080.             cout << (*it) << endl;
  1081.         }
  1082.     } else {
  1083.         cout << "Данные не были занесены в оперативную память компьютера!" << endl;
  1084.     }
  1085. }
  1086.  
  1087. // Метод, реализующий меню
  1088. void Stationery::menu() {
  1089.     int action;
  1090.     while (true) {
  1091.         cout << endl << "Нажмите:" << endl << "0 - для завершения работы с программой;" <<
  1092.             endl << "1 - для записи данных;" << endl << "2 - для вывода данных (хранящихся в оперативной памяти) на экран;" <<
  1093.             endl << "3 - удаление записи из массива данных;" <<
  1094.             endl << "4 - сортировка данных;" <<
  1095.             endl << "5 - поиск и редактирование записей;" <<
  1096.             endl << "6 - запись данных в бинарный файл" <<
  1097.             endl << "7 - запись данных из бинарного файла в массив и вывод его на экран" << endl;
  1098.  
  1099.         cout << "Введите номер действия: ";
  1100.         cin >> action;
  1101.         switch (action) {
  1102.             case 0:
  1103.                 exit(1);
  1104.             case 1:
  1105.                 cout << endl;
  1106.                 addData(arrStationery);
  1107.                 break;
  1108.             case 2:
  1109.                 cout << endl << "Введенная Вами структура данных о канцелярских товарах будет выведена в формате: " << endl;
  1110.                 cout << "Тип " << " - " << " Фирма производителя " << " - " << " Цена" << endl;
  1111.                 outputData(arrStationery);
  1112.                 break;
  1113.             case 3:
  1114.                 cout << "Введите номер записи, которую Вы хотите удалить: ";
  1115.                 int num; cin >> num;
  1116.                 deleteElement(num, arrStationery);
  1117.                 break;
  1118.             case 4:
  1119.                 sorting(arrStationery);
  1120.                 cout << "Отсортированные данные:" << endl;
  1121.                 outputData(arrStationery);
  1122.                 break;
  1123.             case 5:
  1124.                 searchAndRedaction(arrStationery);
  1125.                 break;
  1126.             case 6:
  1127.                 saveInBinaryFile(arrStationery);
  1128.                 break;
  1129.             case 7:
  1130.                 loadFromBinaryFileInVector(arrData);
  1131.         }
  1132.     }
  1133. }
  1134.  
  1135. Lb_6.cpp
  1136.  
  1137. /*Лабораторная работа №6
  1138.     Использование полиморфизма, наследования и абстрактных классов
  1139.     Работу выполнили студенты II-АИТ-3
  1140.     Батейщиков Д.А. и Симонов А.А.*/
  1141.  
  1142. #include "stdafx.h"
  1143. #include <Windows.h>
  1144. #include "Stationery.h"
  1145. #include "Pencils.h"
  1146. #include "Notebook.h"
  1147.  
  1148. void menu() {
  1149.     Stationery *p;
  1150.     Stationery stat;
  1151.     Pencils pncls;
  1152.     Notebook ntbk;
  1153.     int action;
  1154.     while (true) {
  1155.         cout << "Меню программы! Нажмите: 1 - для работы с общими данными о канцелярских товарах;" <<
  1156.             endl << "2 - для работы с данными о карандашах;" <<
  1157.             endl << "3 - для работы с данными о тетрадях;" <<
  1158.             endl;
  1159.  
  1160.         cout << "Введите номер действия:"; cin >> action;
  1161.         switch (action) {
  1162.             case 0:
  1163.                 exit(1);
  1164.             case 1:
  1165.                 p = &stat;
  1166.                 p->menu();
  1167.                 break;
  1168.             case 2:
  1169.                 p = &pncls;
  1170.                 p->menu();
  1171.                 break;
  1172.             case 3:
  1173.                 p = &ntbk;
  1174.                 p->menu();
  1175.                 break;
  1176.         }
  1177.     }
  1178. }
  1179.  
  1180. int main()
  1181. {
  1182.     // Русификация
  1183.     SetConsoleCP(1251);
  1184.     SetConsoleOutputCP(1251);
  1185.     cout << "Copyright by BSC (Bateyshikov & Simonov Corporation)." << endl;
  1186.     cout << "Здравствуйте!" << endl << "Запущена программа для создание структуры данных канцелярских товаров." << endl;
  1187.  
  1188.     menu();
  1189.  
  1190.     return 0;
  1191. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement