1

The code that is below is only the main portion and doesn't include the header file or the other cpp file. At the end of the program I want to print the users choices to a csv file. Unless I can change the way the user makes their choice, I don't see how to do this.

1.Can I use something other int for the user's choices?

2.If I'm able to do something other than int for the user's choices, would it work to just have the print to csv code at the end like I have so far?

#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;
    }
}
Adam Hustedde
  • 33
  • 1
  • 3
  • Please read about how to creat a [mcve] – Ted Lyngmo Jun 20 '20 at 23:17
  • Does this answer your question? [Why the switch statement cannot be applied on strings?](https://stackoverflow.com/questions/650162/why-the-switch-statement-cannot-be-applied-on-strings) – ChrisMM Jun 20 '20 at 23:48

4 Answers4

0

You can use strings to make a comparison between the user's selected choice of the menu.

string choice = " ";
cout<<"Enter choice "<<endl;
cin>>choice;
Omar
  • 53
  • 7
0

You can use char for the user's choices or string. This shouldn't change the ability to upload the .csv file.

0

Using switch but I want to make the selection with a string instead of an int

The cases in a switch statement need to be constexpr so in order to use strings in switches, you need to figure out how to make your strings pass that criteria.

At least up to C++17, you can't - but you can make a hash value / message digest that is constexpr.

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

Your hasher function will need to be able to return a value for the string supplied at compile time for this to work. It's certainly possible to write constexpr hash functions for C strings.

Ted Lyngmo
  • 93,841
  • 5
  • 60
  • 108
  • I actually added a `constexpr` hash function to an old answer. Noone liked it so take it with a grain of salt: https://stackoverflow.com/a/58217222/7582247 – Ted Lyngmo Jun 21 '20 at 00:44
0

I'm a little confused how you want to do this -- specifically if you want the user to type in "3" or if you want them to type in "Whole Chicken". If you want to compare strings, you might look at using a map, though that might not get you exactly what you want here, given the nested CLI interaction. But here's what it might look like:

#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;
}

Depending on exactly what you want, this might work better than "press 1 for chicken wings". This, in essence, gets around having a specific if/switch statement. But, you now have to worry about the user providing something outside of the expected values (though, to be fair, you always had to do that).

Also, if you're happy with the "press 1 for ..." solution, then you might still consider a map to get back plain text values. In that case, the key and values would be swapped:

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

Honestly, while there are things I would change about your solution (in particular: more functions, descriptions bundled together), the basic switch is probably sufficient, unless I want to get particularly fancy.

Hikash
  • 419
  • 3
  • 6