Реализация списания продукции исходя из выбранного напитка

Рейтинг: 0Ответов: 2Опубликовано: 20.06.2023

Начинаю только изучать с++. Пытаюсь разобрать тему ООП. Придумал себе задачу для обучения и пытаюсь решить. Суть такова: есть что-то подобие кофемашины, пользователь должен выбрать номер напитка и в соответствии от выбранного напитка должно произойти списание продукции. На данном этапе я сделал вывод сообщения для пользователя, где ему предлагают выбрать напиток (1 - эспрессо или 2 - американо), так же есть что-то подобия рецепта для напитков . Я не могу додуматься как сделать списание продукции в соответствии с выбранным напитком. Помогите пожалуйста реализовать списание продукции. Это моя первая "программа".


#include <iostream>
using namespace std;


class CoffieGrinder {
private:

public:
    int milk;
    int coffie;
    int water;
    int numdrink;

    int waterbank = 100;            // Емкости кофемашины (вода/кофе/молоко)
    int Coffiebank = 100;
    int milkbank = 100;

    void Starting() {
        cout << "Enter number of drink 1-4: ";
        cin >> numdrink;
        Print();


    };

    void Print() {
        if (numdrink == 1) {
            cout << "U choose espresso";
        }
        else if (numdrink == 2) {
            cout << "U choose amerikano";
        }
        else
            cout << "Error";
    };

};



int main()
{
    setlocale(LC_ALL, "Russian");
        
    CoffieGrinder a;
    a.Starting();

                                    // Cписок рецептов для приготовления
    CoffieGrinder espresso;         // 1
    espresso.milk = 0;
    espresso.coffie = 15;
    espresso.water = 5;

    CoffieGrinder americano;        // 2
    espresso.milk = 0;
    espresso.coffie = 15;
    espresso.water = 10;


    return 0;
}

Ответы

▲ 2

В принципе в первый раз вы достаточно правильно написали код, сделав несколько ошибок новичков - использовали оператор присвоить = вместо оператора сравнения ==, оператор побитового и & вместо логического и &&. Кстати, чтобы меньше ошибаться, можно пользоваться синонимами операторов сравнения && - and, || - or.
И правильно сделали, когда рецепт напитка выделили в отдельный класс.

class DrinkRecipe
{
  public:
    int milk;
    int coffie;
    int water;
};

Вы только не доделали функционал, по передаче рецепта напитка в кофемашину. И как правильно написал maestro из-за этого вы на каждый напиток создаете отдельную кофемашину. А кофемашина должна быть одна!
Просто в условную функцию Prepare() нужно передать объект класса напитка - что именно нужно готовить.

    CoffieGrinder a;

    DrinkRecipe espresso;         // 1
    espresso.milk = 0;
    espresso.coffie = 15;
    espresso.water = 5;

    a.Prepare(espresso);
    a.Prepare(americano);

И кстати можно немного сократить запись инициализации напитков

    DrinkRecipe espresso{ 0, 15, 5};
    DrinkRecipe americano = { 0, 15, 10};

Либо можно пойти чуть дальше в архитектуре. Рецепты кофе же хранятся в кофемашине? Ну вот можно так и реализовать - создать в классе кофемашины массив в котором хранятся рецепты напитков. Ну и название напитка можно хранить вместе в рецептурой

class DrinkRecipe
{
  public:
    int milk;
    int coffie;
    int water;
    std::string name;
};

class CoffieGrinder 
{
public:
    std::vector<DrinkRecipe> recipes;
// или
    DrinkRecipe recipes[3];

И тогда вы сможете выбирать какой напиток приготовить по индексу из массива.
Везде где есть ввод от пользователя, необходимо делать проверки на корректность введенного значения. Простейший вариант - бесконечный цикл, который работает пока не будет введено корректное значение. Только вероятно надо сделать пункт выхода без приготовления напитка.

void Starting() 
{
    int numdrink = 0;
    cout << "Enter number of drink 1-4:/n ";
    cout << "1-Cappuchino/n 2-Americano/n 3-Latte/n 4-ShutDown" << endl;
    cin >> numdrink;
    while(numdrink < 1 or numdrink > 4)
    {
        cout << "Wrong enter!!!/n Please enter number from 1 to 4./n"
        cin >> numdrink;
    }
    if(numdrink == 4)
    {}  // выход из программы

    Prepare(numdrink);
};

Также, перед приготовлением напитка нужно проверить - можете ли вы его приготовить? Хватит ли у вас компонентов для приготовления?

▲ 0

Я отредактировал малость код. Может быть так будет наглядней.

#include <iostream>
using namespace std;

class CoffieGrinder 
{
    private:
        int randvoltage = 0;            // условный вольтаж в розетке

    public:
        int milkbank = 0;               // содержимое контейнеров кофемашины        
        int coffiebank = 0;
        int watebank = 0;
        int numdrink;

    void Starting() 
    {               // запуск кофемашины. Проврка напряжения, досточного количества ингредиентов для приготовления
        Restarting();               // генерирует какие-то ресурсы
        cout << randvoltage << endl;// вывод вольтажа

        if (randvoltage <= 240 && randvoltage >= 180)
        {
            cout << "Voltage in normal.." << endl;
            cout << "Starting...." << endl << endl;
            cout << "Bankinfo: " << endl << "Молоко: " << milkbank << endl << "Кофе: " << coffiebank << endl << "Вода: " << watebank << endl << endl;
            CkeckBanking(); // проверка достаточного кол-ва содержимого
        }
        else if (randvoltage > 180)
        {
            cout << "Error! Voltage is so hight, check elecrisity!" << endl << endl;
            Restarting();
            Starting();
        }
        else if (randvoltage < 180)
        {
            cout << "Error! Voltage is so low, check elecrisity!" << endl << endl;
            Restarting();
            Starting();
        }
    }

    void CkeckBanking() 
    {       // функция проверки досточного количества ингредиентов для приготовления
        if (milkbank < 5) 
        {
            cout << "Error! Milk is so low!" << endl << endl;
            Restarting();
            Starting();
        }
        else 
        if (coffiebank < 5) 
        {
            cout << "Error! coffe is so low!" << endl << endl;
            Restarting();
            Starting();
        }
        else if (watebank < 5) {
            cout << "Error! water is so low!" << endl << endl;
            Restarting();
            Starting();
        }
        else
        {
            Step2();
        }
    }

    void Step2() 
    {                          // вывод меню напитков
        cout << "Enter drink:" << endl;
        cout << "1. Espresso" << endl;
        cout << "2. Americano" << endl;
        cout << "3. Capuccino" << endl;
        cout << "4. Late" << endl;
        cout << endl;
        cin >> numdrink;
        void Prepare();
    }

    void Restarting() 
    {                     // создаем случайные значения для вольтажа розетки, кол-ва молока, воды, кофе
        randvoltage = rand() % 150 + 150;
        milkbank = rand() % 40;
        coffiebank = rand() % 40;
        watebank = rand() % 40;
    }

    void Prepare() {
        ?????????
    }
};

class DrinkRecipe 
{
public:
    int milk;
    int coffie;
    int water;
};

int main()
{
    setlocale(LC_ALL, "Russian");
    srand(time_t(NULL));

    DrinkRecipe();
    CoffieGrinder a;
    a.Starting();

    DrinkRecipe espresso{};             // 1
    espresso.milk = 0;
    espresso.coffie = 15;
    espresso.water = 5;

    DrinkRecipe Americano{};                // 2
    espresso.milk = 0;
    espresso.coffie = 15;
    espresso.water = 10;

    DrinkRecipe Capuccino{};                // 3
    espresso.milk = 5;
    espresso.coffie = 15;
    espresso.water = 5;

    DrinkRecipe Late{};                 // 4
    espresso.milk = 10;
    espresso.coffie = 15;
    espresso.water = 5;

    return 0;
}