2011-05-27 211 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