3

所以它经常出现在我的课程中,我需要能够拥有一个用户可以多次执行操作的程序。

所以我写了类似的东西

boolean continue=true;

while (continue) {
    //do code
    boolean isAnswerGood=false;
    while (!isAnswerGood) {
        cout << "Do you wish to continue" << endl;
        string answer;
        getline(cin, answer);
        if (answer=="y") //or something else
            isAnswerGood=true;
        else if (answer=="n") {
            isAnswerGood=true;
            continue=false;
        } else 
            cout << "That wasnt "y" or "n" please type something again" << endl;
    }
}

对于如此简单的事情,这似乎很臃肿并且有很多代码。我愿意在这个问题上跳出框框思考,所以如果有人可以给我一个关于更好解决方案的线索,我将不胜感激。

4

4 回答 4

4

将其分解为单独的功能。(几乎总是回答“我如何写一个雄辩的......?”)

例如:

do {
  // something
} while (UserWantsMore());

/////////

bool UserWantsMore() {
  std::string answer = GetAnswer("Continue?");
  while (!GoodAnswer(answer))
    answer = GetAnswer("Please answer 'yes' or 'no'!");
  return IsAnswerYes(answer);
}

bool GoodAnswer(const std::string& answer) {
  return !answer.empty() && (answer[0] == 'y' || answer[0] == 'n');
}

bool IsAnswerYes(const std::string& answer) {
  return !answer.empty() && answer[0] == 'y';
}

std::string GetAnswer(const char* prompt) {
  std::cout << prompt << std::cend;
  std::string answer;
  std::getline(std::cin, answer);
  return answer;
}
于 2013-04-24T00:48:52.930 回答
3

对不起,但那是关于正确数量的代码。与其他一些语言相比,C 和 C++ 相对冗长。

但是,如果这是一个常见问题,您可以将其抽象出来并从中制作一个函数。该功能将与您已经拥有的功能非常相似,但是您可以这样称呼它:

boolean again = true;
while (again) {
    // do code
    again = ask_user("Do you wish to continue?", "y", "n");
}

论据ask_user()应该是要问的问题,接受的答案是“是”,接受的答案是“否”。可以使用第二个和第三个参数生成错误消息(关于意外输入),因此我们实际上不需要将其传入。

当然,问题可能比这更复杂......如果您的代码将被非英语使用者使用怎么办?如果您需要处理本地化,您可以创建一个基本函数,其中包含传入的所有字符串,包括错误消息,然后创建一个用户使用语言规范调用的包装器。这是一个示例,这次使用 C++ 中的“无限循环”:

for (;;) {
    // do code
    if (!ask_user_yesno("en_us"))  // locale: English, USA
        break;
}
于 2013-04-24T00:48:45.500 回答
2

如果你只是想用更少的代码让你已经拥有的东西做同样的事情,这将起作用。

string answer="y";

while (answer=="y") {
    //do code
    for(;;) {
        cout << "Do you wish to continue" << endl;
        getline(cin, answer);
        if ((answer=="y")||(answer=="n")) break;
        cout << "That wasnt \"y\" or \"n\" please type something again" << endl;
    } 
}

代码略少,但更模糊:

string answer="y";

while (answer!="n") {
    if (answer=="y") {
        //do code
    } else {
        cout << "That wasnt \"y\" or \"n\" please type something again" << endl;
    }
    cout << "Do you wish to continue" << endl;
    getline(cin, answer);
}

这是一个<termios.h>用来获得答案的版本。它使用更多代码,但表现得更“雄辩”。

int getch (void)
{
    int c;
    struct termios oldt;
    struct termios newt;
    tcgetattr(STDIN_FILENO, &oldt);
    newt = oldt;
    newt.c_lflag &= ~ICANON;
    tcsetattr(STDIN_FILENO, TCSANOW, &newt);
    c = getchar();
    tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
    return c;
}

bool again (std::string prompt, std::string yes, std::string no)
{
    bool doyes = false;
    bool dono = false;
    for (;;) {
        std::cout << prompt;
        int c = getch();
        std::cout << std::endl;
        doyes = (yes.find(c) != yes.npos);
        dono = (no.find(c) != no.npos);
        if (doyes || dono) break;
        std::cout << "Type [" << yes << "] for yes, or [" << no << "] for no.";
        std::cout << std::endl;
    }
    return doyes;
}

您可以按照其他人的建议使用它:

do {
    // the interesting code
} while (again("Do you wish to continue? ", "y", "n"));

于 2013-04-24T01:47:38.167 回答
0

怎么样:

void DoYesCode()
{
   // Do the code for the yes stuff...
}

...

do{
    cout << "Do you wish to continue" << endl;
    string answer; 
    getline(cin, answer);
    if (answer=="y")
       DoYesCode();
    else if (answer=="n")
       break;
    else 
       cout << "That wasnt 'y' or 'n' please type something again" << endl;
} while(true);
于 2013-04-24T01:02:05.687 回答