Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <string>
- #include <list>
- #include <ctime>
- using namespace std;
- // Структура за представяне на стока
- struct Product {
- long long id; // Номенклатурен номер
- string name; // Наименование на стоката
- double price; // Единична цена
- int quantity; // Количество
- tm date; // Дата на производство
- };
- // Функция за създаване на стока от потребителски вход
- Product createProduct() {
- Product p;
- cout << "Въведете номенклатурен номер (12 цифри): ";
- cin >> p.id;
- cin.ignore();
- cout << "Въведете наименование на стоката (до 50 символа): ";
- getline(cin, p.name);
- cout << "Въведете единична цена: ";
- cin >> p.price;
- cout << "Въведете количество: ";
- cin >> p.quantity;
- cout << "Въведете дата на производство (ДД.ММ.ГГГГ): ";
- cin >> p.date.tm_mday;
- cin.ignore();
- cin >> p.date.tm_mon;
- cin.ignore();
- cin >> p.date.tm_year;
- p.date.tm_mon--; // Намаляме месеца с 1, защото в tm структурата месеците са от 0 до 11
- p.date.tm_year -= 1900; // Намаляме годината с 1900, защото в tm структурата годините са от 1900 нататък
- return p;
- }
- // Функция за записване на стока в двоичен файл
- void writeProduct(ofstream& out, const Product& p) {
- out.write((char*)&p.id, sizeof(p.id));
- out.write(p.name.c_str(), 50);
- out.write((char*)&p.price, sizeof(p.price));
- out.write((char*)&p.quantity, sizeof(p.quantity));
- out.write((char*)&p.date, sizeof(p.date));
- }
- // Функция за четене на стока от двоичен файл
- Product readProduct(ifstream& in) {
- Product p;
- in.read((char*)&p.id, sizeof(p.id));
- char buffer[51];
- in.read(buffer, 50);
- buffer[50] = '\0';
- p.name = buffer;
- in.read((char*)&p.price, sizeof(p.price));
- in.read((char*)&p.quantity, sizeof(p.quantity));
- in.read((char*)&p.date, sizeof(p.date));
- return p;
- }
- // Функция за извеждане на стока на екрана
- void printProduct(const Product& p) {
- cout << "Номенклатурен номер: " << p.id << endl;
- cout << "Наименование: " << p.name << endl;
- cout << "Единична цена: " << p.price << endl;
- cout << "Количество: " << p.quantity << endl;
- cout << "Дата на производство: " << p.date.tm_mday << "." << p.date.tm_mon + 1 << "." << p.date.tm_year + 1900 << endl;
- }
- // Функция за сравнение на две дати
- bool compareDates(const tm& d1, const tm& d2) {
- if (d1.tm_year < d2.tm_year) return true;
- if (d1.tm_year > d2.tm_year) return false;
- if (d1.tm_mon < d2.tm_mon) return true;
- if (d1.tm_mon > d2.tm_mon) return false;
- if (d1.tm_mday < d2.tm_mday) return true;
- if (d1.tm_mday > d2.tm_mday) return false;
- return false; // Датите са равни
- }
- // Функция за проверка дали дадена дата е изтекла спрямо текущата дата
- bool isExpired(const tm& date, const tm& today) {
- return compareDates(date, today);
- }
- // Функция за добавяне на нова стока в склада
- void addProduct(list<Product>& products, const Product& p) {
- products.push_back(p); // Добавяме стоката в края на списъка
- }
- // Функция за променяне на наличностите от зададена стока
- void changeProduct(list<Product>& products, long long id, int delta) {
- for (auto it = products.begin(); it != products.end(); it++) {
- if (it->id == id) { // Намерили сме стоката със съответния номер
- it->quantity += delta; // Променяме количеството
- if (it->quantity <= 0) { // Ако стоката е изчерпана
- products.erase(it); // Изтриваме я от списъка
- }
- return; // Прекратяваме функцията
- }
- }
- cout << "Няма стока с такъв номер в склада." << endl; // Не сме намерили стоката
- }
- // Функция за извеждане на всички стоки с изтекъл срок на годност
- void printExpiredProducts(const list<Product>& products, const tm& today) {
- for (const auto& p : products) { // Обхождаме всички стоки в списъка
- if (isExpired(p.date, today)) { // Ако датата на производство е изтекла
- printProduct(p); // Извеждаме стоката
- cout << "---------------------" << endl;
- }
- }
- }
- // Функция за извеждане на информация за стока по зададен номер
- void printProductById(const list<Product>& products, long long id) {
- for (const auto& p : products) { // Обхождаме всички стоки в списъка
- if (p.id == id) { // Ако номерът съвпада
- printProduct(p); // Извеждаме стоката
- return; // Прекратяваме функцията
- }
- }
- cout << "Няма стока с такъв номер в склада." << endl; // Не сме намерили стоката
- }
- // Функция за зареждане на данните от двоичен файл в списък
- void loadProducts(list<Product>& products, const string& filename) {
- ifstream in(filename, ios::binary); // Отваряме двоичния файл за четене
- if (!in) { // Ако не успеем да го отворим
- cerr << "Грешка при отваряне на файла " << filename << endl;
- return;
- }
- while (in.peek() != EOF) { // Докато не стигнем края на файла
- Product p = readProduct(in); // Четем една стока от файла
- addProduct(products, p); // Добавяме я в списъка
- }
- in.close(); // Затваряме файла
- }
- // Функция за записване на данните от списък в двоичен файл
- void saveProducts(const list<Product>& products, const string& filename) {
- ofstream out(filename, ios::binary); // Отваряме двоичния файл за писане
- if (!out) { // Ако не успеем да го отворим
- cerr << "Грешка при отваряне на файла " << filename << endl;
- return;
- }
- for (const auto& p : products) { // Обхождаме всички стоки в списъка
- writeProduct(out, p); // Записваме една стока в файла
- }
- out.close(); // Затваряме файла
- }
- int main() {
- list<Product> products; // Списък за съхранение на стоките в паметта
- string filename; //
- cout << "Въведете име на файл: ";
- cin >> filename; // Въвеждаме името на файла, от който ще четем данните
- loadProducts(products, filename); // Зареждаме данните от файла в списъка
- int choice; // Променлива за избор на операция
- do {
- // Извеждаме меню с възможни операции
- cout << "Изберете операция:" << endl;
- cout << "1. Добавяне на нова стока" << endl;
- cout << "2. Промяна на наличностите от зададена стока" << endl;
- cout << "3. Извеждане на всички стоки с изтекъл срок на годност" << endl;
- cout << "4. Извеждане на информация за стока по зададен номер" << endl;
- cout << "5. Записване на данните във файл и изход от програмата" << endl;
- cin >> choice; // Въвеждаме избора си
- switch (choice) {
- case 1: { // Ако изберем 1
- Product p = createProduct(); // Създаваме нова стока от потребителски вход
- addProduct(products, p); // Добавяме я в списъка
- break;
- }
- case 2: { // Ако изберем 2
- long long id; // Променлива за номер на стока
- int delta; // Променлива за промяна в количеството
- cout << "Въведете номер на стока: ";
- cin >> id; // Въвеждаме номера
- cout << "Въведете промяна в количеството (+ или -): ";
- cin >> delta; // Въвеждаме промяната
- changeProduct(products, id, delta); // Променяме наличностите от стоката
- break;
- }
- case 3: { // Ако изберем 3
- tm today; // Променлива за текущата дата
- cout << "Въведете текуща дата (ДД.ММ.ГГГГ): ";
- cin >> today.tm_mday;
- cin.ignore();
- cin >> today.tm_mon;
- cin.ignore();
- cin >> today.tm_year;
- today.tm_mon--; // Намаляме месеца с 1, защото в tm структурата месеците са от 0 до 11
- today.tm_year -= 1900; // Намаляме годината с 1900, защото в tm структурата годините са от 1900 нататък
- printExpiredProducts(products, today); // Извеждаме всички стоки с изтекъл срок на годност
- break;
- }
- case 4: { // Ако изберем 4
- long long id; // Променлива за номер на стока
- cout << "Въведете номер на стока: ";
- cin >> id; // Въвеждаме номера
- printProductById(products, id); // Извеждаме информация за стоката по зададения номер
- break;
- }
- case 5: { // Ако изберем 5
- saveProducts(products, filename); // Записваме данните от списъка във файла
- cout << "Данните са записани в файла." << endl;
- break;
- }
- default: { // Ако изберем друго число
- cout << "Невалиден избор. Опитайте отново." << endl;
- }
- }
- } while (choice != 5); // Повтаряме цикъла докато не изберем 5
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement