Реализация списания продукции исходя из выбранного напитка
Начинаю только изучать с++. Пытаюсь разобрать тему ООП. Придумал себе задачу для обучения и пытаюсь решить. Суть такова: есть что-то подобие кофемашины, пользователь должен выбрать номер напитка и в соответствии от выбранного напитка должно произойти списание продукции. На данном этапе я сделал вывод сообщения для пользователя, где ему предлагают выбрать напиток (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);
};
Также, перед приготовлением напитка нужно проверить - можете ли вы его приготовить? Хватит ли у вас компонентов для приготовления?
Я отредактировал малость код. Может быть так будет наглядней.
#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;
}