2014-02-22 32 views
0

在我的一個問題集中,我需要重寫一個程序,該程序已切換到if/else語句。將開關程序重寫爲if

該計劃是對輸入的成績進行計數,所以如果我輸入「a」,它會記錄下來,當我退出程序時,它會給用戶輸入所有成績的最終計數。

我有兩個問題,第一個問題是它根本無法正常工作,它不會像我設置的合法字符那樣讀取字符輸入。第二個是如何防止其他if語句在執行正確的語句之後執行。

我把它設置爲if/else語句中的中斷。我不確定他們是否工作,因爲該計劃顯然甚至不接受角色。

我打算讓他們轉到,但原來的程序有中斷,所以我用它們代替。

{ 
int grade; 
int aCount=0; 
int bCount=0; 
int cCount=0; 
int dCount=0; 
int fCount=0; 

puts("Enter the letter grades"); 
puts("Enter EOF to end input"); 

while((grade = getchar()) != EOF) 
    { 

     if(grade == 'A' && grade == 'a') 
     { 
      ++aCount; 
      break; 
     } 
     else 
     { 
      printf("%s\n", "That's not a valid grade, please enter again"); 
      break; 
     } 

     if(grade == 'B' && grade == 'b') 
     { 
      ++bCount; 
      break; 
     } 
     else 
     { 
      printf("%s\n", "That's not a valid grade, please enter again"); 
      break; 
     } 

     if(grade == 'C' && grade == 'c') 
     { 
      ++cCount; 
      break; 
     } 
     else 
     { 
      printf("%s\n", "That's not a valid grade, please enter again"); 
      break; 
     } 

     if(grade == 'D' && grade == 'd') 
     { 
      ++dCount; 
      break; 
     } 
     else 
     { 
      printf("%s\n", "That's not a valid grade, please enter again"); 
      break; 
     } 

     if(grade == 'F' && grade == 'f') 
     { 
      ++fCount; 
      break; 
     } 
     else 
     { 
      printf("%s\n", "That's not a valid grade, please enter again"); 
      break; 
     } 
    } 

puts("\nTotals for each letter grade are:"); 
printf("A: %d\n", aCount); 
printf("B: %d\n", bCount); 
printf("C: %d\n", cCount); 
printf("D: %d\n", dCount); 
printf("F: %d\n", fCount); 

return 0; 

}

+0

您需要鏈'其他if'你的條件和'else'報告錯誤完成鏈。 –

+0

你預計什麼時候'grade =='A'&& grade =='a''爲真? –

+0

儘管我們可以猜測你原來的'switch'版本是什麼樣子,但將它包含在你的問題中仍然很有幫助。 –

回答

4

雖然它的語法正確使用if語句內線突破,它的混亂,因爲它是真正打破while語句封閉的了。類似這樣的東西更接近你要找的東西:

puts("Enter EOF to end input"); 

while((grade = getchar()) != EOF) { 
    if(grade == 'A' || grade == 'a') 
     ++aCount; 
    else if(grade == 'B' || grade == 'b') 
     ++bCount; 
    else if(grade == 'C' || grade == 'c') 
     ++cCount; 
    else if(grade == 'D' || grade == 'd') 
     ++dCount; 
    else if(grade == 'F' || grade == 'f') 
     ++fCount; 
    else 
     printf("That's not a valid grade, please enter again\n"); 
} 

puts("\nTotals for each letter grade are:"); 
printf("A: %d\n", aCount); 
printf("B: %d\n", bCount); 
printf("C: %d\n", cCount); 
printf("D: %d\n", dCount); 
printf("F: %d\n", fCount); 

return 0; 
} 
+0

我認爲每個年級都有一個變量是愚蠢的。審查委員會如何增加另一個等級?當一個數組可以更容易地完成這項工作時,看起來很費力。 –

+0

同意,雖然問題是關於如何使用if/else來模擬switch/case語句的邏輯。我猜想,更多的是一個人爲的作業例子,而不是真實的代碼。 – 4bar

1

您的條件不能同時是真實的。他們更改爲OR(||)

if(grade == 'D' && grade == 'd') 

等級不能同時d和d

+0

這正確地指出了一個問題,但它並沒有回答整個問題。它沒有解決「防止其他if語句在執行正確的語句後執行」。 –

+0

條件需要適當組織。 if(){} elseif(){} elseif(){} else(){}'。它們在邏輯上執行,所以「如果」第一個表達式是真實的執行它「否則如果」下一個是真實的執行,等等,「其他」沒有是真實的,所以執行它。 – JBES

2

,則應該更換AND(& &)條件是OR(||)條件,使無論是 'A' OR'a'遞增aCount變量。使用大的if - else if - else鏈可防止重複的錯誤檢查。錯誤打印語句可以通過僅使用字符串文字來簡化。

if (grade == 'A' || grade == 'a') { 
    ++aCount; 
} else if (grade == 'B' || grade == 'b') { 
    ++bCount; 
} else if (grade == 'C' || grade == 'c') { 
    ++cCount; 
} else if (grade == 'D' || grade == 'd') { 
    ++dCount; 
} else if (grade == 'F' || grade == 'f') { 
    ++fCount; 
} else { 
    printf("That's not a valid grade, please enter again"); 
} 
1

爲什麼不把數據存儲在數組中?

int grades[] = { 0, 0, 0, 0, 0 }; 
while((grade = getchar()) != EOF) 
    grade = toupper(grade); 
    if (grade >= 'A' && grade <= 'E') { 
     ++grades[grade - 'A']; 
    } else { 
     printf("That's not a valid grade, please enter again\n"); 
    } 
}