Используя переключатель, но я хочу сделать выбор строкой вместо int - PullRequest
1 голос
/ 21 июня 2020

Приведенный ниже код является только основной частью и не включает файл заголовка или другой файл cpp. В конце программы я хочу распечатать варианты выбора пользователя в файл csv. Если я не могу изменить способ, которым пользователь делает свой выбор, я не знаю, как это сделать.

1. Могу ли я использовать что-то другое int для выбора пользователя?

2. Я могу сделать что-то другое, кроме int для выбора пользователя, будет ли работать просто печать в код csv в конце, как у меня до сих пор?

#include <iomanip>
#include <iostream>
#include <string>
#include <cstdlib>
#include <fstream>
#include "Header.h"
using namespace std;

void PrintDrink(Drink);

int main(int argc, char* argv[])
{
    int meat;
    int type;
    string userName;
    do {
        cout << "\n\nThis program will help you BBQ some of the best meat you have ever tasted. With care taken to ensure \n";
        cout << "these steps are followed and the correct temperatures are used, you will find yourself a BBQ expert in no time. \n\n";
        cout << "Can we start with getting your name : ";
        cin >> userName;
        cout << userName << " welcome to this BBQ program.\n\n";
        cout << "You can select any of the following to make today: \n";
        cout << "1 - Chicken Wings\n";
        cout << "2 - Chicken Breast\n";
        cout << "3 - Whole Chicken\n";
        cout << "4 - Chicken Thighs\n";
        cout << "5 - Pork Ribs\n";
        cout << "6 - Pork Roast\n";
        cout << "7 - Pulled Pork\n";
        cout << "8 - Pork Chops\n";
        cout << "9 - Pork Tenderloin\n";
        cout << "10 - Beef Ribs\n";
        cout << "11 - Brisket\n";
        cout << "12 - Prime Rib Roast\n";
        cout << "Your selection: ";
        cin >> meat;
        switch (meat)
        {
        case 1:
            cout << "Chicken Wings can be amazing.\n You have two options:\n";
            cout << "grill - Grill them\n";
            cout << "smoke - Smoke them\n";
            cout << "Your selection: ";
            cin >> type;
            switch (type) {
            case 1:
                cout << "After seasoning the chicken\nCook them on a medium temperature grill.\nThey will be need to cook for approximately 6 to 8 minutes per side.";
                break;
            case 2:
                cout << "Smoking your chicken will add great flavor.\nSmoke the wings at 250 degrees for approximately 2 to 2.5 hours.";
                break;
            }goto exit_loop;
        case 2:
            cout << "Chicken Breasts can be amazing.\n You have two options:\n";
            cout << "1 - Grill them\n";
            cout << "2 - Smoke them\n";
            cout << "Your selection: ";
            cin >> type;
            switch (type) {
            case 1:
                cout << "After seasoning the chicken\nCook them on a medium temperature grill.\nThey will be need to cook for approximately 7 to 8 minutes per side.";
                break;
            case 2:
                cout << "Smoking your chicken will add great flavor.\nSmoke the wings at 250 degrees for approximately 2.5 to 3 hours.";
                break;
            }goto exit_loop;
        case 3:
            while (meat == 3) {
                cout << "A whole chicken needs time to be cooked to the perfect temperature.\nFor the best whole chicken there is really only one option:\n";
                cout << "That one option is to smoke the whole chicken.\nWe need to cook this chicken for approximately 45 minutes per pound\n";
                double chickWeight;
                cout << "Please enter the weight of your whole chicken in pounds: ";
                cin >> chickWeight;
                double chickTime = chickWeight * 0.75;
                cout << "You will need to cook your whole chicken for " << chickTime << " minutes.\nThe chicken thighs will need an internal temperature";
                cout << "of 170 degrees and the breasts will need an internal temperature of 165.\n";
                goto exit_loop;
            }
        case 4:
            cout << "Chicken thighs can be amazing.\n You have two options:\n";
            cout << "1 - Grill them\n";
            cout << "2 - Smoke them\n";
            cout << "Your selection: ";
            cin >> type;
            switch (type) {
            case 1:
                cout << "After seasoning the chicken\nCook them on a medium temperature grill.\nThey will be need to cook for approximately 6 to 8 minutes per side.";
                break;
            case 2:
                cout << "Smoking your chicken will add great flavor.\nSmoke the wings at 250 degrees for approximately 2.5 to 3 hours.";
                break;
            }while (type < 3);
            goto exit_loop;
        case 5:
            while (meat == 5) {
                cout << "Pork ribs, whether they are baby racks, ST. Louis cuts, or any other type they are best when smoked low and slow.\n";
                cout << "This amazing meat is really simple to BBQ. Smoke your ribs at 225 degrees for approximately 5 to 6 hours.\n";
                cout << "The ribs are done when they are tender and will bend when picking them up.\n";
                goto exit_loop;
            }
        case 6:
            while (meat == 6) {
                cout << "A pork roast needs time to be cooked to the perfect temperature.\nFor the best pork roast there is really only one option:\n";
                cout << "That one option is to smoke the pork roast.\nWe need to cook this roast for approximately 1 hours per pound.\n";
                double porkWeight;
                cout << "Please enter the weight of your pork in pounds: ";
                cin >> porkWeight;
                double porkTime = porkWeight * 1;
                cout << "You will need to cook your pork for " << porkTime << " hours.\nThe pork will need an internal temperature of 185-195 degrees.\n";
                goto exit_loop;
            }
        case 7:
            while (meat == 7) {
                cout << "Pulled pork needs to be cooked to an internal temperature that allows the connective fibers to break down\nso there is really only one option for this:\n";
                cout << "That one option is to smoke the pork low and slow.\nWe need to cook this pork for approximately 1.5 hour per pound.\n";
                double porkWeight;
                cout << "Please enter the weight of your pork in pounds: ";
                cin >> porkWeight;
                double porkTime = porkWeight * 1.5;
                cout << "You will need to cook your pork for " << porkTime << " hours.\nThe pork will need an internal temperature of 203 degrees.\n";
                goto exit_loop;
            }
        case 8:
            cout << "Pork chops can be amazing.\n You have two options:\n";
            cout << "1 - Grill them\n";
            cout << "2 - Smoke them\n";
            cout << "Your selection: ";
            cin >> type;
            switch (type) {
            case 1:
                cout << "After seasoning the pork chops\nCook them on a medium temperature grill.\nThey will be need to cook for approximately 4 to 5 minutes per side.";
                break;
            case 2:
                cout << "Smoking your pork chops will add great flavor.\nSmoke the pork chops at 250 degrees for approximately 45 minutes to 1 hour.";
                break;
            }while (type < 3);
            goto exit_loop;
        case 9:
            while (meat == 9) {
                cout << "A pork tenderloin needs time to be cooked to the perfect tempurature.\nFor the best pork tenderloin there is really only one option:\n";
                cout << "That one option is to smoke the pork tenderloin.\nWe need to cook this tenderloin for approximately 2.5 to 3 hours.\n";
                cout << "The internal temperature needs to reach at least 145 degrees.\n";
                goto exit_loop;
            }
        case 10:
            while (meat == 10) {
                cout << "Beef ribs needs to be cooked to an internal temperature that allows the connective fibers to break down\nso there is really only one option for this:\n";
                cout << "That one option is to smoke the ribs low and slow.\nWe need to cook this beef for approximately 8 to 10 hours.\n";
                cout << "The ribs are done when they are tender and have an internal temperature of 203 degrees.\n";
                goto exit_loop;
            }
        case 11:
            while (meat == 11) {
                cout << "Brisket needs to be cooked to an internal temperature that allows the connective fibers to break down\nso there is really only one option for this:\n";
                cout << "That one option is to smoke the brisket low and slow.\nWe need to cook this brisket for approximately 1.5 hour per pound.\n";
                double beefWeight;
                cout << "Please enter the weight of your brisket in pounds: ";
                cin >> beefWeight;
                double beefTime = beefWeight * 1.5;
                cout << "You will need to cook your brisket for " << beefTime << " hours.\nThe brisket will need an internal temperature of 203 degrees.\n";
                cout << "For the best results use a Texas crunch technique at around 160 degrees.\n";
                
                goto exit_loop;
            }
        case 12:
            while (meat == 12) {
                cout << "Prime rib Roast needs to be cooked to an internal temperature of rare to medium for the best results\n and there is really only one option for this:\n";
                cout << "That one option is to smoke the prime rib low and slow.\nWe need to cook this prime rib for approximately 40 minutes per pound.\n";
                double beefWeight;
                cout << "Please enter the weight of your prime rib in pounds: ";
                cin >> beefWeight;
                double beefTime = beefWeight * 0.67;
                cout << "You will need to cook your prime rib for " << beefTime << " hours.\n";
                cout << "The prime rib  will need an internal temperature according to the desired doneness listed below\n";
                string done_ness[3] = { "rare","medium rare", "medium" };
                int int_temp[3] = { 130, 135, 140 };
                for (int i = 0; i < 3; i++) {
                    cout << done_ness[i] << ":" << int_temp[i] << " degrees\n";
                }
                goto exit_loop;
                
            }
        }
    } while (meat < 13); {exit_loop:;

        string n;
        int a;
        Drink d1;

        cout << "What do you want to drink while your meat is cooking?\n";
        cout << "Enter your drink of choice: ";
        cin >> n;
        cout << "How many glasses do you think you can drink while your cooking? ";
        cin >> a;
        d1.setName(n);
        d1.setAmount(a);
        PrintDrink(d1);
        cout << "\nEnjoy your drink or drinks because you will love the food you're making.";
    }
}
void PrintDrink(Drink d1) {
    cout << "\nThe name of drink you picked: " << d1.getName();
    cout << "\nThe glasses you think you can drink are " << d1.getAmount() << endl;
}
int save() {
    ofstream outfile("bbqfile.csv", ios::app);
    ifstream infile;
    string cont;
    cout << "Would you like to save your selections to excell? (Y/N)";
    cin >> cont;
    while (cont == "Y") {
        outfile << meat << type << end;
    }
    outfile.close();
    while (cont == "N") {
        system("pause");
        return 0;
    }
}

Ответы [ 4 ]

0 голосов
/ 21 июня 2020

Я немного запутался, как вы хотите это сделать - особенно, если вы хотите, чтобы пользователь вводил «3» или если вы хотите, чтобы они вводили «Целый цыпленок». Если вы хотите сравнить строки, вы можете использовать карту, хотя это может не дать вам именно то, что вы хотите здесь, с учетом вложенного взаимодействия CLI. Но вот как это может выглядеть:

#include <map>

unordered_map<string, int> validEntrees = {
  "Chicken Wings": 1,
  "Chicken Breast": 2,
  "Whole Chicken": 3,
  // ...snip...
  "Brisket": 11,
  "Prime Rib Roast": 12,
}; // I'm not sure what the proper "value" type is. Using an int here, but a function might actually produce cleaner code.

string meat;
cout << "This program will blah blah blah...\n" // rest of the preamble
cout << "You can select any of the following to make today: \n";
for (auto key : validEntrees ) {
  cout << key << endl;
}
cout << "Your selection: ";
cin >> meat;
switch(validEntrees[meat]) {
  case 1: // Chicken Wings
    //... you get the idea
    break;
}

В зависимости от того, что вы хотите, это может сработать лучше, чем «нажмите 1 для куриных крылышек». Это, по сути, обходится без специального c оператора if / switch. Но теперь вам нужно беспокоиться о том, что пользователь предоставит что-то за пределами ожидаемых значений (хотя, честно говоря, вам всегда приходилось это делать).

