2009-10-02 42 views
7

我有一個基本的C程序,產生一個數字,用戶必須猜到它(你已經把它稱爲:家庭作業)。我能夠得到幾乎所有的東西,所以我有點自豪,但我打開任何錯誤,當然我仍然在學習。我的兩個主要問題是:如何在C中儘早結束循環?

  1. 如何在用戶選擇正確的編號之前提前結束該程序,然後才能達到#10次嘗試?和
  2. 任何明顯的錯誤,大師可以看到,我沒有與我的代碼?

我想是最好的,程序中,我可以:)

int main(void) 
{ 
    int x = 10; 
    int i = 0; 
    int target, guess; 
    int numGuess = 0; 

    /*create a random number*/ 
    //create random function 
    srand(time(NULL));//this creates new number based on time which changes every second :) 
    target = rand() % 99; //create a random number using the rand() function, from 0 -99 



    do{ 
     //increase the loop until it meets the x variable 
     i++; 
     numGuess++; 
     //allow user to input a number for guess 
     scanf("%d", &guess); 
     if (guess == target) 
     { 
      printf("You win! \n\n"); 

     } 
     else if (guess > target) 
     { 
      printf("You are too high. Guess a number:\n\n"); 
     } 
     else if (guess < target) 
     { 
      printf("You are too low. Guess a number:\n\n"); 
     } 

    }while(i < x); 
     printf("You lose, the number was %d. \n", target); 

    printf("Number of tries %d\n", numGuess); 
    printf("Enter any key to exit..."); 
    getchar(); 
    getchar(); 

    return 0; 
} 
+2

你被教過基本的程序結構,do/while循環,IO,sscanf,rand,種子rng,但不是'break'? – Jason 2009-10-02 01:11:07

+4

很高興見到您評論過你的代碼 - 做得好:d – 2009-10-02 01:11:51

+0

爲什麼有兩個的getchar()在結束通話,當你說只想要1個鍵結束程序? – 2009-10-02 01:14:11

回答

15

使用break語句來跳了一個循環:在這種情況下,儘管這可能不是你,因爲一旦想要什麼你打破循環,你會立即看到「你輸了」的信息。你可能需要重組你的程序來解決這個問題。

嘗試這樣:

int main(void) 
{ 
    int x = 10; 
    int i = 0; 
    int target, guess; 
    int numGuess = 0; 

    /*create a random number*/ 
    //create random function 
    srand(time(NULL));//this creates new number based on time which changes every second :) 
    target = rand() % 99; //create a random number using the rand() function, from 0 -99 

    do { 
     //increase the loop until it meets the x variable 
     i++; 
     numGuess++; 
     //allow user to input a number for guess 
     scanf("%d", &guess); 
     if (guess == target) 
     { 
      printf("You win! \n\n"); 
      break; 
     } 
     else if (guess > target) 
     { 
      printf("You are too high. Guess a number:\n\n"); 
     } 
     else if (guess < target) 
     { 
      printf("You are too low. Guess a number:\n\n"); 
     } 

    }while(i < x); 

    if (guess != target) { 
     printf("You lose, the number was %d. \n", target); 
    } 

    printf("Number of tries %d\n", numGuess); 
    printf("Enter any key to exit..."); 
    getchar(); 
    getchar(); 

    return 0; 
} 
+8

你不應該發佈完整的修改程序來回答作業問題。即使海報在未應用給出的答案的情況下學習材料,海報仍然會遇到麻煩,因爲有人向他們展示了完整的答案。 – Novelocrat 2009-10-02 01:21:42

+1

@Novelocrat - 點採取:) – 2009-10-02 13:29:03

9

您正在尋找break命令。

for (int i = 0; i < 10; i++) { 
    if(i == 5) 
     break; 
} 

This resource看起來對您很有幫助。

作爲一個方面說明:無論如何,您的「你輸」文本將始終顯示。你可能想要在do {}循環中評估它。


總是領先於我對這個答案的帖子/編輯Andrew Hare!

+0

For循環不應該使用的情況下是正確的響應。雖然有些東西是正確的處理方法。 – 2016-08-19 13:52:09

0

在你的程序的情況下,實現這一目標的最好的方法可能調用

無效退出(INT狀態);

(包括stdlib.h中)打印「你贏了」

一般來說,你可以使用關鍵字「破發」,在任何時候退出循環後

。這不會在你的情況下產生預期的效果,因爲它會繼續打印「你輸了......」。如果你想使用「休息」,你將不得不在「你輸了......」位置加一個「if」聲明,並檢查用戶是否沒有贏。

+4

我非常不喜歡用'exit()'退出程序;我會親自保留它用於致命錯誤。在這個例子中,使用'break'是微不足道的,或者按照建議改變while條件。 – Twisol 2009-10-02 01:14:52

9

爲什麼不將while條件設置爲用戶的猜測?例如:

...}while(i < x || guess !== target); 
+2

使用break會更好,因爲代碼的意圖會更明顯。 – 2009-10-02 01:17:08

+3

你這麼認爲?我認爲在這個時候結束它更加明顯。這就像說:「我會一直問,直到你做對了,或者沒有機會」。休息一下使得它看起來像是發生了錯誤或者更重要的事情需要注意...... – Anthony 2009-10-02 01:20:27

+2

我會不同意。在這種情況下,可以看到當它結束時進入循環。使用break,必須閱讀才能通過代碼來了解這一點。 – 2009-10-02 01:21:07

8

這裏有三種可能性。閱讀關於他們! (後藤認爲是有害的)

if (guess == target) 
{ 
    printf("You win! \n\n"); 
    break; 
} 

if (guess == target) 
{ 
    printf("You win! \n\n"); 
    goto end; 
} 


if (guess == target) 
{ 
    printf("You win! \n\n"); 
    i=n; 
} 
+1

而且在某些情況下'return some_value;'也是。 – dmckee 2009-10-02 02:13:47

1

我沒有看到任何「明顯的錯誤」,以前的海報並沒有提及,不是事實,有突破,你不再需要兩個「I」和「numGuess」等因爲它們始終具有相同的價值。在這種情況下只需使用numGuess而不是「我」。

但是我想強烈推薦你讓你的代碼更具可讀性 - 在獲得和鞏固壞習慣之前,現在就應該養成良好的編碼風格習慣。

  • 始終使用自描述標識符(變量/函數名稱)。例如。你的「x」應該被稱爲「maxGuesses」。

  • 不要在白色空間上吝嗇。例如。 「} while(i < x);」應該是「} while(i < x);」

  • 你似乎已經養成了不吝惜評論的習慣 - 很好!

    只要記住,註釋應該始終描述後面的代碼做的,而不是它是如何做它的機制是什麼目的,除非力學是如此棘手和聰明的,它也需要解釋。

的原因,這是重要的是兩個方面:開發時間

  • 80-90%/努力通常被用在維護現有的代碼,你自己的還是別人的。通過記錄良好且易於閱讀的代碼,該任務更容易。 (你不知道在生產問題上凌晨2點讀不熟悉的代碼能夠維持多少腦損傷,只是因爲編寫它的bozo沒有一致地縮進代碼)。

  • 有良好的記錄和可讀的代碼使它更容易編寫它,因爲它闡明瞭你自己的想法,並阻止愚蠢的打字錯誤(「oups,我打算用x代替y」)。