Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*Программа демонстрирует работу склада, возможности создавать базу и добавлять в неё товар, удалять товар из базы, искать по названию, сортировать по названию, цене, артикулу, кол-ву, вносить изменения в товары, удалять базу, открывать существующую базу и работать с ней*/
- #include "pch.h"
- #include <iostream> // библиотека операций ввода / вывода
- #include <string> // библиотека для работы со строками
- #include <string.h> // библиотека для работы со строками
- #include <vector> // библиотека для использования vector'ов
- #include <algorithm> // библиотека для использования алгоритма swap
- #include <fstream> // библиотека для использования файловых потоков
- using namespace std; // пространство имен std
- int Enter_choice(int diapason); // функция для проверки ввода "выбора"
- int Enter_number(int diapason); // функция для проверки ввода номера товара
- string Enter_string(); // функция для проверки ввода названия и артикула товара
- int Enter_int(); // функция для проверки кол-ва товара
- float Enter_float(); // функция для проверки цены товара
- struct product // структура, описывающая товар
- {
- string name; // название товара
- string artikul; // артикул товара
- float price; // цена товара
- int volume; // кол-во товара на складе
- };
- int main()
- {
- setlocale(LC_ALL, "Russian"); // дает возможность выводить текст на русском языке
- vector <product> sklad; // "векторный" массив структур(товаров)
- product buffer; // буфер, через который будем заполнять массив
- string fileName; // переменная будет хранить названия файлов
- bool flag = false; // индикатор ошибки открытия/записи/чтения файла
- int choice; // переменная выбора действий интерфейса
- cout << "Варианты действий:\n" // выбор действий
- << "1. Добавить товары заново\n"
- << "2. Хотите открыть существующую базу\n"
- << "Выберете желаемый вариант: ";
- choice = Enter_choice(2); // ввод варианта через функцию с проверкой
- if (choice == 2) // если хочешь открыть существующую базу
- {
- ifstream fin; // открываем поток считывания с файла
- fin.open("Names.txt"); // открываем файл в котором хранятся названия товаров
- if (!fin.is_open()) // если файл не открыт, то его не существует
- {
- emptyFile: // метка от перехода, если файл "Names.txt" пуст
- cout << "\nСуществующей базы данных не найдено!\n" // выводим предупреждение
- << "1. Добавить товары заново\n"
- << "2. Закрыть программу\n"
- << "Выберете желаемый вариант: "; // делаем выбор
- choice = Enter_choice(2); // ввод варианта через функцию с проверкой
- if (choice == 1) // если хотим добавить товары заново
- goto Enter; // то переходим по метке к "добавлению"
- else // если хотим закрыть программу
- return 0; // то завершаем
- }
- else // если файл "Names.txt" с названиями товаров открылся
- {
- while (!fin.eof()) // пока файл имен не закончится
- {
- getline(fin, buffer.name); // считываем названия товаров/файлов
- sklad.push_back(buffer); // добавляем считанное название в новый элемент массива
- }
- }
- fin.close(); // закрываем файл в котором хранятся названия товаров
- // проверка на пустоту файла названий "Names.txt", если файл пуст, то нет базы данных
- if (sklad[0].name == "") // если первое название "пустое", то и файл пуст
- {
- remove("Names.txt"); // удаляем файл названий "Names.txt"
- sklad.erase(sklad.begin()); //удаляем элемент массива который заполнен пустым названием
- goto emptyFile; // переход к части кода "Базы данных не существует"
- }
- for (int i = 0; i < sklad.size(); i++) // цикл от первого до последнего товара в массиве товаров
- {
- fin.open(sklad[i].name + ".txt"); // открываем файл с названием считанным из файла
- if (!fin.is_open()) // если файл не открылся
- {
- flag = true; // установить индикатор "true"
- }
- else // если файл открылся
- {
- fin >> sklad[i].artikul; // считываем артикул товара
- fin >> sklad[i].price; // считываем цену товара
- fin >> sklad[i].volume; // считываем кол-во товара
- }
- fin.close(); // закрываем файл с названием считанным из файла
- }
- if (flag) // если флаг "true", значит ошибка
- {
- cout << "\nОшибка считывания данных!\n"; // выводим предупреждение об ошибке
- return 0; // завершить программу
- }
- else // если флаг "false", значит успех
- {
- cout << "\nДанные успешно считались!\n"; // выводим информацию об успехе
- /*УДАЛЯЕМ ВСЕ ФАЙЛЫ*/
- if (remove("Names.txt") != 0) // удаляем файл названий "Names.txt"
- flag = true; // если файл не удален делаем флаг "true"
- for (int i = 0; i < sklad.size(); i++) // цикл по всему массиву товаров
- {
- fileName = sklad[i].name + ".txt"; // записываем название файла исходя из названия товара
- char fileName_char[101]; // преобразование из string в char
- strcpy_s(fileName_char, fileName.c_str()); // тк remove не работает со string
- if (remove(fileName_char) != 0) // удаляем файлы товаров
- flag = true; // если файл не удален делаем флаг "true"
- }
- if (flag) // если флаг "true"
- {
- cout << "Ошибка!"; // выводим ошибку
- return 0; // завершаем программу
- }
- }
- }
- if (choice == 1) // если добавляем товары заново
- {
- ifstream fin; // открываем поток считывания
- fin.open("Names.txt"); // открываем файл имен
- if (!fin.is_open()) // если файл не открыт, значит его нет
- {
- goto Enter; // тогда переходим к добавлению
- }
- else // если файл открыт
- {
- while (!fin.eof()) // пока файл названий "Names.txt" не закончился
- {
- getline(fin, buffer.name); // считываем названия в буфер
- sklad.push_back(buffer); // добавляем буфер в элемент массива
- }
- for (int i = 0; i < sklad.size(); i++) // в цикле по всем товарам удаляем их
- {
- fileName = sklad[i].name + ".txt"; // записываем название файла исходя из названия товара
- char fileName_char[101]; //преобразование из string в char
- strcpy_s(fileName_char, fileName.c_str()); // тк remove не работает со string
- remove(fileName_char); // удаляем файл
- }
- }
- fin.close(); // закрываем файл имен "Names.txt"
- remove("Names.txt"); // удаляем файл имен "Names.txt"
- for (int i = sklad.size() - 1; i >= 0; i--) // в цикле от последнего до первого товара в массиве
- sklad.erase(sklad.begin() + i); // удаляем элементы из массива(товары)
- }
- /*ВВОД СПИСКА ТОВАРОВ*/
- while (choice == 1) // пока хотим добавить новые товары
- {
- Enter: // метка на ввод данных
- /*Вводим информацию о товаре в буфер*/
- cout << "\nВведите название товара: ";
- cin.ignore(32767, '\n'); // игнорим "Enter" для getline
- buffer.name = Enter_string();
- cout << "Введите артикул товара: ";
- buffer.artikul = Enter_string();
- cout << "Введите цену товара: ";
- buffer.price = Enter_float();
- cout << "Введите количество товара на складе (в шт.): ";
- buffer.volume = Enter_int();
- sklad.push_back(buffer); // добавляем новый элемент массива и записываем в него буфер
- cout << "\nХотите добавить новый товар на склад?\n" // добавлять ли товар?
- << "1. Да\n"
- << "2. Нет\n"
- << "Выберете желаемый вариант: ";
- choice = Enter_choice(2); // вводим вариант через функцию с проверкой
- }
- /*После ввода*/
- if (choice == 2) // если товары больше не добавляем
- {
- /*ПЕРВИЧНЫЙ ВЫВОД*/
- cout << "\nСписок товаров:" << endl;
- for (int i = 0; i < sklad.size(); i++)
- {
- cout << i + 1 << " товар: " << endl;
- cout << "Название товара: " << sklad[i].name << endl;
- cout << "Артикул товара: " << sklad[i].artikul << endl;
- cout << "Цена товара: " << sklad[i].price << endl;
- cout << "Количество товара на складе (в шт.): " << sklad[i].volume << endl;
- cout << endl;
- }
- /*ОПЦИИ*/
- options: // метка на выбор опций
- cout << "\nСписок дальнейших действий:\n" //вывод возможных опций
- << "1. Внести изменения\n"
- << "2. Сортировать товары\n"
- << "3. Добавить товар\n"
- << "4. Удалить товар\n"
- << "5. Поиск товара по названию\n"
- << "6. Cохранить данные и выйти\n"
- << "Выберете желаемый вариант: ";
- choice = Enter_choice(6); // вводим вариант через функцию с проверкой
- switch (choice) // выбор опции в зависимости от выбранной
- {
- case 1:
- {
- int *number = new int; // номер товара
- cout << "\nВведите номер товара, в котором хотите произвести изменение: "; // номер товара
- *number = Enter_number(sklad.size()); // вводим номер через функцию с проверкой
- cout << "\nВ какой графе хотите сделать изменение?\n" // где делать изменение?
- << "1. Название товара\n"
- << "2. Артикул товара\n"
- << "3. Цена товара\n"
- << "4. Количество товара на складе (в шт.)\n"
- << "Введите номер выбранного варианта: ";
- choice = Enter_choice(4); //// вводим вариант через функцию с проверкой
- /*РЕАЛИЗАЦИЯ ИЗМЕНЕНИЯ*/
- switch (choice) // выбор изменения в зависимости от выбранного
- {
- case 1:
- {
- cout << "\nВведите новое название товара: ";
- cin.ignore(32767, '\n'); // игнорим "Enter" для getline
- sklad[*number - 1].name = Enter_string(); // вводим новое название с помощью функции с проверкой
- }
- break;
- case 2:
- {
- cout << "\nВведите новое значение артикула товара: ";
- cin.ignore(32767, '\n'); // игнорим "Enter" для getline
- sklad[*number - 1].artikul = Enter_string(); // вводим новый артикул с помощью функции с проверкой
- }
- break;
- case 3:
- {
- cout << "\nВведите новую цену товара: ";
- sklad[*number - 1].price = Enter_float(); // вводим новую цену с помощью функции с проверкой
- }
- break;
- case 4:
- {
- cout << "\nВведите новое значения кол-ва товара на складе (в шт.): ";
- sklad[*number - 1].volume = Enter_int(); // вводим новое кол-во товара с помощью функции с проверкой
- }
- break;
- default:
- break;
- }
- delete number;
- /*ВЫВОД ИЗМЕНЕННЫХ ТОВАРОВ*/
- cout << "\nСписок измененных товаров товаров:" << endl;
- for (int i = 0; i < sklad.size(); i++)
- {
- cout << i + 1 << " товар: " << endl;
- cout << "Название товара: " << sklad[i].name << endl;
- cout << "Артикул товара: " << sklad[i].artikul << endl;
- cout << "Цена товара: " << sklad[i].price << endl;
- cout << "Количество товара на складе (в шт.): " << sklad[i].volume << endl;
- cout << endl;
- }
- /*ПРОВЕРКА (продолжить/завершить)*/
- cout << "\nВыберете дальнейшее действие:\n"
- << "1. Продолжить работу\n"
- << "2. Cохранить данные и выйти\n"
- << "Введите номер выбранного варианта: ";
- choice = Enter_choice(2); // вводим вариант через функцию с проверкой
- if (choice == 1) // если продолжить работу
- goto options; // то переходим к выбору опций
- else // если выход из программы
- goto escape; // то переход к сохранению
- }
- break;
- case 2:
- {
- cout << "\nХотите сортировать товар по:\n" // выбор метода сортировки
- << "1. Названию\n"
- << "2. Артикулу\n"
- << "3. Цене\n"
- << "4. Количеству\n"
- << "Выберете желаемый вариант: ";
- choice = Enter_choice(4); // вводим вариант через функцию с проверкой
- /*РЕАЛИЗАЦИЯ СОРТИРОВКИ (в зависимости от метода)*/
- switch (choice)
- {
- case 1: //сортировка по алфавиту
- {
- for (int i = 0; i < sklad.size(); i++) {
- for (int j = 0; j < sklad.size() - i - 1; j++) {
- if (sklad[j].name.compare(sklad[j + 1].name) > 0) {
- swap(sklad[j], sklad[j + 1]);
- }
- }
- }
- }
- break;
- case 2: //сортировка по артикулу (возрастание)
- {
- for (int i = 0; i < sklad.size(); i++) {
- for (int j = 0; j < sklad.size() - i - 1; j++) {
- if (sklad[j].artikul.compare(sklad[j + 1].artikul) > 0) {
- swap(sklad[j], sklad[j + 1]);
- }
- }
- }
- }
- break;
- case 3: //сортировка по цене (возрастание)
- {
- for (int i = 0; i < sklad.size(); i++) {
- for (int j = 0; j < sklad.size() - i - 1; j++) {
- if (sklad[j].price > sklad[j + 1].price) {
- swap(sklad[j], sklad[j + 1]);
- }
- }
- }
- }
- break;
- case 4: //сортировка по количеству (возрастание)
- {
- for (int i = 0; i < sklad.size(); i++) {
- for (int j = 0; j < sklad.size() - i - 1; j++) {
- if (sklad[j].volume > sklad[j + 1].volume) {
- swap(sklad[j], sklad[j + 1]);
- }
- }
- }
- }
- default:
- break;
- }
- /*ВЫВОД ОТСОРТИРОВАННЫХ ТОВАРОВ*/
- cout << "\nСписок отсортированных товаров:" << endl;
- for (int i = 0; i < sklad.size(); i++)
- {
- cout << i + 1 << " товар: " << endl;
- cout << "Название товара: " << sklad[i].name << endl;
- cout << "Артикул товара: " << sklad[i].artikul << endl;
- cout << "Цена товара: " << sklad[i].price << endl;
- cout << "Количество товара на складе (в шт.): " << sklad[i].volume << endl;
- cout << endl;
- }
- /*ПРОВЕРКА (продолжить/завершить)*/
- cout << "\nВыберете дальнейшее действие:\n"
- << "1. Продолжить работу\n"
- << "2. Cохранить данные и выйти\n"
- << "Введите номер выбранного варианта: ";
- choice = Enter_choice(2); // вводим вариант через функцию с проверкой
- if (choice == 1) // если продолжить работу
- goto options; // то переходим к выбору опций
- else // если выход из программы
- goto escape; // то переход к сохранению
- }
- break;
- case 3: /*ДОБАВЛЕНИЕ ТОВАРА*/
- {
- goto Enter; // переход по метке для добавления товара (в начало)
- }
- break;
- case 4: /*УДАЛЕНИЕ ЭЛЕМЕНТА*/
- {
- int *number = new int; // номер товара
- cout << "\nВведите номер товара, который хотите удалить: ";
- *number = Enter_number(sklad.size()); // ввод номера товара через функцию с проверкой
- sklad.erase(sklad.begin() + *number - 1); // удаляем элемент массива с данным номером(номер - 1)
- /*ВЫВОД ТОВАРОВ С УЧЕТОМ УДАЛЕНИЯ*/
- cout << "\nНовый список товаров:" << endl;
- for (int i = 0; i < sklad.size(); i++)
- {
- cout << i + 1 << " товар: " << endl;
- cout << "Название товара: " << sklad[i].name << endl;
- cout << "Артикул товара: " << sklad[i].artikul << endl;
- cout << "Цена товара: " << sklad[i].price << endl;
- cout << "Количество товара на складе (в шт.): " << sklad[i].volume << endl;
- cout << endl;
- }
- delete number;
- /*ПРОВЕРКА (продолжить/завершить)*/
- cout << "\nВыберете дальнейшее действие:\n"
- << "1. Продолжить работу\n"
- << "2. Cохранить данные и выйти\n"
- << "Введите номер выбранного варианта: ";
- choice = Enter_choice(2); // вводим вариант через функцию с проверкой
- if (choice == 1) // если продолжить работу
- goto options; // то переходим к выбору опций
- else // если выход из программы
- goto escape; // то переход к сохранению
- }
- break;
- case 5:
- {
- /*ПОИСК ПО ИМЕНИ*/
- string search; // будет хранить название искомого товара
- int k = 0; //счетчик
- cout << "\nВведите название товара: ";
- cin.ignore(32767, '\n'); // игнорим "Enter" для getline
- getline(cin, search); // вводим название искомого товара
- cout << endl;
- for (int i = 0; i < sklad.size(); i++) // в цикле сравниваем введенное название с названиями товаров
- {
- if (search == sklad[i].name) // если введенное название = названию товара, то выводим его
- {
- cout << i + 1 << " товар: " << endl;
- cout << "Название товара: " << sklad[i].name << endl;
- cout << "Артикул товара: " << sklad[i].artikul << endl;
- cout << "Цена товара: " << sklad[i].price << endl;
- cout << "Количество товара на складе (в шт.): " << sklad[i].volume << endl;
- cout << endl;
- k++; // увеличиваем счетчик
- }
- }
- if (k == 0) // если счетчик остался 0, то выводим предупреждение
- cout << "Товар с данным названием не найден!" << endl;
- /*ПРОВЕРКА (продолжить/завершить)*/
- cout << "\nВыберете дальнейшее действие:\n"
- << "1. Продолжить работу\n"
- << "2. Cохранить данные и выйти\n"
- << "Введите номер выбранного варианта: ";
- choice = Enter_choice(2); // вводим вариант через функцию с проверкой
- if (choice == 1) // если продолжить работу
- goto options; // то переходим к выбору опций
- else // если выход из программы
- goto escape; // то переход к сохранению
- }
- break;
- case 6:
- {
- /*ВЫХОД ИЗ ПРОГРАММЫ*/ /*ЗАПИСЬ В ФАЙЛ*/
- escape: // метка на сохранение
- ofstream fout; // открываем поток записи в файл
- fout.open("Names.txt"); // открываем файл с названиями товаров "Names.txt"
- if (!fout.is_open()) // если файл не открылся
- {
- flag = true; // делаем флаг "true"
- }
- else // если файл открылся
- {
- for (int i = 0; i < sklad.size(); i++) // записываем все названия товаров в него
- {
- if (i != sklad.size() - 1) // последний товар записываем без перехода на новую строку
- fout << sklad[i].name << "\n";
- else
- fout << sklad[i].name;
- }
- }
- fout.close(); // закрываем файл с названиями товаров "Names.txt"
- for (int i = 0; i < sklad.size(); i++) // для всех товаров
- {
- fileName = sklad[i].name + ".txt"; // устанавливаем название файла относительно названию товаров
- fout.open(fileName); // открываем файл товара
- if (!fout.is_open()) // если не открылся
- {
- flag = true; // делаем флаг "true"
- }
- else // если файл открылся записываем в него
- {
- fout << sklad[i].artikul << "\n"; // артикул товара
- fout << sklad[i].price << "\n"; // цену товара
- fout << sklad[i].volume << "\n"; // кол-во товара на складе
- }
- fout.close(); // закрываем файл товара
- }
- if (flag) // если флаг "true" выводим ошибку
- {
- cout << "\nОшибка сохранения данных!\n";
- }
- else // если флаг "false" выводим успех
- {
- cout << "\nДанные успешно сохранились!\n";
- }
- }
- break;
- default:
- break;
- }
- }
- }
- int Enter_choice(int diapason) //функция для проверки ввода "выбора" (передаем кол-во вариантов)
- {
- string str;
- diapason += 48; // код значения символа верхней границы диапазона
- again: // метка на повторный ввод
- cin >> str; // вводим строку
- if ((str[0] < '1' || str[0] > diapason) || str[1] != '\0') // если число не в нужном диапазоне
- {
- cout << "Ошибка ввода!\nВведите число заново: "; // выводим ошибку
- goto again; // метка к повторному вводу
- }
- return stoi(str); // конвертируем Int
- }
- int Enter_number(int diapason) // функция для проверки ввода номера числа (передаем кол-во товаров)
- {
- string str;
- int number;
- again: // метка на повторный ввод
- cin >> str; // вводим строку
- for (int i = 0; i < str.length(); i++) // проходим по всей строке
- {
- if (str[i] < '0' || str[i] > '9') // если есть символы не цифр
- {
- cout << "Ошибка ввода!\nВведите число заново: "; // выводим ошибку
- goto again; // метка к повторному вводу
- }
- }
- number = stoi(str); // конвертируем и присваиваем номер в переменную
- if (number < 1 || number > diapason) // если номер не в диапазоне существующих товаров
- {
- cout << "Товара с таким номером нет на складе!\nВведите число заново: "; // выводим ошибку
- goto again; // метка к повторному вводу
- }
- return number; // возвращаем номер товара
- }
- string Enter_string() // функция для проверки ввода названия и артикула товара
- {
- string str;
- again: // метка на повторный ввод
- getline(cin, str); // вводим строку
- if (str.length() > 100) // если длина строки больше 100
- {
- cout << "Длина превышает 100 символов, введите заново: "; // выводим ошибку
- goto again; // метка к повторному вводу
- }
- return str; // возвращаем строку
- }
- int Enter_int() // функция для проверки ввода кол-ва товаров на складе
- {
- string str;
- again: // метка на повторный ввод
- cin >> str; // вводим строку
- for (int i = 0; i < str.length(); i++) // проходим по всей строке
- {
- if (str[i] < '0' || str[i] > '9') // есть символы не цифр
- {
- cout << "Ошибка ввода!\nВведите число заново: "; // выводим ошибку
- goto again; // метка к повторному вводу
- }
- }
- return stoi(str); // конвертируем Int
- }
- float Enter_float() // функция для проверки ввода цены товара
- {
- string str;
- again: // метка на повторный ввод
- int tochka = 0; // счетчик запятых
- cin >> str; // вводим строку
- if (str[0] == ',') // проверка на 1 символ, если он ','
- {
- cout << "Ошибка ввода!\nВведите число заново: "; // то выводим ошибку
- goto again; // метка к повторному вводу
- }
- for (int i = 0; i < str.length(); i++) // проходим по всей строке
- {
- if ((str[i] < '0' || str[i] > '9') && str[i] != ',') // если число не цифра и не запятая
- {
- cout << "Ошибка ввода!\nВведите число заново: "; // выводим ошибку
- goto again; // метка к повторному вводу
- }
- if (str[i] == ',') // счетчик ','(если встретилась ',')
- tochka++; // увеличиваем счетчик
- if (tochka == 2) // если кол-во запятых = 2
- {
- cout << "Ошибка ввода!\nВведите число заново: "; // выводим ошибку
- goto again; // метка к повторному вводу
- }
- }
- return stof(str); // конвертируем в float
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement