2011-05-27 130 views
1

所以我试图做一个简单的应用程序,测验用户。它会提出一个问题,用户回答1,2,3或4.然后,应用程序将采用该答案,如果正确,则会在最后显示的total_score中添加+1。一切看起来都对我有用,但是当我运行它并且到达if (q1_valid == false)部分时,它跳过cout并运行goto,无论q1_valid是true还是false。C++ if ... then语句

#include <iostream> 

using namespace std; 

int main() 
{ 
    int q1_answer; 
    int total_score; 
    bool q1_correct; 
    bool q1_valid; 

    Question_1: 
    cout << "Question 1 (#3 is correct)" << endl; 
    cout << "1.) Answer 1" <<endl; 
    cout << "2.) Answer 2" <<endl; 
    cout << "3.) Answer 3" <<endl; 
    cout << "4.) Answer 4" <<endl; 
    cin >> q1_answer; 

    if (q1_answer == 1) 
    q1_correct = false; 
    q1_valid = true; 

    if (q1_answer == 2) 
    q1_correct = false; 
    q1_valid = true; 

    if (q1_answer == 3) 
    q1_correct = true; 
    q1_valid = true; 

    if (q1_answer == 4) 
    q1_correct = false; 
    q1_valid = true; 

    if (q1_valid == false) 
    cout << "Invalid answer." <<endl; 
    goto Question_1; 

    if (q1_correct == true) 
    cout << "Correct!" <<endl; 
    (total_score + 1); 
    goto Question_2; 

    if (q1_correct == false) 
    cout << "Incorrect." <<endl; 
    goto Question_2; 

    if (q1_valid == false) 
    goto Question_1; 

    Question_2: 
    cout<< "Q2" <<endl; 
cin.ignore(); 
cin.ignore(); 
} 
+2

用于下一次提示:反引号是主代码的报价。对于块引用代码,可以缩进四个空格或按下“{}”按钮。 – 2011-05-27 21:34:03

+7

你使用C++多久了?你需要用花括号包装你的if语句。 – 2011-05-27 21:34:11

+0

这是实际的代码吗?导致你的if似乎有很多陈述,但只有一个实际上与if相关,因为你不使用{} – 2011-05-27 21:35:16

回答

5

我这里有几个技巧:

  1. 如果...则是有条件的,不是循环。对不起,这只是我有点挑剔。 ;)
  2. 永远不会使用goto。高级用法:只有在有充分的理由时才能使用goto。
  3. 测试布尔值时,不需要“== true”或“== false”。
  4. 看起来你还没有学会如何使用else语句。这将使您的程序更易于阅读,调试和理解。如上所述,括号也是必需的。
+2

6.变量未定义。除非C++将布尔值默认为'false',否则这可能会导致他的代码出现问题。 – CanSpice 2011-05-27 21:38:14

+0

这是一个很好的观点。我不想挑选一个明显是学生的人(我们都在那里一次!),所以我试着停下来,然后才真正开始学习。 – 2011-05-27 21:52:51

+0

@CanSpice但我定义了布尔变量,因为它出现了,不应该完成相同的事情吗? (尽管它会添加更多无用的代码行)。 – h3half 2011-05-27 21:59:47

2

你不必绕语句括号中的如果,所以才有了第一条语句是有条件后。在这种情况下,这意味着“q1_valid = true;”无论答案是什么,它都会运行。

if (q1_answer == 4) { 
q1_correct = false; 
q1_valid = true; 
} 

您需要一个编辑器,通过缩进显示您。

Emacs会,例如

+0

或者vim ;-) – 2011-05-27 21:40:38

+0

@Fredrik:emacs的第一条规则是C-x M-c M-butterfly。 emacs的第二条规则是不要谈论vim。 – 2011-05-27 21:43:04

+0

http://www.karakas-online.de/myLinuxTips/images/viman.png但我确实很喜欢xkcd的参考! – 2011-05-27 21:44:46

3

您需要使用括号:

if (q1_valid == false) { 
    cout << "Invalid answer." <<endl; 
    goto Question_1; 
} 

如果不使用斗拱,if只执行第一条语句直接跟随它,如果if条件评估为真。

+2

我会说第一个陈述,而不是第一行。 – 2011-05-27 21:38:20

+0

@Vlad:好点,固定。 – CanSpice 2011-05-27 22:53:17

2

不要忘记使用括号。

2

if语句的括号是必需的。

你有没有考虑使用switch语句:

switch (q1_answer){ 
    case 1: 
    q1_correct = false; 
    q1_valid = true; 
    break; 
    case 2: 
    q1_correct = false; 
    q1_valid = true; 
    break; 
    case n: 
    //... 
    break; 
} 
+3

'switch case'显然比@ h3half的代码中if语句的使用方式要好,但是应该注意的是,既不_really_好(最好只比较一次_variable_表示正确的答案,并且if这是不正确的,那么如果给定答案在有效答案的范围内,则只检查一次)。 – leftaroundabout 2011-05-27 21:46:30

+0

@leftaroundabout这只是对有问题的代码的建议。这并没有改善它的逻辑。 – Secko 2011-05-27 21:49:52