2013-02-13 178 views
0

我在編程方面是全新的,最近我發現這個網站幫助教育我的自我。 我正在嘗試使用「C」來編寫一個程序,該程序會在我的書中遇到三種不同類別的成績提示,並且我認爲它們是我最好的選擇。 我目前的代碼看起來像這樣。如何使用while循環

int countA; 
int gradeA; 
int totalA; 
int weightA; 
float averageA; 

int countE; 
int gradeE; 
int totalE; 
int weightE; 
float averageE; 

int countQ; 
int gradeQ; 
int totalQ; 
int weightQ; 
float averageQ; 

totalA = 0; 
countA = 0; 

totalE = 0; 
countE = 0; 

totalQ = 0; 
countQ = 0; 

printf("Enter Assignment Grade, -1 to end: "); /* prompt for input */ 
scanf("%d", &gradeA); 

while (gradeA != -1){ 
totalA = totalA + gradeA; /* add gradeA to totalA */ 
    countA = countA + 1; 
     printf("Enter Assignment Grade, -1 to end: "); /* prompt for input */ 
     scanf("%d", &gradeA); 
} 
if (countA != 0) { 
averageA = (float) totalA/countA; 
printf("total is %.2f\n", averageA); 
} 



printf("Enter Exam Grade, -1 to end: "); /* prompt for input */ 
scanf("%d", &gradeE); 

while (gradeE != -1){ 
totalE = totalE + gradeE; /* add gradeE to totalE */ 
    countE = countE + 1; 
     printf("Enter Exam Grade, -1 to end: "); /* prompt for input */ 
     scanf("%d", &gradeE); 
} 
if (countE != 0) { 
averageE = (float) totalE/countE; 
printf("total is %.2f\n", averageE); 
} 


printf("Enter Quiz Grade, -1 to end: "); /* prompt for input */ 
scanf("%d", &gradeQ); 

while (gradeQ != -1){ 
totalQ = totalQ + gradeQ; /* add gradeQ to totalQ */ 
    countQ = countQ + 1; 
     printf("Enter Quiz Grade, -1 to end: "); /* prompt for input */ 
     scanf("%d", &gradeQ); 
} 
if (countQ != 0) { 
averageQ = (float) totalQ/countQ; 
printf("total is %.2f\n", averageQ); 
} 

我們什麼,我想這點後,做的是兩次重複這個過程,但是當我嘗試運行exe文件我得到的第1部分運行,但其他兩個部分根本就沒有得到由於某種原因而提出的。這是否僅限於重複陳述的內容?或者我有一個錯誤在哪裏。我試圖弄清楚我做錯了什麼,但我只是看到它。

我不太確定如何正確發佈這裏,但這是我得到的輸出的一個例子。

這裏是我輸出的一個例子,你可以看到它提示我輸入第一個段,它是Assignment部分,但是輸入-1結束循環後,它給出了平均值和結束值。

C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin>project1.exe 
Enter Assignment Grade, -1 to end: 100 
Enter Assignment Grade, -1 to end: 80 
Enter Assignment Grade, -1 to end: 77 
Enter Assignment Grade, -1 to end: 33 
Enter Assignment Grade, -1 to end: 76 
Enter Assignment Grade, -1 to end: 92 
Enter Assignment Grade, -1 to end: -1 
total is 76.33 

我的身影,至少第一部分工作,但我得到我之後不提示接下來看看總然後請求對考試成績。

+0

請後輸出。我懷疑你沒有看到提示,因爲你需要調用'fflush(stdout)'。很多終端都是行緩衝的,除非你寫一個換行符(或顯式刷新),否則默認情況下不會將輸出刷新到屏幕。 – paddy 2013-02-13 22:19:47

+1

在我的Mac(鏗鏘聲)和Windows(vc2012)上運行良好。 – WhozCraig 2013-02-13 22:22:33

+0

很難想象在讀取輸入前沒有刷新輸出的任何C I/O庫。 – 2013-02-13 22:42:40

回答

2

您可以遇到的一個常見問題是輸出緩衝。在您的代碼中:

printf("Enter Assignment Grade, -1 to end: "); /* prompt for input */ 
scanf("%d", &gradeA); 

您的終端可能不會將輸出緩衝區刷新爲屏幕。所以它會等待輸入,但是您可能看不到提示。強制它,你可以這樣做:

printf("Enter Assignment Grade, -1 to end: "); /* prompt for input */ 
fflush(stdout); 
scanf("%d", &gradeA); 

現在,這使得更多的重複。如果你只需要爲每個循環寫一次提示而不是兩次,那會更好。你可以通過在循環之前將gradeA初始化爲零來解決這個問題。然後在循環中的第一個計算不產生任何影響:

gradeA = 0; 
totalA = -1; 

while (gradeA != -1) 
{ 
    totalA = totalA + gradeA; 
    countA = countA + 1; 
    printf("Enter Assignment Grade, -1 to end: "); 
    fflush(stdout); 
    scanf("%d", &gradeA); 
} 

通知我設置countE爲-1,以撤消您在循環頂部增加它的事實。這一切都開始感覺有點笨拙。

另一個問題是,如果用戶輸入的不是整數,那麼程序會產生未定義的行爲(因爲您實際上沒有初始化gradeA)。您可以測試scanf是否成功,因爲它返回它讀取的項目數。

懶惰的做法是這樣的:

if(1 != scanf("%d", &gradeA)) { 
    printf("Invalid input!"\n"); 
    exit(1); 
} 

你可以決定。我會在答案的其餘部分忽略這一點。

當你加強你的循環,很明顯代碼重複是一個主題。你正在改變的是變量和提示。因此,它可能是時候把它變成一個功能:

int grade_average(const char *what, int *total, float *average) 
{ 
    int count = -1; 
    int grade = 0; 
    *total = 0; 

    while(grade != -1) 
    { 
     count++; 
     *total += grade; 

     printf("Enter %s Grade, -1 to end: ", what); 
     fflush(stdout); 

     if(1 != scanf("%d", &grade)) return 0; // fail on input error. 
    } 

    if(count > 0) { 
     *average = (float)*total/count; 
    } 

    return 1; 
} 

現在你可以這樣調用:

if(grade_average("Assignment", &totalA, &averageA)) { 
    printf("Total is %.2f\n", averageA); 
} 

if(grade_average("Exam", &totalE, &averageE)) { 
    printf("Total is %.2f\n", averageE); 
} 

if(grade_average("Quiz", &totalQ, &averageQ)) { 
    printf("Total is %.2f\n", averageQ); 
} 
+0

感謝您的幫助,我想了解您在這裏告訴我的大部分內容,因此我可能需要一段時間才能瞭解它,但我必須問,這是否允許我在「作業」部分之後繼續輸入數據已經進入? – Ruisu 2013-02-13 23:38:18