Advertisement
Argerd14

T&MP Lb_5

May 27th, 2017
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 15.73 KB | None | 0 0
  1. Stationery.h*
  2.  
  3. #include <string>
  4. #include <vector>
  5. #include <iostream>
  6. #include <fstream>
  7.  
  8. using namespace std;
  9.  
  10. class Stationery {
  11. private:
  12.     int number;
  13.     string type;
  14.     string firm;
  15.     double price;
  16.    
  17. public:
  18.     void setNumber(int number);
  19.     void setType(string type);
  20.     void setFirm(string firm);
  21.     void setPrice(double price);
  22.     int getNumber();
  23.     string getType();
  24.     string getFirm();
  25.     double getPrice();
  26.  
  27.     // Метод, выводящий данные на экран
  28.     void outputData(vector<Stationery*> vec);
  29.  
  30.     // Метод, реализующий ввод данных с клавиатуры
  31.     void addData(vector<Stationery*> &vec);
  32.  
  33.     // Метод, реализующий удаление элемента из массива данных
  34.     void deleteElement(unsigned int num, vector<Stationery*> &vec);
  35.  
  36.     // Метод, реализующий сортировку данных в массиве
  37.     void sorting(vector<Stationery*> &vec);
  38.  
  39.     // Метод, реализующий поиск и редактирование записей
  40.     void searchAndRedaction(vector<Stationery*> vec);
  41.  
  42.     // Метод, реализующий редактирование записей (используется в методе searchAndRedaction)
  43.     void redaction(vector<Stationery*> &vec, int i);
  44.  
  45.     // Метод, записывающий данные в бинарный файл
  46.     void saveInBinaryFile(vector<Stationery*> vec);
  47.  
  48.     // Метод, записывающий данные из бинарного файла в массив
  49.     void loadFromBinaryFileInVector(vector<string> &vec);
  50.  
  51.     // Метод, реализующий меню
  52.     void menu();
  53. };
  54.  
  55. Stationery.cpp
  56.  
  57. #include "stdafx.h"
  58. #include "Stationery.h"
  59. #include <algorithm>
  60.  
  61. vector<Stationery*> arrStationery;
  62. vector<string> arrData;
  63.  
  64. void Stationery::setNumber(int number) {
  65.         this->number = number;
  66.     }
  67.  
  68.     void Stationery::setType(string type) {
  69.         this->type = type;
  70.     }
  71.  
  72.     void Stationery::setFirm(string firm) {
  73.         this->firm = firm;
  74.     }
  75.  
  76.     void Stationery::setPrice(double price) {
  77.         this->price = price;
  78.     }
  79.  
  80.     int Stationery::getNumber() {
  81.         return number;
  82.     }
  83.  
  84.     string Stationery::getType() {
  85.         return type;
  86.     }
  87.  
  88.     string Stationery::getFirm() {
  89.         return firm;
  90.     }
  91.  
  92.     double Stationery::getPrice() {
  93.         return price;
  94.     }
  95.  
  96.     // Метод, выводящий данные на экран
  97.     void Stationery::outputData(vector<Stationery*> vec) {
  98.         if (!vec.empty()) {        
  99.             for (vector<Stationery*>::iterator it = vec.begin(); it != vec.end(); ++it) {
  100.                 cout << (*it)->getNumber() << ")" << (*it)->getType() << " - " << (*it)->getFirm()
  101.                     << " - " << (*it)->getPrice() << endl;
  102.             }
  103.         } else {
  104.             cout << "Данные не были занесены в оперативную память компьютера!" << endl;
  105.         }
  106.     }
  107.  
  108.     // Метод, реализующий ввод данных с клавиатуры
  109.     void Stationery::addData(vector<Stationery*> &vec) {
  110.         int choice;
  111.         do {
  112.             cout << "Если данные были записаны ранее, то новые записи будут добавлены в конец массива!" << endl;
  113.             cout << "Введите запись о канцелярских товарах!";
  114.             Stationery stat;
  115.             cin.get();
  116.             stat.setNumber(vec.size() + 1);
  117.             cout << endl << "Введите тип канцелярского товара для " << vec.size() + 1 << " товара: " << endl;
  118.             getline(cin, stat.type);
  119.             cout << endl << "Введите название фирмы производителя для " << vec.size() + 1 << " канцелярского товара:" << endl;
  120.             getline(cin, stat.firm);
  121.             cout << endl << "Введите цену " << vec.size() + 1 << " канцелярского товара:" << endl;
  122.             cin >> stat.price;
  123.             vec.push_back(new Stationery(stat));
  124.  
  125.             cout << endl << "Хотите ввести еще одну запись? 1 - да, любое другое число - нет." << endl;
  126.             cin >> choice;
  127.             cout << endl;
  128.         } while (choice == 1);
  129.     }
  130.    
  131.     // Метод, реализующий удаление элемента из массива данных
  132.     void Stationery::deleteElement(unsigned int num, vector<Stationery*> &vec) {
  133.         num--;
  134.         if (num > vec.size()) {
  135.             cout << "Такой записи не существует!" << endl;
  136.         } else {
  137.             vec.erase(vec.begin() + num);
  138.             cout << "Запись удалена." << endl;
  139.         }
  140.     }
  141.  
  142.     struct PriceCmp {
  143.         bool operator()(Stationery *a, Stationery *b) const {
  144.             return a->getPrice() < b->getPrice();
  145.         }
  146.     };
  147.  
  148.     struct NumCmp {
  149.         bool operator()(Stationery *a, Stationery *b) const {
  150.             return a->getNumber() < b->getNumber();
  151.         }
  152.  
  153.     };
  154.  
  155.     struct TypeCmp {
  156.         bool operator()(Stationery *a, Stationery *b) const {
  157.             return a->getType() < b->getType();
  158.         }
  159.     };
  160.  
  161.     struct FirmCmp {
  162.         bool operator()(Stationery *a, Stationery *b) const {
  163.             return a->getFirm() < b->getFirm();
  164.         }
  165.     };
  166.  
  167.     // Метод, реализующий сортировку данных в массиве
  168.     void Stationery::sorting(vector<Stationery*> &vec) {
  169.         cout << endl << "Выберите действие: " << endl << "1 - сортировка по цене" << endl << "2 - по номеру (в порядке записи)"
  170.             << endl << "3 - по типу" << endl << "4 - по названию фирмы" << endl;
  171.         int srt; cin >> srt;
  172.         switch (srt) {
  173.             case 1:
  174.                 cout << "Сортировка по цене" << endl;
  175.                 sort(vec.begin(), vec.end(), PriceCmp());
  176.                 break;
  177.             case 2:
  178.                 cout << "Сортировка по номеру (по порядку записи)" << endl;
  179.                 sort(vec.begin(), vec.end(), NumCmp());
  180.                 break;
  181.             case 3:
  182.                 cout << "Сортировка по типу" << endl;
  183.                 sort(vec.begin(), vec.end(), TypeCmp());
  184.                 break;
  185.             case 4:
  186.                 cout << "Сортировка по названию фирмы" << endl;
  187.                 sort(vec.begin(), vec.end(), FirmCmp());
  188.                 break;
  189.         }
  190.     }
  191.  
  192.     // Метод, реализующий поиск и редактирование записей
  193.     void Stationery::searchAndRedaction(vector<Stationery*> vec) {
  194.         cout << endl << "Сейчас Вы можете найти запись и её oтредактировать." << endl;
  195.         cout << "По какому полю структуры Вы будете искать запись:" << endl << "1 - номер записи" << endl << "2 - тип товара" << endl <<
  196.             "3 - название фирмы" << endl << "4 - цена" << endl << endl;
  197.  
  198.         bool result = false;
  199.         int choice; cin >> choice;
  200.         switch (choice) {
  201.             case 1:
  202.                 cout << endl << "Введите номер записи:" << endl;
  203.                 int key; cin >> key;
  204.                 for (int i = 0; i < vec.size(); i++) {
  205.                     if (vec[i]->number == key) {       
  206.                         result = true;
  207.                         cout << "Найденная Вами запись: " << endl;
  208.                         cout << vec[i]->number << ") " << vec[i]->type << " - " << vec[i]->firm << " - " << vec[i]->price << endl;
  209.                         cout << "Вы хотите редактировать эту запись (номер записи редактироваться не будет)"
  210.                             << endl << "1 - да " << endl << "любое другое (целое) число - нет" << endl;
  211.                         int red; cin >> red;
  212.                         if (red == 1) {
  213.                             redaction(arrStationery, i);
  214.                         }
  215.                         break;
  216.                     }
  217.                 }
  218.                 if (result == false) {
  219.                     cout << "Запись не найдена!" << endl;
  220.                 }
  221.                 break;
  222.  
  223.             case 2: {
  224.                 cout << endl << "Введите тип товара:" << endl;
  225.                 string typeKey; cin >> typeKey;
  226.                 for (int i = 0; i < vec.size(); i++) {
  227.                     if (vec[i]->type.compare(typeKey) == 0) {
  228.                         result = true;
  229.                         cout << "Найденная Вами запись: " << endl;
  230.                         cout << vec[i]->number << ") " << vec[i]->type << " - " << vec[i]->firm << " - " << vec[i]->price << endl;
  231.                         cout << "Вы хотите редактировать эту запись (номер записи редактироваться не будет)"
  232.                             << endl << "1 - да " << endl << "любое другое (целое) число - нет" << endl;
  233.                         int red; cin >> red;
  234.                         if (red == 1) {
  235.                             redaction(arrStationery, i);
  236.                         }
  237.                         break;
  238.                     }
  239.                 }
  240.                 if (result == false) {
  241.                     cout << "Запись не найдена!" << endl;
  242.                 }
  243.                 break;
  244.             }              
  245.                
  246.             case 3: {
  247.                 cout << endl << "Введите название фирмы:" << endl;
  248.                 string firmKey; cin >> firmKey;
  249.                 for (int i = 0; i < vec.size(); i++) {
  250.                     if (vec[i]->firm.compare(firmKey) == 0) {
  251.                         result = true;
  252.                         cout << "Найденная Вами запись: " << endl;
  253.                         cout << vec[i]->number << ") " << vec[i]->type << " - " << vec[i]->firm << " - " << vec[i]->price << endl;
  254.                         cout << "Вы хотите редактировать эту запись (номер записи редактироваться не будет)"
  255.                             << endl << "1 - да " << endl << "любое другое (целое) число - нет" << endl;
  256.                         int red; cin >> red;
  257.                         if (red == 1) {
  258.                             redaction(arrStationery, i);
  259.                         }
  260.                         break;
  261.                     }
  262.                 }
  263.                 if (result == false) {
  264.                     cout << "Запись не найдена!" << endl;
  265.                 }
  266.                 break;
  267.             }
  268.  
  269.             case 4:
  270.                 cout << endl << "Введите цену:" << endl;
  271.                 double priceKey; cin >> priceKey;
  272.                 for (int i = 0; i < vec.size(); i++) {
  273.                     if (vec[i]->price == priceKey) {
  274.                         result = true;
  275.                         cout << "Найденная Вами запись: " << endl;
  276.                         cout << vec[i]->number << ") " << vec[i]->type << " - " << vec[i]->firm << " - " << vec[i]->price << endl;
  277.                         cout << "Вы хотите редактировать эту запись (номер записи редактироваться не будет)"
  278.                             << endl << "1 - да " << endl << "любое другое (целое) число - нет" << endl;
  279.                         int red; cin >> red;
  280.                         if (red == 1) {
  281.                             redaction(arrStationery, i);
  282.                         }
  283.                         break;
  284.                     }
  285.                 }
  286.                 if (result == false) {
  287.                     cout << "Запись не найдена!" << endl;
  288.                 }
  289.                 break;
  290.         }
  291.     }
  292.  
  293.     // Метод, реализующий редактирование записей (используется в методе searchAndRedaction)
  294.     void Stationery::redaction(vector<Stationery*> &vec, int i) {
  295.         cin.get();
  296.         cout << endl << "Введите тип канцелярского товара: " << endl;
  297.         getline(cin, vec[i]->type);
  298.         cout << endl << "Введите название фирмы производителя канцелярского товара:" << endl;
  299.         getline(cin, vec[i]->firm);
  300.         cout << endl << "Введите цену канцелярского товара:" << endl;
  301.         cin >> vec[i]->price;
  302.         cout << "Ваша запись после редактирования:" << endl;
  303.         cout << vec[i]->number << ") " << vec[i]->type << " - " << vec[i]->firm << " - " << vec[i]->price << endl;
  304.     }
  305.  
  306.     // Метод, записывающий данные в бинарный файл
  307.     void Stationery::saveInBinaryFile(vector<Stationery*> vec) {
  308.         cout << endl;
  309.         fstream fout;
  310.         fout.open("StationeryBinary.txt", ios::out | ios::binary);
  311.         if (fout.is_open()) {
  312.             for (int i = 0; i < vec.size(); i++) {
  313.                 fout << vec[i]->number << " | ";
  314.                 fout << vec[i]->type << " | ";
  315.                 fout << vec[i]->firm << " | ";
  316.                 fout << vec[i]->price << endl;
  317.             }
  318.             fout.close();
  319.            
  320.             // Проверяем, была ли произведена запись в файл
  321.             fout.open("StationeryBinary.txt", ios::in | ios::ate);
  322.             if (fout.is_open()) {
  323.                 if (fout.tellg() > 0) {
  324.                     cout << "Запись в файл была успешно проведена!" << endl;
  325.                 } else {
  326.                     cout << "Запись в файл не была проведена из-за непредвиденной ошибки!!!" << endl;
  327.                 }
  328.             } else {
  329.                 cout << "Непредвиденная ошибка (файл не открывается для проверки)! Рекомендуется проверить, были ли записаны данные в файл вручную!" << endl;
  330.             }
  331.         } else {
  332.             cout << "Ошибка! Файл не может быть открыт!!" << endl;
  333.         }
  334.     }
  335.  
  336.     // Метод, записывающий данные из бинарного файла в массив
  337.     void Stationery::loadFromBinaryFileInVector(vector<string> &vec) {
  338.         cout << endl;
  339.        
  340.         fstream out("StationeryBinary.txt");
  341.         string s;
  342.         while (getline(out, s))
  343.             vec.push_back(s);
  344.  
  345.         cout << "Данные, записанные из бинарного файла в массив" << endl;
  346.         if (!vec.empty()) {
  347.             for (vector<string>::iterator it = vec.begin(); it != vec.end(); ++it) {
  348.                 cout << (*it) << endl;
  349.             }
  350.         } else {
  351.             cout << "Данные не были занесены в оперативную память компьютера!" << endl;
  352.         }
  353.     }
  354.    
  355.     // Метод, реализующий меню
  356.     void Stationery::menu() {
  357.         int action;
  358.         while (true) {
  359.             cout << endl << "Меню программы! Нажмите:" << endl << "0 - для завершения работы с программой;" <<
  360.                 endl << "1 - для записи данных;" << endl << "2 - для вывода данных (хранящихся в оперативной памяти) на экран;" <<
  361.                 endl << "3 - удаление записи из массива данных;" <<
  362.                 endl << "4 - сортировка данных;" <<
  363.                 endl << "5 - поиск и редактирование записей;" <<
  364.                 endl << "6 - запись данных в бинарный файл" <<
  365.                 endl << "7 - запись данных из бинарного файла в массив и вывод его на экран" << endl;
  366.  
  367.             cout << "Введите номер действия: ";
  368.             cin >> action;
  369.             switch (action) {
  370.                 case 0:
  371.                     exit(1);
  372.                 case 1:
  373.                     cout << endl;
  374.                     addData(arrStationery);
  375.                     break;
  376.                 case 2:
  377.                     cout << endl << "Введенная Вами структура данных о канцелярских товарах будет выведена в формате: " << endl;
  378.                     cout << "Тип " << " - " << " Фирма производителя " << " - " << " Цена" << endl;
  379.                     outputData(arrStationery);
  380.                     break;
  381.                 case 3:
  382.                     cout << "Введите номер записи, которую Вы хотите удалить: ";
  383.                     int num; cin >> num;
  384.                     deleteElement(num, arrStationery);
  385.                     break;
  386.                 case 4:
  387.                     sorting(arrStationery);
  388.                     cout << "Отсортированные данные:" << endl;
  389.                     outputData(arrStationery);
  390.                     break;
  391.                 case 5:
  392.                     searchAndRedaction(arrStationery);
  393.                     break;
  394.                 case 6:
  395.                     saveInBinaryFile(arrStationery);
  396.                     break;
  397.                 case 7:
  398.                     loadFromBinaryFileInVector(arrData);
  399.             }
  400.         }
  401.     }
  402.  
  403. Lb_5.cpp
  404.  
  405. /* Лабораторная работа №5
  406.     Использование ООП в разработке приложений
  407.     Работу выполнили студенты II-АИТ-3
  408.     Батейщиков Д.А. и Симонов А.А.*/
  409.  
  410. #include "stdafx.h"
  411. #include <string>
  412. #include <Windows.h>
  413. #include "Stationery.h"
  414.  
  415. using namespace std;
  416.  
  417. int _tmain(int argc, _TCHAR* argv[])
  418. {
  419.     // Русификация
  420.     SetConsoleCP(1251);
  421.     SetConsoleOutputCP(1251);
  422.     cout << "Copyright by BSC (Bateyshikov & Simonov Corporation)." << endl;
  423.     cout << "Здравствуйте!" << endl << "Запущена программа для создание структуры данных канцелярских товаров." << endl;
  424.  
  425.     Stationery stat;
  426.     stat.menu();
  427.  
  428.     return 0;
  429. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement