Advertisement
Ivan_Moscow

fastfood.cpp

Jun 3rd, 2018
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.23 KB | None | 0 0
  1. //Предметная область - Предприятие быстрого питания.
  2.  
  3. #include "stdafx.h"
  4. #include <iostream>
  5.  
  6. //Перечисление элементов меню
  7. enum menu {
  8.     //Горячие блюда
  9.     HOT_CHICKEN_S,      //Курица в разных порциях
  10.     HOT_CHICKEN_M,
  11.     HOT_CHICKEN_L,
  12.     HOT_HAMBURGER,      //Гамбургер
  13.     HOT_CHEESEBURGER,   //Чизбургер
  14.     HOT_FISHBURGER,     //Бургер с рыбой
  15.     HOT_HOTDOG_ST,      //Стандартный хот-дог
  16.     HOT_HOTDOG_BIG,     //Большой хот-дог
  17.     //Закуски
  18.     SNACK_POTATO_S,     //Картошка в разных порциях
  19.     SNACK_POTATO_M,
  20.     SNACK_POTATO_L,
  21.     SNACK_ONION_RINGS,  //Луковые колечки
  22.     //Напитки
  23.     DRINK_COLA,         //Всякие газировки
  24.     DRINK_FANTA,
  25.     DRINK_SPRITE,
  26.     DRINK_JUICE,        //Сок
  27.     //Алкогольные напитки
  28.     DRINK_BEER_ST,      //Стандартное пиво
  29.     DRINK_BEER_BIG,     //Большое пиво
  30. };
  31.  
  32. //Стоимость всех перечисленных блюд
  33. const float MENU_COST[] = {120, 150, 180, 135, 120, 120,
  34.     105, 125, 70, 90, 110, 85, 80, 80, 80, 65, 80, 95};
  35. //Названия блюд
  36. const char *MENU_CHAR[] = {"Small Chicken", "Medium Chicken", "Large Chicken",
  37.     "Hamburger", "Cheeseburger", "Fishburger", "Standard Hot-Dog", "Big Hot-Dog",
  38.     "Small Potato", "Medium Potato", "Large Potato", "Onion Rings", "Coca-Cola",
  39.     "Fanta", "Sprite", "Juice", "Standard Beer", "Big Beer"};
  40.  
  41. float getCost (menu target) {
  42.     return MENU_COST[target];
  43. }
  44.  
  45. const char* getName (menu target) {
  46.     return MENU_CHAR[target];
  47. }
  48.  
  49. //Опишем класс списка заказов. Заказ, который
  50. //заказали первым, первым готовят. Принцип
  51. //"первым пришел - первым вышел"
  52. class orderStack {
  53. private:
  54.     menu **items;       //Массив с массивами блюд
  55.     int *qty;           //Кол-во наименований в заказе
  56.     int size;           //Текущий размер стека
  57. public:
  58.     //Конструктор
  59.     orderStack(int stack_size=0) {
  60.         size = stack_size;
  61.         items = new menu*[stack_size];
  62.         qty = new int[stack_size];
  63.         //По умолчанию каждый заказ пуст. qty везде равен нулю
  64.         for (int i=0; i<stack_size; i++) {
  65.             qty[i]=0;
  66.         }
  67.         return;
  68.     }
  69.  
  70.     //Деструктор
  71.     ~orderStack() {
  72.         delete[] items;
  73.         delete[] qty;
  74.         return;
  75.     }
  76.  
  77.     //Клиент делает заказ - добавляем его в стек (в конец)
  78.     void addOrder(menu ordered_items[], int ordered_qty) {
  79.         float price = 0;        //Общая стоимость
  80.         //Делаем массивы на 1 длиннее
  81.         menu **tmp_items = new menu*[size+1];
  82.         int *tmp_qty = new int[size+1];
  83.         //Копируем из старого массива в новый
  84.         for (int i=0; i<size; i++) {
  85.             tmp_items[i] = new menu[qty[i]];
  86.             for (int j=0; j<qty[i]; j++) {
  87.                 tmp_items[i][j]=items[i][j];
  88.             }
  89.             tmp_qty[i] = qty[i];
  90.         }
  91.         //Записываем последний заказ
  92.         tmp_items[size] = new menu[ordered_qty];
  93.         tmp_qty[size] = ordered_qty;
  94.         for (int i=0; i<ordered_qty; i++) {
  95.             tmp_items[size][i] = ordered_items[i];
  96.         }
  97.         //Выводим сообщение
  98.         std::cout<<"[ORDER RECIEVED]\n";
  99.         for (int i=0; i<ordered_qty; i++) {
  100.             std::cout<<getName(ordered_items[i]);
  101.             //Расставим запятые между заказами, а в конце - точку
  102.             if (i<ordered_qty-1) {
  103.                 std::cout<<", ";
  104.                 //Не больше трех заказов в строке
  105.                 if ((i+1)%3==0) {
  106.                     std::cout<<"\n";
  107.                 }
  108.             } else {
  109.                 std::cout<<".";
  110.             }
  111.             price+=getCost(ordered_items[i]);
  112.         }
  113.         std::cout<<"\n\n";
  114.         //Удаляем старые и перезаписываем
  115.         for (int i=0; i<size; i++) {
  116.             delete[] items[i];
  117.         }
  118.         delete[] items;
  119.         delete[] qty;
  120.         items = tmp_items;
  121.         qty = tmp_qty;
  122.         size++;
  123.         return;
  124.     }
  125.  
  126.     //Заказ готов - выдаем его клиенту
  127.     void getOrder(float cashback=0) {
  128.         float price=0;      //Итоговая стоимость
  129.         //Массив блюд из выдаваемого заказа
  130.         menu *get_items = new menu[qty[0]];
  131.         int get_qty = qty[0];
  132.         for (int i=0; i<qty[0]; i++) {
  133.             get_items[i] = items[0][i];
  134.         }
  135.         //Копируем элементы в новые массивы, как в методе addOrder
  136.         menu **tmp_items = new menu*[size-1];
  137.         int *tmp_qty = new int[size-1];
  138.         //Копируем из старого массива в новый
  139.         for (int i=0; i<size-1; i++) {
  140.             tmp_items[i] = new menu[qty[i+1]];
  141.             for (int j=0; j<qty[i]; j++) {
  142.                 tmp_items[i][j]=items[i+1][j];
  143.             }
  144.             tmp_qty[i] = qty[i+1];
  145.         }
  146.         //Выведем сообщение
  147.         std::cout<<"[ORDER IS READY]\n";
  148.         for (int i=0; i<get_qty; i++) {
  149.             std::cout<<getName(get_items[i])<<" - "<<getCost(get_items[i])<<"\n";
  150.             price+=getCost(get_items[i]);
  151.         }
  152.         std::cout<<"\nTotal price: "<<price<<"\n";
  153.         //Если у покупателя есть скидка, считаем еще и цену со скидкой
  154.         if (cashback>0) {
  155.             std::cout<<"Cashback is "<<cashback*100<<"%\n";
  156.             std::cout<<"Price with cashback: "<<price*(1-cashback)<<"\n";
  157.         }
  158.         std::cout<<"\n";
  159.         //Удаляем старые и перезаписываем
  160.         for (int i=0; i<size; i++) {
  161.             delete[] items[i];
  162.         }
  163.         delete[] items;
  164.         delete[] qty;
  165.         items = tmp_items;
  166.         qty = tmp_qty;
  167.         size--;
  168.         return;
  169.     }
  170.  
  171.     //Перегруженный оператор "-" для отмены заказа
  172.     void operator-(int index) {
  173.         menu *cancelled_items = new menu[qty[index]];   //Удаляемый массив с блюдами
  174.         int cancelled_qty = qty[index];                 //Его длина
  175.         //Скопируем items[index] в cancelled_items[index]
  176.         for (int i=0; i<cancelled_qty; i++) {
  177.             cancelled_items[i] = items[index][i];
  178.         }
  179.         //Сдвинем влево элементы, начиная с index
  180.         for (int i=index; i<size-1; i++) {
  181.             delete items[i];
  182.             items[i] = new menu[qty[i+1]];
  183.             for (int j=0; j<qty[i+1]; i++) {
  184.                 items[i][j] = items[i+1][j];
  185.             }
  186.             qty[i]=qty[i+1];
  187.         }
  188.         //Создадим новые массивы
  189.         menu **tmp_items = new menu*[size-1];
  190.         int *tmp_qty = new int[size-1];
  191.         for (int i=0; i<size-1; i++) {
  192.             tmp_items[i] = new menu[qty[i]];
  193.             for (int j=0; j<qty[i]; j++) {
  194.                 tmp_items[i][j]=items[i][j];
  195.             }
  196.             tmp_qty[i] = qty[i];
  197.         }
  198.         //Выведем сообщение
  199.         std::cout<<"[ORDER CANCELLED]\n";
  200.         for (int i=0; i<cancelled_qty; i++) {
  201.             std::cout<<getName(cancelled_items[i]);
  202.             //Расставим запятые между заказами, а в конце - точку
  203.             if (i<cancelled_qty-1) {
  204.                 std::cout<<", ";
  205.                 //Не больше трех заказов в строке
  206.                 if ((i+1)%3==0) {
  207.                     std::cout<<"\n";
  208.                 }
  209.             } else {
  210.                 std::cout<<".\n\n";
  211.             }
  212.         }
  213.         //Удаляем старые и перезаписываем
  214.         for (int i=0; i<size; i++) {
  215.             delete[] items[i];
  216.         }
  217.         delete[] items;
  218.         delete[] qty;
  219.         items = tmp_items;
  220.         qty = tmp_qty;
  221.         size--;
  222.         return;
  223.     }
  224.  
  225.     //Перегруженный оператор "+" для добавления блюда к первому в очереди заказу
  226.     void operator+(menu newItem) {
  227.         //Делаем копию массива блюд на 1 длиннее и копируем туда старые блюда
  228.         menu *tmpItems = new menu[qty[0]+1];
  229.         for (int i=0; i<qty[0]; i++) {
  230.             tmpItems[i] = items[0][i];
  231.         }
  232.         //Добавляем новое
  233.         tmpItems[qty[0]] = newItem;
  234.         //Выводим сообщение
  235.         std::cout<<"[ORDER CHANGED]\n";
  236.         std::cout<<getName(newItem)<<" was added to last order\n\n";
  237.         //Удаляем старый массив и перезаписываем
  238.         delete[] items[0];
  239.         items[0] = tmpItems;
  240.         qty[0]++;
  241.         return;
  242.     }
  243.  
  244.     //Еще одна перегрузка оператора "+" для добавления НЕСКОЛЬКИХ блюд (массивом)
  245.     void operator+(menu *newItem) {
  246.         //В процессе...
  247.     }
  248. };
  249.  
  250. void main ()
  251. {
  252.     orderStack myOStack;
  253.     menu foo[] = {HOT_CHICKEN_M, SNACK_POTATO_M, DRINK_BEER_ST};
  254.     menu bar[] = {HOT_FISHBURGER, SNACK_POTATO_S, DRINK_COLA};
  255.     menu qux[] = {HOT_HAMBURGER, HOT_CHICKEN_S, SNACK_ONION_RINGS, DRINK_JUICE};
  256.     //Тестируем наши методы
  257.     myOStack.addOrder(foo, 3);
  258.     myOStack.addOrder(bar, 3);
  259.     myOStack.addOrder(qux, 4);
  260.     //Пробуем отменить заказ
  261.     myOStack-2;
  262.     //Пробуем получить заказ со скидкой...
  263.     myOStack.getOrder(0.15);
  264.     //И без скидки
  265.     myOStack+SNACK_POTATO_S;
  266.     myOStack.getOrder();
  267.     system("pause");
  268.     return;
  269. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement