Advertisement
CR7CR7

productsSklad

Jul 14th, 2023
712
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.44 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. #include <list>
  5. #include <ctime>
  6.  
  7. using namespace std;
  8.  
  9. // Структура за представяне на стока
  10. struct Product {
  11.     long long id; // Номенклатурен номер
  12.     string name; // Наименование на стоката
  13.     double price; // Единична цена
  14.     int quantity; // Количество
  15.     tm date; // Дата на производство
  16. };
  17.  
  18. // Функция за създаване на стока от потребителски вход
  19. Product createProduct() {
  20.     Product p;
  21.     cout << "Въведете номенклатурен номер (12 цифри): ";
  22.     cin >> p.id;
  23.     cin.ignore();
  24.     cout << "Въведете наименование на стоката (до 50 символа): ";
  25.     getline(cin, p.name);
  26.     cout << "Въведете единична цена: ";
  27.     cin >> p.price;
  28.     cout << "Въведете количество: ";
  29.     cin >> p.quantity;
  30.     cout << "Въведете дата на производство (ДД.ММ.ГГГГ): ";
  31.     cin >> p.date.tm_mday;
  32.     cin.ignore();
  33.     cin >> p.date.tm_mon;
  34.     cin.ignore();
  35.     cin >> p.date.tm_year;
  36.     p.date.tm_mon--; // Намаляме месеца с 1, защото в tm структурата месеците са от 0 до 11
  37.     p.date.tm_year -= 1900; // Намаляме годината с 1900, защото в tm структурата годините са от 1900 нататък
  38.     return p;
  39. }
  40.  
  41. // Функция за записване на стока в двоичен файл
  42. void writeProduct(ofstream& out, const Product& p) {
  43.     out.write((char*)&p.id, sizeof(p.id));
  44.     out.write(p.name.c_str(), 50);
  45.     out.write((char*)&p.price, sizeof(p.price));
  46.     out.write((char*)&p.quantity, sizeof(p.quantity));
  47.     out.write((char*)&p.date, sizeof(p.date));
  48. }
  49.  
  50. // Функция за четене на стока от двоичен файл
  51. Product readProduct(ifstream& in) {
  52.     Product p;
  53.     in.read((char*)&p.id, sizeof(p.id));
  54.     char buffer[51];
  55.     in.read(buffer, 50);
  56.     buffer[50] = '\0';
  57.     p.name = buffer;
  58.     in.read((char*)&p.price, sizeof(p.price));
  59.     in.read((char*)&p.quantity, sizeof(p.quantity));
  60.     in.read((char*)&p.date, sizeof(p.date));
  61.     return p;
  62. }
  63.  
  64. // Функция за извеждане на стока на екрана
  65. void printProduct(const Product& p) {
  66.     cout << "Номенклатурен номер: " << p.id << endl;
  67.     cout << "Наименование: " << p.name << endl;
  68.     cout << "Единична цена: " << p.price << endl;
  69.     cout << "Количество: " << p.quantity << endl;
  70.     cout << "Дата на производство: " << p.date.tm_mday << "." << p.date.tm_mon + 1 << "." << p.date.tm_year + 1900 << endl;
  71. }
  72.  
  73. // Функция за сравнение на две дати
  74. bool compareDates(const tm& d1, const tm& d2) {
  75.    if (d1.tm_year < d2.tm_year) return true;
  76.    if (d1.tm_year > d2.tm_year) return false;
  77.    if (d1.tm_mon < d2.tm_mon) return true;
  78.    if (d1.tm_mon > d2.tm_mon) return false;
  79.    if (d1.tm_mday < d2.tm_mday) return true;
  80.    if (d1.tm_mday > d2.tm_mday) return false;
  81.    return false; // Датите са равни
  82. }
  83.  
  84. // Функция за проверка дали дадена дата е изтекла спрямо текущата дата
  85. bool isExpired(const tm& date, const tm& today) {
  86.     return compareDates(date, today);
  87. }
  88.  
  89. // Функция за добавяне на нова стока в склада
  90. void addProduct(list<Product>& products, const Product& p) {
  91.     products.push_back(p); // Добавяме стоката в края на списъка
  92. }
  93.  
  94. // Функция за променяне на наличностите от зададена стока
  95. void changeProduct(list<Product>& products, long long id, int delta) {
  96.     for (auto it = products.begin(); it != products.end(); it++) {
  97.         if (it->id == id) { // Намерили сме стоката със съответния номер
  98.             it->quantity += delta; // Променяме количеството
  99.             if (it->quantity <= 0) { // Ако стоката е изчерпана
  100.                 products.erase(it); // Изтриваме я от списъка
  101.             }
  102.             return; // Прекратяваме функцията
  103.         }
  104.     }
  105.     cout << "Няма стока с такъв номер в склада." << endl; // Не сме намерили стоката
  106. }
  107.  
  108. // Функция за извеждане на всички стоки с изтекъл срок на годност
  109. void printExpiredProducts(const list<Product>& products, const tm& today) {
  110.     for (const auto& p : products) { // Обхождаме всички стоки в списъка
  111.         if (isExpired(p.date, today)) { // Ако датата на производство е изтекла
  112.             printProduct(p); // Извеждаме стоката
  113.             cout << "---------------------" << endl;
  114.         }
  115.     }
  116. }
  117.  
  118. // Функция за извеждане на информация за стока по зададен номер
  119. void printProductById(const list<Product>& products, long long id) {
  120.     for (const auto& p : products) { // Обхождаме всички стоки в списъка
  121.         if (p.id == id) { // Ако номерът съвпада
  122.             printProduct(p); // Извеждаме стоката
  123.             return; // Прекратяваме функцията
  124.         }
  125.     }
  126.     cout << "Няма стока с такъв номер в склада." << endl; // Не сме намерили стоката
  127. }
  128.  
  129. // Функция за зареждане на данните от двоичен файл в списък
  130. void loadProducts(list<Product>& products, const string& filename) {
  131.     ifstream in(filename, ios::binary); // Отваряме двоичния файл за четене
  132.     if (!in) { // Ако не успеем да го отворим
  133.         cerr << "Грешка при отваряне на файла " << filename << endl;
  134.         return;
  135.     }
  136.     while (in.peek() != EOF) { // Докато не стигнем края на файла
  137.         Product p = readProduct(in); // Четем една стока от файла
  138.         addProduct(products, p); // Добавяме я в списъка
  139.     }
  140.     in.close(); // Затваряме файла
  141. }
  142.  
  143. // Функция за записване на данните от списък в двоичен файл
  144. void saveProducts(const list<Product>& products, const string& filename) {
  145.     ofstream out(filename, ios::binary); // Отваряме двоичния файл за писане
  146.     if (!out) { // Ако не успеем да го отворим
  147.         cerr << "Грешка при отваряне на файла " << filename << endl;
  148.         return;
  149.     }
  150.     for (const auto& p : products) { // Обхождаме всички стоки в списъка
  151.         writeProduct(out, p); // Записваме една стока в файла
  152.     }
  153.     out.close(); // Затваряме файла
  154. }
  155.  
  156. int main() {
  157.     list<Product> products; // Списък за съхранение на стоките в паметта
  158.  
  159.     string filename; //
  160.  cout << "Въведете име на файл: ";
  161.     cin >> filename; // Въвеждаме името на файла, от който ще четем данните
  162.  
  163.     loadProducts(products, filename); // Зареждаме данните от файла в списъка
  164.  
  165.     int choice; // Променлива за избор на операция
  166.     do {
  167.         // Извеждаме меню с възможни операции
  168.         cout << "Изберете операция:" << endl;
  169.         cout << "1. Добавяне на нова стока" << endl;
  170.         cout << "2. Промяна на наличностите от зададена стока" << endl;
  171.         cout << "3. Извеждане на всички стоки с изтекъл срок на годност" << endl;
  172.         cout << "4. Извеждане на информация за стока по зададен номер" << endl;
  173.         cout << "5. Записване на данните във файл и изход от програмата" << endl;
  174.         cin >> choice; // Въвеждаме избора си
  175.  
  176.         switch (choice) {
  177.             case 1: { // Ако изберем 1
  178.                 Product p = createProduct(); // Създаваме нова стока от потребителски вход
  179.                 addProduct(products, p); // Добавяме я в списъка
  180.                 break;
  181.             }
  182.             case 2: { // Ако изберем 2
  183.                 long long id; // Променлива за номер на стока
  184.                 int delta; // Променлива за промяна в количеството
  185.                 cout << "Въведете номер на стока: ";
  186.                 cin >> id; // Въвеждаме номера
  187.                 cout << "Въведете промяна в количеството (+ или -): ";
  188.                 cin >> delta; // Въвеждаме промяната
  189.                 changeProduct(products, id, delta); // Променяме наличностите от стоката
  190.                 break;
  191.             }
  192.             case 3: { // Ако изберем 3
  193.                 tm today; // Променлива за текущата дата
  194.                 cout << "Въведете текуща дата (ДД.ММ.ГГГГ): ";
  195.                 cin >> today.tm_mday;
  196.                 cin.ignore();
  197.                 cin >> today.tm_mon;
  198.                 cin.ignore();
  199.                 cin >> today.tm_year;
  200.                 today.tm_mon--; // Намаляме месеца с 1, защото в tm структурата месеците са от 0 до 11
  201.                 today.tm_year -= 1900; // Намаляме годината с 1900, защото в tm структурата годините са от 1900 нататък
  202.                 printExpiredProducts(products, today); // Извеждаме всички стоки с изтекъл срок на годност
  203.                 break;
  204.             }
  205.             case 4: { // Ако изберем 4
  206.                 long long id; // Променлива за номер на стока
  207.                 cout << "Въведете номер на стока: ";
  208.                 cin >> id; // Въвеждаме номера
  209.                 printProductById(products, id); // Извеждаме информация за стоката по зададения номер
  210.                 break;
  211.             }
  212.             case 5: { // Ако изберем 5
  213.                 saveProducts(products, filename); // Записваме данните от списъка във файла
  214.                 cout << "Данните са записани в файла." << endl;
  215.                 break;
  216.             }
  217.             default: { // Ако изберем друго число
  218.                 cout << "Невалиден избор. Опитайте отново." << endl;
  219.             }
  220.         }
  221.     } while (choice != 5); // Повтаряме цикъла докато не изберем 5
  222.  
  223.     return 0;
  224. }
  225.  
  226.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement