使用 switch,但我想用字符串而不是 int 进行选择

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

本文关键字:int 选择 行选 字符串 switch 使用      更新时间:2023-10-16

下面的代码只是主要部分,不包括头文件或其他 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 << "nnThis 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. nn";
cout << "Can we start with getting your name : ";
cin >> userName;
cout << userName << " welcome to this BBQ program.nn";
cout << "You can select any of the following to make today: n";
cout << "1 - Chicken Wingsn";
cout << "2 - Chicken Breastn";
cout << "3 - Whole Chickenn";
cout << "4 - Chicken Thighsn";
cout << "5 - Pork Ribsn";
cout << "6 - Pork Roastn";
cout << "7 - Pulled Porkn";
cout << "8 - Pork Chopsn";
cout << "9 - Pork Tenderloinn";
cout << "10 - Beef Ribsn";
cout << "11 - Brisketn";
cout << "12 - Prime Rib Roastn";
cout << "Your selection: ";
cin >> meat;
switch (meat)
{
case 1:
cout << "Chicken Wings can be amazing.n You have two options:n";
cout << "grill - Grill themn";
cout << "smoke - Smoke themn";
cout << "Your selection: ";
cin >> type;
switch (type) {
case 1:
cout << "After seasoning the chickennCook 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 themn";
cout << "2 - Smoke themn";
cout << "Your selection: ";
cin >> type;
switch (type) {
case 1:
cout << "After seasoning the chickennCook 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 poundn";
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 themn";
cout << "2 - Smoke themn";
cout << "Your selection: ";
cin >> type;
switch (type) {
case 1:
cout << "After seasoning the chickennCook 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 downnso 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 themn";
cout << "2 - Smoke themn";
cout << "Your selection: ";
cin >> type;
switch (type) {
case 1:
cout << "After seasoning the pork chopsnCook 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 downnso 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 downnso 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 resultsn 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 belown";
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] << " degreesn";
}
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;
}
}

您可以使用字符串在用户选择的菜单之间进行比较。

string choice = " ";
cout<<"Enter choice "<<endl;
cin>>choice;

您可以使用char进行用户的选择或string。这不应更改上传.csv文件的功能。

使用 switch,但我想用字符串而不是 int 进行选择

switch语句中的case需要constexpr,因此为了在switches 中使用字符串,您需要弄清楚如何使字符串通过该条件。

至少最多 C++17,你不能 - 但你可以制作一个constexpr的哈希值/消息摘要。

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

您的hasher函数需要能够返回编译时提供的字符串的值才能正常工作。当然可以为 C 字符串编写constexpr哈希函数。

我有点困惑你想怎么做——特别是如果你想让用户输入"3"或者你想让他们输入"整只鸡"。如果要比较字符串,可以考虑使用映射,尽管考虑到嵌套的 CLI 交互,这可能无法完全满足您的需求。但这可能是它的样子:

#include<地图>unordered_map<string,> validEntree = { "鸡翅": 1, "鸡胸肉":2, "整只鸡":3,//...剪 断。。。 "牛腩":11, "上等肋骨烤肉":12, };我不确定正确的"值"类型是什么。在这里使用 int,但函数实际上可能会生成更干净的代码。 串肉; cout <<"这个程序会等等等等..."//序言的其余部分 cout <<"您可以选择以下任何一项来制作今天:"; for (autokey : validEntree ( { 库特<<关键<<恩德尔; } cout <<"您的选择:"; 中>>肉; switch(validEntree[meat]( { 案例1://鸡翅//...你明白了 破; }

根据您想要的内容,这可能比"按 1 获取鸡翅"效果更好。从本质上讲,这绕过了特定的 if/switch 语句。但是,您现在必须担心用户提供超出预期值的内容(尽管公平地说,您总是必须这样做(。

另外,如果您对"按 1 ..."的解决方案,那么您仍然可以考虑使用地图来获取纯文本值。在这种情况下,键和值将被交换:

unordered_map<int,> entreeSelectionToName = { 1:"鸡翅", } cout <<entreeSelectionToName[1] <<endl;应该打印"鸡翅">

老实说,虽然我会对您的解决方案进行更改(特别是:更多功能,捆绑在一起的描述(,但基本开关可能就足够了,除非我想特别花哨。