我该怎么写一个雄辩的继续?

时间:2013-04-24 00:38:26

标签: c++ loops

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

所以我写了像

这样的东西
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 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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;
}

答案 2 :(得分: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"));

答案 3 :(得分: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);