Кроме того, если вас устраивает «нажмите 1 for ... ", то вы все равно можете рассмотреть возможность использования карты для возврата текстовых значений. В этом случае ключ и значения будут поменяны местами:

unordered_map<int, string> entreeSelectionToName = {
  1: "Chicken Wings",
}
cout << entreeSelectionToName[1] << endl; // should print "Chicken Wings"

Честно говоря, хотя есть вещи, которые я бы изменил в вашем решении (в частности: больше функций, описаний, связанных вместе), базовый c переключателя, вероятно, будет достаточно, если я не хочу особо фантазировать.

0 голосов
/ 21 июня 2020

Вы можете использовать char для выбора пользователя или string. Это не должно повлиять на возможность загрузки файла .csv.

0 голосов
/ 21 июня 2020

Используя переключатель, но я хочу сделать выбор с помощью строки вместо int

case s в операторе switch должны быть constexpr, поэтому в чтобы использовать строки в switch es, вам нужно выяснить, как заставить ваши строки соответствовать этим критериям.

По крайней мере, до C ++ 17 вы не можете - но вы можете сделать ха sh значение / дайджест сообщения, то есть constexpr.

switch(hasher(string)) {
case hasher("foo"):
    // do foo
    break;
case hasher("bar"):
    // do bar
    break;
}

Ваша функция hasher должна будет иметь возможность возвращать значение для строки, предоставленной во время компиляции, чтобы это работало. Конечно, можно написать constexpr ha sh функций для C строк.

0 голосов
/ 21 июня 2020

Вы можете использовать строки для сравнения выбранных пользователем вариантов меню.

string choice = " ";
cout<<"Enter choice "<<endl;
cin>>choice;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...