Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Notebook.h
- #pragma once
- #include "Stationery.h"
- #include <vector>
- class Notebook :
- public Stationery {
- private:
- int number;
- int countSheets;
- string type;
- double price;
- public:
- int getNumber();
- int getCountSheets();
- string getType();
- double getPrice();
- // Метод, выводящий данные о тетрадях на экран
- void outputData(vector<Notebook*> vec);
- // Метод, реализующий ввод данных о тетрадях с клавиатуры
- void addData(vector<Notebook*> &vec);
- // Метод, реализующий удаление элемента из массива данных
- void deleteElement(unsigned int num, vector<Notebook*> &vec);
- // Метод, реализующий сортировку данных в массиве
- void sorting(vector<Notebook*> &vec);
- // Метод, реализующий поиск и редактирование записей
- void searchAndRedaction(vector<Notebook*> vec);
- // Метод, реализующий редактирование записей (используется в методе searchAndRedaction)
- void redaction(vector<Notebook*> &vec, int i);
- // Метод, записывающий данные в бинарный файл
- void saveInBinaryFile(vector<Notebook*> vec);
- // Метод, записывающий данные из бинарного файла в массив
- void loadFromBinaryFileInVector(vector<string> &vec);
- // Метод, релизующий меню
- void menu();
- };
- Notebook.cpp
- #include "stdafx.h"
- #include "Notebook.h"
- #include <algorithm>
- vector<Notebook*> arrNotebooks;
- vector<string> arrStrNotebooks;
- // Метод, выводящий данные о тетрадях на экран
- void Notebook::outputData(vector<Notebook*> vec) {
- if (!vec.empty()) {
- for (vector<Notebook*>::iterator it = vec.begin(); it != vec.end(); ++it) {
- cout << (*it)->number << ")" << (*it)->countSheets << " - " << (*it)->type
- << " - " << (*it)->price << endl;
- }
- } else {
- cout << "Данные не были занесены в оперативную память компьютера!" << endl;
- }
- }
- // Метод, реализующий ввод данных о тетрадях с клавиатуры
- void Notebook::addData(vector<Notebook*> &vec) {
- int choice;
- do {
- cout << "Если данные были записаны ранее, то новые записи будут добавлены в конец массива!" << endl;
- cout << "Введите запись о канцелярских товарах!";
- Notebook ntbk;
- cin.get();
- ntbk.number = vec.size() + 1;
- cout << endl << "Введите цвет для " << vec.size() + 1 << " карандаша:";
- cin >> ntbk.countSheets;
- cout << endl << "Введите тип для " << vec.size() + 1 << " карандаша: ";
- getline(cin, ntbk.type);
- cout << endl << "Введите цену " << vec.size() + 1 << " канцелярского товара:" << endl;
- cin >> ntbk.price;
- vec.push_back(new Notebook(ntbk));
- cout << endl << "Хотите ввести еще одну запись? 1 - да, любое другое число - нет." << endl;
- cin >> choice;
- cout << endl;
- } while (choice == 1);
- }
- // Метод, реализующий удаление элемента из массива данных
- void Notebook::deleteElement(unsigned int num, vector<Notebook*> &vec) {
- num--;
- if (num > vec.size()) {
- cout << "Такой записи не существует!" << endl;
- } else {
- vec.erase(vec.begin() + num);
- cout << "Запись удалена." << endl;
- }
- }
- int Notebook::getNumber() {
- return number;
- }
- int Notebook::getCountSheets() {
- return countSheets;
- }
- string Notebook::getType() {
- return type;
- }
- double Notebook::getPrice() {
- return price;
- }
- struct NumberCmp {
- bool operator() (Notebook *a, Notebook *b) const {
- return a->getNumber() < b->getNumber();
- }
- };
- struct CountSheetsCmp {
- bool operator() (Notebook *a, Notebook *b) const {
- return a->getCountSheets() < b->getCountSheets();
- }
- };
- struct TypeCmp {
- bool operator() (Notebook *a, Notebook *b) const {
- return a->getType() < b->getType();
- }
- };
- struct PriceCmp {
- bool operator() (Notebook *a, Notebook *b) const {
- return a->getPrice() < b->getPrice();
- }
- };
- // Метод, реализующий сортировку данных в массиве
- void Notebook::sorting(vector<Notebook*> &vec) {
- cout << endl << "Выберите действие: " << endl << "1 - сортировка по цене" << endl << "2 - по номеру (в порядке записи)" <<
- endl << "3 - по количеству страниц" << endl << "4 - по типу" << endl;
- int srt; cin >> srt;
- switch (srt) {
- case 1:
- cout << "Сортировка по цене" << endl;
- sort(vec.begin(), vec.end(), PriceCmp());
- break;
- case 2:
- cout << "Сортировка по номеру (по порядку записи)" << endl;
- sort(vec.begin(), vec.end(), NumberCmp());
- break;
- case 3:
- cout << "Сортировка по цвету" << endl;
- sort(vec.begin(), vec.end(), CountSheetsCmp());
- break;
- case 4:
- cout << "Сортировка по типу" << endl;
- sort(vec.begin(), vec.end(), TypeCmp());
- break;
- }
- }
- // Метод, реализующий поиск и редактирование записей
- void Notebook::searchAndRedaction(vector<Notebook*> vec) {
- cout << endl << "Сейчас Вы можете найти запись и её oтредактировать." << endl;
- cout << "По какому полю структуры Вы будете искать запись:" << endl << "1 - номер записи" << endl <<
- "2 - количество страниц" << endl << "3 - цена" << endl << "4 - тип тетради" << endl << endl;;
- bool result = false;
- int choice; cin >> choice;
- switch (choice) {
- case 1:
- cout << endl << "Введите номер записи:";
- int key; cin >> key;
- for (int i = 0; i < vec.size(); i++) {
- if (vec[i]->number == key) {
- result = true;
- cout << "Найденная Вами запись: " << endl;
- cout << vec[i]->number << ") " << vec[i]->countSheets << " - " << vec[i]->type << " - " << vec[i]->price << endl;
- cout << "Вы хотите редактировать эту запись (номер записи редактироваться не будет)"
- << endl << "1 - да " << endl << "любое другое (целое) число - нет" << endl;
- int red; cin >> red;
- if (red == 1) {
- redaction(arrNotebooks, i);
- }
- break;
- }
- }
- if (result == false) {
- cout << "Запись не найдена!" << endl;
- }
- break;
- case 2: {
- cout << endl << "Введите цвет карандаша:";
- int cKey; cin >> cKey;
- for (int i = 0; i < vec.size(); i++) {
- if (vec[i]->countSheets == cKey) {
- result = true;
- cout << "Найденная Вами запись: " << endl;
- cout << vec[i]->number << ") " << vec[i]->countSheets << " - " << vec[i]->type << " - " << vec[i]->price << endl;
- cout << "Вы хотите редактировать эту запись (номер записи редактироваться не будет)"
- << endl << "1 - да " << endl << "любое другое (целое) число - нет" << endl;
- int red; cin >> red;
- if (red == 1) {
- redaction(arrNotebooks, i);
- }
- break;
- }
- }
- if (result == false) {
- cout << "Запись не найдена!" << endl;
- }
- break;
- }
- case 3:
- cout << endl << "Введите цену:";
- double priceKey; cin >> priceKey;
- for (int i = 0; i < vec.size(); i++) {
- if (vec[i]->price == priceKey) {
- result = true;
- cout << "Найденная Вами запись: " << endl;
- cout << vec[i]->number << ") " << vec[i]->countSheets << " - " << vec[i]->type << " - " << vec[i]->price << endl;
- cout << "Вы хотите редактировать эту запись (номер записи редактироваться не будет)"
- << endl << "1 - да " << endl << "любое другое (целое) число - нет" << endl;
- int red; cin >> red;
- if (red == 1) {
- redaction(arrNotebooks, i);
- }
- break;
- }
- }
- if (result == false) {
- cout << "Запись не найдена!" << endl;
- }
- break;
- case 4: {
- cout << endl << "Введите тип карандаша:";
- string typeKey; cin >> typeKey;
- for (int i = 0; i < vec.size(); i++) {
- if (vec[i]->type == typeKey) {
- result == true;
- cout << "Найденная Вами запись: " << endl;
- cout << vec[i]->number << ") " << vec[i]->countSheets << " - " << vec[i]->type << " - " << vec[i]->price << endl;
- cout << "Вы хотите редактировать эту запись (номер записи редактироваться не будет)"
- << endl << "1 - да " << endl << "любое другое (целое) число - нет" << endl;
- int red; cin >> red;
- if (red == 1) {
- redaction(arrNotebooks, i);
- }
- break;
- }
- }
- if (result == false) {
- cout << endl << "Запись не найдена!" << endl;
- }
- }
- }
- }
- // Метод, реализующий редактирование записей (используется в методе searchAndRedaction)
- void Notebook::redaction(vector<Notebook*> &vec, int i) {
- cin.get();
- cout << endl << "Введите количество страниц:";
- cin >> vec[i]->countSheets;
- cout << endl << "Введите тип карандаша:";
- getline(cin, vec[i]->type);
- cout << endl << "Введите цену канцелярского товара:" << endl;
- cin >> vec[i]->price;
- cout << "Ваша запись после редактирования:" << endl;
- cout << vec[i]->number << ") " << vec[i]->countSheets << " - " << vec[i]->type << " - " << vec[i]->price << endl;
- }
- // Метод, записывающий данные в бинарный файл
- void Notebook::saveInBinaryFile(vector<Notebook*> vec) {
- cout << endl;
- fstream fout;
- fout.open("NotebookBinary.txt", ios::out | ios::binary);
- if (fout.is_open()) {
- for (int i = 0; i < vec.size(); i++) {
- fout << vec[i]->number << " | ";
- fout << vec[i]->countSheets << " | ";
- fout << vec[i]->type << " | ";
- fout << vec[i]->price << endl;
- }
- fout.close();
- // Проверяем, была ли произведена запись в файл
- fout.open("NotebookBinary.txt", ios::in | ios::ate);
- if (fout.is_open()) {
- if (fout.tellg() > 0) {
- cout << "Запись в файл была успешно проведена!" << endl;
- } else {
- cout << "Запись в файл не была проведена из-за непредвиденной ошибки!!!" << endl;
- }
- } else {
- cout << "Непредвиденная ошибка (файл не открывается для проверки)! Рекомендуется проверить, были ли записаны данные в файл вручную!" << endl;
- }
- } else {
- cout << "Ошибка! Файл не может быть открыт!!" << endl;
- }
- }
- // Метод, записывающий данные из бинарного файла в массив
- void Notebook::loadFromBinaryFileInVector(vector<string> &vec) {
- cout << endl;
- fstream out("NotebookBinary.txt");
- string s;
- while (getline(out, s))
- vec.push_back(s);
- cout << "Данные, записанные из бинарного файла в массив" << endl;
- if (!vec.empty()) {
- for (vector<string>::iterator it = vec.begin(); it != vec.end(); ++it) {
- cout << (*it) << endl;
- }
- } else {
- cout << "Данные не были занесены в оперативную память компьютера!" << endl;
- }
- }
- // Метод, релизующий меню
- void Notebook::menu() {
- int action;
- while (true) {
- cout << endl << "Меню программы! Нажмите:" << endl << "0 - для завершения работы с программой;" <<
- endl << "1 - для записи данных;" << endl << "2 - для вывода данных (хранящихся в оперативной памяти) на экран;" <<
- endl << "3 - удаление записи из массива данных;" <<
- endl << "4 - сортировка данных;" <<
- endl << "5 - поиск и редактирование записей;" <<
- endl << "6 - запись данных в бинарный файл" <<
- endl << "7 - запись данных из бинарного файла в массив и вывод его на экран" << endl;
- cout << "Введите номер действия: ";
- cin >> action;
- switch (action) {
- case 0:
- exit(1);
- case 1:
- cout << endl;
- addData(arrNotebooks);
- break;
- case 2:
- cout << endl << "Введенная Вами структура данных о тетрадях будет выведена в формате: " << endl;
- cout << "Тип " << " - " << " Фирма производителя " << " - " << " Цена" << endl;
- outputData(arrNotebooks);
- break;
- case 3:
- cout << "Введите номер записи, которую Вы хотите удалить: ";
- int num; cin >> num;
- deleteElement(num, arrNotebooks);
- break;
- case 4:
- sorting(arrNotebooks);
- cout << "Отсортированные данные:" << endl;
- outputData(arrNotebooks);
- break;
- case 5:
- searchAndRedaction(arrNotebooks);
- break;
- case 6:
- saveInBinaryFile(arrNotebooks);
- break;
- case 7:
- loadFromBinaryFileInVector(arrStrNotebooks);
- }
- }
- }
- Pencils.h*
- #pragma once
- #include "Stationery.h"
- class Pencils :
- public Stationery {
- private:
- int number;
- string color;
- string type;
- double price;
- public:
- int getNumber();
- string getColor();
- string getType();
- double getPrice();
- void setNumber(int number);
- void setColor(string color);
- void setType(string type);
- void setPrice(double price);
- // Метод, выводящий данные о карандашах на экран
- void outputData(vector<Pencils*> vec);
- // Метод, реализующий ввод данных о карандашах с клавиатуры
- void addData(vector<Pencils*> &vec);
- // Метод, реализующий удаление элемента из массива данных
- void deleteElement(unsigned int num, vector<Pencils*> &vec);
- // Метод, реализующий сортировку данных в массиве
- void sorting(vector<Pencils*> &vec);
- // Метод, реализующий поиск и редактирование записей
- void searchAndRedaction(vector<Pencils*> vec);
- // Метод, реализующий редактирование записей (используется в методе searchAndRedaction)
- void redaction(vector<Pencils*> &vec, int i);
- // Метод, записывающий данные в бинарный файл
- void saveInBinaryFile(vector<Pencils*> vec);
- // Метод, записывающий данные из бинарного файла в массив
- void loadFromBinaryFileInVector(vector<string> &vec);
- // Метод, релизующий меню
- void menu();
- };
- Pencils.cpp
- #include "stdafx.h"
- #include "Pencils.h"
- #include <algorithm>
- vector<Pencils*> arrPencils;
- vector<string> strArrPencils;
- int Pencils::getNumber() {
- return number;
- }
- string Pencils::getColor() {
- return color;
- }
- string Pencils::getType() {
- return type;
- }
- double Pencils::getPrice() {
- return price;
- }
- void Pencils::setNumber(int number) {
- this->number = number;
- }
- void Pencils::setColor(string color) {
- this->color = color;
- }
- void Pencils::setType(string type) {
- this->type = type;
- }
- void Pencils::setPrice(double price) {
- this->price = price;
- }
- // Метод, выводящий данные о карандашах на экран
- void Pencils::outputData(vector<Pencils*> vec) {
- if (!vec.empty()) {
- for (vector<Pencils*>::iterator it = vec.begin(); it != vec.end(); ++it) {
- cout << (*it)->number << ")" << (*it)->color << " - " << (*it)->type
- << " - " << (*it)->price << endl;
- }
- } else {
- cout << "Данные не были занесены в оперативную память компьютера!" << endl;
- }
- }
- // Метод, реализующий ввод данных о карандашах с клавиатуры
- void Pencils::addData(vector<Pencils*> &vec) {
- int choice;
- do {
- cout << "Если данные были записаны ранее, то новые записи будут добавлены в конец массива!" << endl;
- cout << "Введите запись о канцелярских товарах!";
- Pencils pncls;
- cin.get();
- pncls.number = vec.size() + 1;
- cout << endl << "Введите цвет для " << vec.size() + 1 << " карандаша:";
- getline(cin, pncls.color);
- cout << endl << "Введите тип для " << vec.size() + 1 << " карандаша: ";
- getline(cin, pncls.type);
- cout << endl << "Введите цену " << vec.size() + 1 << " канцелярского товара:" << endl;
- cin >> pncls.price;
- vec.push_back(new Pencils(pncls));
- cout << endl << "Хотите ввести еще одну запись? 1 - да, любое другое число - нет." << endl;
- cin >> choice;
- cout << endl;
- } while (choice == 1);
- }
- // Метод, реализующий удаление элемента из массива данных
- void Pencils::deleteElement(unsigned int num, vector<Pencils*> &vec) {
- num--;
- if (num > vec.size()) {
- cout << "Такой записи не существует!" << endl;
- } else {
- vec.erase(vec.begin() + num);
- cout << "Запись удалена." << endl;
- }
- }
- struct PNumCmp {
- bool operator() (Pencils *a, Pencils *b) const {
- return a->getNumber() < b->getNumber();
- }
- };
- struct TypeCmp {
- bool operator() (Pencils *a, Pencils *b) const {
- return a->getType() < b->getType();
- }
- };
- struct ColorCmp {
- bool operator() (Pencils *a, Pencils *b) const {
- return a->getColor() < b->getColor();
- }
- };
- struct PriceCmp {
- bool operator() (Pencils *a, Pencils *b) const {
- return a->getPrice() < b->getPrice();
- }
- };
- // Метод, реализующий сортировку данных в массиве
- void Pencils::sorting(vector<Pencils*> &vec) {
- cout << endl << "Выберите действие: " << endl << "1 - сортировка по цене" << endl << "2 - по номеру (в порядке записи)" <<
- endl << "3 - по цвету" << endl << "4 - по типу" << endl;
- int srt; cin >> srt;
- switch (srt) {
- case 1:
- cout << "Сортировка по цене" << endl;
- sort(vec.begin(), vec.end(), PriceCmp());
- break;
- case 2:
- cout << "Сортировка по номеру (по порядку записи)" << endl;
- sort(vec.begin(), vec.end(), PNumCmp());
- break;
- case 3:
- cout << "Сортировка по цвету" << endl;
- sort(vec.begin(), vec.end(), ColorCmp());
- break;
- case 4:
- cout << "Сортировка по типу" << endl;
- sort(vec.begin(), vec.end(), TypeCmp());
- break;
- }
- }
- // Метод, реализующий поиск и редактирование записей
- void Pencils::searchAndRedaction(vector<Pencils*> vec) {
- cout << endl << "Сейчас Вы можете найти запись и её oтредактировать." << endl;
- cout << "По какому полю структуры Вы будете искать запись:" << endl << "1 - номер записи" << endl <<
- "2 - цвет карандаша" << endl << "3 - цена" << endl << "4 - тип карандаша" << endl << endl;;
- bool result = false;
- int choice; cin >> choice;
- switch (choice) {
- case 1:
- cout << endl << "Введите номер записи:";
- int key; cin >> key;
- for (int i = 0; i < vec.size(); i++) {
- if (vec[i]->number == key) {
- result = true;
- cout << "Найденная Вами запись: " << endl;
- cout << vec[i]->number << ") " << vec[i]->color << " - " << vec[i]->type << " - " << vec[i]->price << endl;
- cout << "Вы хотите редактировать эту запись (номер записи редактироваться не будет)"
- << endl << "1 - да " << endl << "любое другое (целое) число - нет" << endl;
- int red; cin >> red;
- if (red == 1) {
- redaction(arrPencils, i);
- }
- break;
- }
- }
- if (result == false) {
- cout << "Запись не найдена!" << endl;
- }
- break;
- case 2: {
- cout << endl << "Введите цвет карандаша:";
- string colKey; cin >> colKey;
- for (int i = 0; i < vec.size(); i++) {
- if (vec[i]->color.compare(colKey) == 0) {
- result = true;
- cout << "Найденная Вами запись: " << endl;
- cout << vec[i]->number << ") " << vec[i]->color << " - " << vec[i]->type << " - " << vec[i]->price << endl;
- cout << "Вы хотите редактировать эту запись (номер записи редактироваться не будет)"
- << endl << "1 - да " << endl << "любое другое (целое) число - нет" << endl;
- int red; cin >> red;
- if (red == 1) {
- redaction(arrPencils, i);
- }
- break;
- }
- }
- if (result == false) {
- cout << "Запись не найдена!" << endl;
- }
- break;
- }
- case 3:
- cout << endl << "Введите цену:";
- double priceKey; cin >> priceKey;
- for (int i = 0; i < vec.size(); i++) {
- if (vec[i]->price == priceKey) {
- result = true;
- cout << "Найденная Вами запись: " << endl;
- cout << vec[i]->number << ") " << vec[i]->color << " - " << vec[i]->type << " - " << vec[i]->price << endl;
- cout << "Вы хотите редактировать эту запись (номер записи редактироваться не будет)"
- << endl << "1 - да " << endl << "любое другое (целое) число - нет" << endl;
- int red; cin >> red;
- if (red == 1) {
- redaction(arrPencils, i);
- }
- break;
- }
- }
- if (result == false) {
- cout << "Запись не найдена!" << endl;
- }
- break;
- case 4: {
- cout << endl << "Введите тип карандаша:";
- string typeKey; cin >> typeKey;
- for (int i = 0; i < vec.size(); i++) {
- if (vec[i]->type == typeKey) {
- result == true;
- cout << "Найденная Вами запись: " << endl;
- cout << vec[i]->number << ") " << vec[i]->color << " - " << vec[i]->type << " - " << vec[i]->price << endl;
- cout << "Вы хотите редактировать эту запись (номер записи редактироваться не будет)"
- << endl << "1 - да " << endl << "любое другое (целое) число - нет" << endl;
- int red; cin >> red;
- if (red == 1) {
- redaction(arrPencils, i);
- }
- break;
- }
- }
- if (result == false) {
- cout << endl << "Запись не найдена!" << endl;
- }
- }
- }
- }
- // Метод, реализующий редактирование записей (используется в методе searchAndRedaction)
- void Pencils::redaction(vector<Pencils*> &vec, int i) {
- cin.get();
- cout << endl << "Введите цвет карандаша:";
- getline(cin, vec[i]->color);
- cout << endl << "Введите тип карандаша:";
- getline(cin, vec[i]->type);
- cout << endl << "Введите цену канцелярского товара:" << endl;
- cin >> vec[i]->price;
- cout << "Ваша запись после редактирования:" << endl;
- cout << vec[i]->number << ") " << vec[i]->color << " - " << vec[i]->type << " - " << vec[i]->price << endl;
- }
- // Метод, записывающий данные в бинарный файл
- void Pencils::saveInBinaryFile(vector<Pencils*> vec) {
- cout << endl;
- fstream fout;
- fout.open("PencilsBinary.txt", ios::out | ios::binary);
- if (fout.is_open()) {
- for (int i = 0; i < vec.size(); i++) {
- fout << vec[i]->number << " | ";
- fout << vec[i]->color << " | ";
- fout << vec[i]->type << " | ";
- fout << vec[i]->price << endl;
- }
- fout.close();
- // Проверяем, была ли произведена запись в файл
- fout.open("PencilsBinary.txt", ios::in | ios::ate);
- if (fout.is_open()) {
- if (fout.tellg() > 0) {
- cout << "Запись в файл была успешно проведена!" << endl;
- } else {
- cout << "Запись в файл не была проведена из-за непредвиденной ошибки!!!" << endl;
- }
- } else {
- cout << "Непредвиденная ошибка (файл не открывается для проверки)! Рекомендуется проверить, были ли записаны данные в файл вручную!" << endl;
- }
- } else {
- cout << "Ошибка! Файл не может быть открыт!!" << endl;
- }
- }
- // Метод, записывающий данные из бинарного файла в массив
- void Pencils::loadFromBinaryFileInVector(vector<string> &vec) {
- cout << endl;
- fstream out("PencilsBinary.txt");
- string s;
- while (getline(out, s))
- vec.push_back(s);
- cout << "Данные, записанные из бинарного файла в массив" << endl;
- if (!vec.empty()) {
- for (vector<string>::iterator it = vec.begin(); it != vec.end(); ++it) {
- cout << (*it) << endl;
- }
- } else {
- cout << "Данные не были занесены в оперативную память компьютера!" << endl;
- }
- }
- // Метод, реализующий меню
- void Pencils::menu() {
- int action;
- while (true) {
- cout << endl << "Меню программы! Нажмите:" << endl << "0 - для завершения работы с программой;" <<
- endl << "1 - для записи данных;" << endl << "2 - для вывода данных (хранящихся в оперативной памяти) на экран;" <<
- endl << "3 - удаление записи из массива данных;" <<
- endl << "4 - сортировка данных;" <<
- endl << "5 - поиск и редактирование записей;" <<
- endl << "6 - запись данных в бинарный файл" <<
- endl << "7 - запись данных из бинарного файла в массив и вывод его на экран" << endl;
- cout << "Введите номер действия: ";
- cin >> action;
- switch (action) {
- case 0:
- exit(1);
- case 1:
- cout << endl;
- addData(arrPencils);
- break;
- case 2:
- cout << endl << "Введенная Вами структура данных о карандашах будет выведена в формате: " << endl;
- cout << "Тип " << " - " << " Фирма производителя " << " - " << " Цена" << endl;
- outputData(arrPencils);
- break;
- case 3:
- cout << "Введите номер записи, которую Вы хотите удалить: ";
- int num; cin >> num;
- deleteElement(num, arrPencils);
- break;
- case 4:
- sorting(arrPencils);
- cout << "Отсортированные данные:" << endl;
- outputData(arrPencils);
- break;
- case 5:
- searchAndRedaction(arrPencils);
- break;
- case 6:
- saveInBinaryFile(arrPencils);
- break;
- case 7:
- loadFromBinaryFileInVector(strArrPencils);
- }
- }
- }
- Stationery.h
- #pragma once
- #include <string>
- #include <vector>
- #include <iostream>
- #include <fstream>
- using namespace std;
- class Stationery {
- private:
- int number;
- string firm;
- double price;
- public:
- void setNumber(int number);
- void setFirm(string firm);
- void setPrice(double price);
- int getNumber();
- string getFirm();
- double getPrice();
- // Метод, выводящий данные на экран
- virtual void outputData(vector<Stationery*> vec);
- // Метод, реализующий ввод данных с клавиатуры
- virtual void addData(vector<Stationery*> &vec);
- // Метод, реализующий удаление элемента из массива данных
- virtual void deleteElement(unsigned int num, vector<Stationery*> &vec);
- // Метод, реализующий сортировку данных в массиве
- virtual void sorting(vector<Stationery*> &vec);
- // Метод, реализующий поиск и редактирование записей
- virtual void searchAndRedaction(vector<Stationery*> vec);
- // Метод, реализующий редактирование записей (используется в методе searchAndRedaction)
- virtual void redaction(vector<Stationery*> &vec, int i);
- // Метод, записывающий данные в бинарный файл
- virtual void saveInBinaryFile(vector<Stationery*> vec);
- // Метод, записывающий данные из бинарного файла в массив
- virtual void loadFromBinaryFileInVector(vector<string> &vec);
- // Метод, реализующий меню
- virtual void menu();
- };
- Stationery.cpp
- #include "stdafx.h"
- #include "Stationery.h"
- #include <algorithm>
- vector<Stationery*> arrStationery;
- vector<string> arrData;
- void Stationery::setNumber(int number) {
- this->number = number;
- }
- void Stationery::setFirm(string firm) {
- this->firm = firm;
- }
- void Stationery::setPrice(double price) {
- this->price = price;
- }
- int Stationery::getNumber() {
- return number;
- }
- string Stationery::getFirm() {
- return firm;
- }
- double Stationery::getPrice() {
- return price;
- }
- // Метод, выводящий данные на экран
- void Stationery::outputData(vector<Stationery*> vec) {
- if (!vec.empty()) {
- for (vector<Stationery*>::iterator it = vec.begin(); it != vec.end(); ++it) {
- cout << (*it)->getNumber() << ")" << " - " << (*it)->getFirm()
- << " - " << (*it)->getPrice() << endl;
- }
- } else {
- cout << "Данные не были занесены в оперативную память компьютера!" << endl;
- }
- }
- // Метод, реализующий ввод данных с клавиатуры
- void Stationery::addData(vector<Stationery*> &vec) {
- int choice;
- do {
- cout << "Если данные были записаны ранее, то новые записи будут добавлены в конец массива!" << endl;
- cout << "Введите запись о канцелярских товарах!";
- Stationery stat;
- cin.get();
- stat.setNumber(vec.size() + 1);
- cout << endl << "Введите название фирмы производителя для " << vec.size() + 1 << " канцелярского товара:" << endl;
- getline(cin, stat.firm);
- cout << endl << "Введите цену " << vec.size() + 1 << " канцелярского товара:" << endl;
- cin >> stat.price;
- vec.push_back(new Stationery(stat));
- cout << endl << "Хотите ввести еще одну запись? 1 - да, любое другое число - нет." << endl;
- cin >> choice;
- cout << endl;
- } while (choice == 1);
- }
- // Метод, реализующий удаление элемента из массива данных
- void Stationery::deleteElement(unsigned int num, vector<Stationery*> &vec) {
- num--;
- if (num > vec.size()) {
- cout << "Такой записи не существует!" << endl;
- } else {
- vec.erase(vec.begin() + num);
- cout << "Запись удалена." << endl;
- }
- }
- struct PriceCmp {
- bool operator()(Stationery *a, Stationery *b) const {
- return a->getPrice() < b->getPrice();
- }
- };
- struct NumCmp {
- bool operator()(Stationery *a, Stationery *b) const {
- return a->getNumber() < b->getNumber();
- }
- };
- struct FirmCmp {
- bool operator()(Stationery *a, Stationery *b) const {
- return a->getFirm() < b->getFirm();
- }
- };
- // Метод, реализующий сортировку данных в массиве
- void Stationery::sorting(vector<Stationery*> &vec) {
- cout << endl << "Выберите действие: " << endl << "1 - сортировка по цене" << endl << "2 - по номеру (в порядке записи)" <<
- endl << "3 - по названию фирмы" << endl;
- int srt; cin >> srt;
- switch (srt) {
- case 1:
- cout << "Сортировка по цене" << endl;
- sort(vec.begin(), vec.end(), PriceCmp());
- break;
- case 2:
- cout << "Сортировка по номеру (по порядку записи)" << endl;
- sort(vec.begin(), vec.end(), NumCmp());
- break;
- case 3:
- cout << "Сортировка по названию фирмы" << endl;
- sort(vec.begin(), vec.end(), FirmCmp());
- break;
- }
- }
- // Метод, реализующий поиск и редактирование записей
- void Stationery::searchAndRedaction(vector<Stationery*> vec) {
- cout << endl << "Сейчас Вы можете найти запись и её oтредактировать." << endl;
- cout << "По какому полю структуры Вы будете искать запись:" << endl << "1 - номер записи" << endl <<
- "2 - название фирмы" << endl << "3 - цена" << endl << endl;
- bool result = false;
- int choice; cin >> choice;
- switch (choice) {
- case 1:
- cout << endl << "Введите номер записи:" << endl;
- int key; cin >> key;
- for (int i = 0; i < vec.size(); i++) {
- if (vec[i]->number == key) {
- result = true;
- cout << "Найденная Вами запись: " << endl;
- cout << vec[i]->number << ") " << vec[i]->firm << " - " << vec[i]->price << endl;
- cout << "Вы хотите редактировать эту запись (номер записи редактироваться не будет)"
- << endl << "1 - да " << endl << "любое другое (целое) число - нет" << endl;
- int red; cin >> red;
- if (red == 1) {
- redaction(arrStationery, i);
- }
- break;
- }
- }
- if (result == false) {
- cout << "Запись не найдена!" << endl;
- }
- break;
- case 2: {
- cout << endl << "Введите название фирмы:" << endl;
- string firmKey; cin >> firmKey;
- for (int i = 0; i < vec.size(); i++) {
- if (vec[i]->firm.compare(firmKey) == 0) {
- result = true;
- cout << "Найденная Вами запись: " << endl;
- cout << vec[i]->number << ") " << vec[i]->firm << " - " << vec[i]->price << endl;
- cout << "Вы хотите редактировать эту запись (номер записи редактироваться не будет)"
- << endl << "1 - да " << endl << "любое другое (целое) число - нет" << endl;
- int red; cin >> red;
- if (red == 1) {
- redaction(arrStationery, i);
- }
- break;
- }
- }
- if (result == false) {
- cout << "Запись не найдена!" << endl;
- }
- break;
- }
- case 3:
- cout << endl << "Введите цену:" << endl;
- double priceKey; cin >> priceKey;
- for (int i = 0; i < vec.size(); i++) {
- if (vec[i]->price == priceKey) {
- result = true;
- cout << "Найденная Вами запись: " << endl;
- cout << vec[i]->number << ") " << vec[i]->firm << " - " << vec[i]->price << endl;
- cout << "Вы хотите редактировать эту запись (номер записи редактироваться не будет)"
- << endl << "1 - да " << endl << "любое другое (целое) число - нет" << endl;
- int red; cin >> red;
- if (red == 1) {
- redaction(arrStationery, i);
- }
- break;
- }
- }
- if (result == false) {
- cout << "Запись не найдена!" << endl;
- }
- break;
- }
- }
- // Метод, реализующий редактирование записей (используется в методе searchAndRedaction)
- void Stationery::redaction(vector<Stationery*> &vec, int i) {
- cin.get();
- cout << endl << "Введите название фирмы производителя канцелярского товара:" << endl;
- getline(cin, vec[i]->firm);
- cout << endl << "Введите цену канцелярского товара:" << endl;
- cin >> vec[i]->price;
- cout << "Ваша запись после редактирования:" << endl;
- cout << vec[i]->number << ") " << vec[i]->firm << " - " << vec[i]->price << endl;
- }
- // Метод, записывающий данные в бинарный файл
- void Stationery::saveInBinaryFile(vector<Stationery*> vec) {
- cout << endl;
- fstream fout;
- fout.open("StationeryBinary.txt", ios::out | ios::binary);
- if (fout.is_open()) {
- for (int i = 0; i < vec.size(); i++) {
- fout << vec[i]->number << " | ";
- fout << vec[i]->firm << " | ";
- fout << vec[i]->price << endl;
- }
- fout.close();
- // Проверяем, была ли произведена запись в файл
- fout.open("StationeryBinary.txt", ios::in | ios::ate);
- if (fout.is_open()) {
- if (fout.tellg() > 0) {
- cout << "Запись в файл была успешно проведена!" << endl;
- } else {
- cout << "Запись в файл не была проведена из-за непредвиденной ошибки!!!" << endl;
- }
- } else {
- cout << "Непредвиденная ошибка (файл не открывается для проверки)! Рекомендуется проверить, были ли записаны данные в файл вручную!" << endl;
- }
- } else {
- cout << "Ошибка! Файл не может быть открыт!!" << endl;
- }
- }
- // Метод, записывающий данные из бинарного файла в массив
- void Stationery::loadFromBinaryFileInVector(vector<string> &vec) {
- cout << endl;
- fstream out("StationeryBinary.txt");
- string s;
- while (getline(out, s))
- vec.push_back(s);
- cout << "Данные, записанные из бинарного файла в массив" << endl;
- if (!vec.empty()) {
- for (vector<string>::iterator it = vec.begin(); it != vec.end(); ++it) {
- cout << (*it) << endl;
- }
- } else {
- cout << "Данные не были занесены в оперативную память компьютера!" << endl;
- }
- }
- // Метод, реализующий меню
- void Stationery::menu() {
- int action;
- while (true) {
- cout << endl << "Нажмите:" << endl << "0 - для завершения работы с программой;" <<
- endl << "1 - для записи данных;" << endl << "2 - для вывода данных (хранящихся в оперативной памяти) на экран;" <<
- endl << "3 - удаление записи из массива данных;" <<
- endl << "4 - сортировка данных;" <<
- endl << "5 - поиск и редактирование записей;" <<
- endl << "6 - запись данных в бинарный файл" <<
- endl << "7 - запись данных из бинарного файла в массив и вывод его на экран" << endl;
- cout << "Введите номер действия: ";
- cin >> action;
- switch (action) {
- case 0:
- exit(1);
- case 1:
- cout << endl;
- addData(arrStationery);
- break;
- case 2:
- cout << endl << "Введенная Вами структура данных о канцелярских товарах будет выведена в формате: " << endl;
- cout << "Тип " << " - " << " Фирма производителя " << " - " << " Цена" << endl;
- outputData(arrStationery);
- break;
- case 3:
- cout << "Введите номер записи, которую Вы хотите удалить: ";
- int num; cin >> num;
- deleteElement(num, arrStationery);
- break;
- case 4:
- sorting(arrStationery);
- cout << "Отсортированные данные:" << endl;
- outputData(arrStationery);
- break;
- case 5:
- searchAndRedaction(arrStationery);
- break;
- case 6:
- saveInBinaryFile(arrStationery);
- break;
- case 7:
- loadFromBinaryFileInVector(arrData);
- }
- }
- }
- Lb_6.cpp
- /*Лабораторная работа №6
- Использование полиморфизма, наследования и абстрактных классов
- Работу выполнили студенты II-АИТ-3
- Батейщиков Д.А. и Симонов А.А.*/
- #include "stdafx.h"
- #include <Windows.h>
- #include "Stationery.h"
- #include "Pencils.h"
- #include "Notebook.h"
- void menu() {
- Stationery *p;
- Stationery stat;
- Pencils pncls;
- Notebook ntbk;
- int action;
- while (true) {
- cout << "Меню программы! Нажмите: 1 - для работы с общими данными о канцелярских товарах;" <<
- endl << "2 - для работы с данными о карандашах;" <<
- endl << "3 - для работы с данными о тетрадях;" <<
- endl;
- cout << "Введите номер действия:"; cin >> action;
- switch (action) {
- case 0:
- exit(1);
- case 1:
- p = &stat;
- p->menu();
- break;
- case 2:
- p = &pncls;
- p->menu();
- break;
- case 3:
- p = &ntbk;
- p->menu();
- break;
- }
- }
- }
- int main()
- {
- // Русификация
- SetConsoleCP(1251);
- SetConsoleOutputCP(1251);
- cout << "Copyright by BSC (Bateyshikov & Simonov Corporation)." << endl;
- cout << "Здравствуйте!" << endl << "Запущена программа для создание структуры данных канцелярских товаров." << endl;
- menu();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement