2012-08-07 55 views
-1

所以我一直在研究iTunes U上的哈佛CS50課程,並且遇到了一些問題。代碼運行然後停止。我解釋了代碼給我帶來麻煩的問題。代碼運行正常,但在執行的一半中隨機停止

// Program calculates the amount of change you can give with the least amount of coins. 

#include <stdio.h> 
#include <cs50.h> 
#include <math.h> 

int 
main(void) 
{ 

    float change = 0, inputflag = 1; 
    int changeint = 0; 
    int quarter = 25, dime = 10, nickel = 5, penny = 1; // Coins and values 
    int qc = 0, dc = 0, nc = 0, pc = 0; // Coin value change (Qc = Quarter Change) 

// Prompts user for input and validates. 

    while (inputflag == 1) 
    { 
     printf("How much change? "); 
     change = GetFloat(); 

     if (change == 0) 
     { 
      printf("You have no change!\n"); 
      inputflag = 0; 
     } 
     else if (change > 0) 
     { 
      printf("%.2f\n", change); 
      inputflag = 0; 
     } 
     else 
     { 
      printf("Please enter a non-negative number! \n"); 
     } 
    } 

程序在此停止。我運行代碼,輸入一個可接受的值,然後程序停止運行。它不會移動到下面的部分。

我已經花了最後一個小時過去了,仍然無法弄清楚什麼是讓程序運行。 inputflag值被設置爲0,從而打破第一個while循環,然後應該在下面移動,如果(更改!= 0),它不會......因此,任何建議將不勝感激。

if (change != 0) // If the change is zero, this section is skipped 
     { 
      changeint = round(100 * change); 
      printf("%d", changeint); 
     } 

     // The following four sections subtract coin amount, compare it, and add 1 to count. 
      while (changeint >= quarter);  
      { 
       changeint = changeint - quarter; 
       qc = qc + 1; 
      } 

      while (changeint >= dime); 
      { 
       changeint = changeint - dime; 
       dc = dc + 1; 
      } 

      while (changeint >= nickel); 
      { 
       changeint = changeint - nickel; 
       nc = nc + 1; 
      } 

      while (changeint >= penny); 
      { 
       changeint = changeint - penny; 
       pc = pc + 1; 
      } 

//Prints output 

      printf("You owe a total of %d coins!", qc + dc + nc + pc); 

} 
+0

此外,您可能需要閱讀模數('%')運算符。它會讓你擺脫這個應用程序中的很多代碼。 – duskwuff 2012-08-07 00:27:55

+0

順便說一下,你可以使用'break;'打破循環,不需要使用變量 – 2012-08-07 00:28:08

+0

哦,我忘了 - GetFloat語句是在一個課程獨家圖書館。但是,我不認爲這是問題,因爲它沒有突破外觀。我會嘗試'break;'語句並回報 – user1580558 2012-08-07 00:31:27

回答

6

在每個while聲明的第一行的分號是責任。您應該刪除它們,以避免一個必然的無限循環:

 while (changeint >= quarter) 
     { 
      changeint = changeint - quarter; 
      qc = qc + 1; 
     } 

     while (changeint >= dime) 
     { 
      changeint = changeint - dime; 
      dc = dc + 1; 
     } 

     while (changeint >= nickel) 
     { 
      changeint = changeint - nickel; 
      nc = nc + 1; 
     } 

     while (changeint >= penny) 
     { 
      changeint = changeint - penny; 
      pc = pc + 1; 
     } 

是,即使是最簡單的問題可能被忽略,和/同時用分號語句是其中之一(可以預期)。

+1

這就是爲什麼你應該編譯並注意警告。海灣合作委員會,至少,警告這個錯誤。 – Kevin 2012-08-07 00:48:31

+0

甜。這個伎倆。然而,我仍然對爲什麼代碼沒有執行到'if(change!= 0)而感到困惑//如果變化爲零,這部分被跳過 { changeint = round(100 * change) ; printf(「%d」,changeint); } '如果問題出現在while語句中 – user1580558 2012-08-07 00:51:26

+0

printf()調用不能保證程序沒有執行任何語句。你可能沒有看到這個值被打印到標準輸出,這讓你做了這個假設。但是請記住,一旦printf()被調用,實際的打印過程就被系統所佔用,並且在調用之後可能不會立即發生。 – 2012-08-07 00:58:34