2011-09-28 412 views
3
#include <iostream> 

using namespace std; 

int main() 
{ 
    int score; 
char grade; 
cout << "Enter your score:" << endl; 
cin >> score; 
if (score >= 90) 
    grade = 'a'; 
if (score >= 80) 
    grade = 'b'; 
if (score >= 70) 
    grade = 'c'; 
if (score >= 60) 
    grade = 'd'; 
else 
    grade = 'f'; 
cout << grade << endl; 
switch (grade) { 
    case 'a': 
     cout << "Good job" << endl; 
     break; 
    case 'c': 
     cout << "Fair job" << endl; 
     break; 
    case 'f': 
     cout << "Failure" << endl; 
     break; 
    default: 
     cout << "invalid" << endl; 
} 
cin.get(); 
return 0; 
    } 

爲什麼它給了我默認開關的情況下,當我進入95時,我應該得到情況下switch語句C++幫助

+1

你爲什麼要把數字轉換成一個字母,然後把這個字母轉換成更長的措辭描述?跳過'switch'並在你的第一個'if'中打印(當然你修好之後)。過度併發症是我們最糟糕的詛咒,反對它! – Blindy

+0

因爲'case'd':'缺少你注意到正在輸出哪個等級? – AJG85

+1

您是否在開關啓動之前檢查了等級的輸出是否返回** a ** – punit

回答

1

的,如果分支是有序的錯誤(或者你需要提供像這樣else分支:)

看到它住在這裏:http://ideone.com/2uSZT

#include <iostream> 

using namespace std; 

int main() 
{ 
    int score; 
    char grade; 
    cout << "Enter your score:" << endl; 
    cin >> score; 
    if (score >= 90) 
     grade = 'a'; 
    else if (score >= 80) 
     grade = 'b'; 
    else if (score >= 70) 
     grade = 'c'; 
    else if (score >= 60) 
     grade = 'd'; 
    else 
     grade = 'f'; 

    cout << grade << endl; 
    switch (grade) 
    { 
    case 'a': 
     cout << "Good job" << endl; 
     break; 
    case 'c': 
     cout << "Fair job" << endl; 
     break; 
    case 'f': 
     cout << "Failure" << endl; 
     break; 
    default: 
     cout << "invalid" << endl; 
    } 
    cin.get(); 
    return 0; 
} 
+0

@mat:你一定是在我最初的太快反應時閃過的?我以爲我忍不住快速:) – sehe

+0

是的,當我寫我的時候,看到你的答案彈出。被它弄糊塗了一點:) – Mat

+0

@Mat:看,我知道這對我忽視這些彈出窗口的事情有好處。當我終於準備好按「提交」,結果證明這個問題被刪除了的時候,它唯一一次咬我 – sehe

7

你錯過了一堆else S,或以錯誤的順序做了比較。

95大於90,但它也大於80,70和60.所以你會得到'd'。

(而你不處理你的開關「d」。)

2

我想你想使用「否則,如果」,它是下降到最後,如果「得分> = 60」,這是true,然後等級爲「d」,這會在switch語句中產生默認情況。

6

我相信你想

if (score >= 90) 
    grade = 'a'; 
else if (score >= 80) 
    grade = 'b'; 
else if (score >= 70) 
    grade = 'c'; 
else if (score >= 60) 
    grade = 'd'; 
else 
    grade = 'f'; 

你有什麼不互相排斥任何但近兩年的情況下,60歲及以上低。您的代碼不短路,它會檢查所有的1至5

if (score >= 90) // 1. 
    grade = 'a'; 

if (score >= 80) // 2. 
    grade = 'b'; 

if (score >= 70) // 4. 
    grade = 'c'; 

if (score >= 60) // 5. 
    grade = 'd'; 
else 
    grade = 'f'; 
2

您指定它使得你的95個滿足所有的情況:95比90大,但也比80大和比70等...

在這種情況下,最後一個勝利。

您可以通過使用else小號解決它,或者在一個函數進行包裝,並儘快你知道你需要的等級返回:

char grade(int score){ 
    if(score >= 90) return 'a'; 
    if(score >= 80) return 'b'; 
    ... 
} 
1

這是因爲你的if語句往上頂的。你應該使用其他ifs而不是個別ifs。最新發生的事情是,如果90歲正在追隨,那麼所有其他人都是如此。你的信件a基本上被覆蓋,因爲95是> =所有其他coniditons。使用else if會在發現真正的檢查時破壞其餘的檢查。

if (score >= 90) 
    grade = 'a'; 
else if (score >= 80) 
    grade = 'b'; 
else if (score >= 70) 
    grade = 'c'; 
else if (score >= 60) 
    grade = 'd'; 
else 
    grade = 'f'; 
1

因爲所有score比較不與if/else if條件組合。他們是獨立的if陳述。因此grade被覆蓋95

0

你需要提高你的,如果條件下,你正在檢查score >= no.輸入95執行所有的if語句和最後執行的語句現在在你的switch語句case dd不存在所以它的執行default之一。

0

你已經得到了一些答案了,但我想我會建議一個稍微不同的可能性,擺脫了大部分控制流和替代位數學:

char grades[] = "00000"; 

char *messages[] = { 
    "Excellent Job", 
    "Good job", 
    "Average job", 
    "Mediocre Job", 
    "Failure" 
}; 

if (score < 0 || score > 100) 
    std::cout << "Invalid score"; 
else { 
    int grade = grades[score/10]; 
    std::cout << messages[grade]; 
} 

所以,我們使用score/10將0-100的分數變爲0-10。然後,我們查找適當的評分等級,其中f = 0,d = 1,c = 2,b = 3和a = 4。我們用它來選擇並打印出適當的信息。我爲你跳過的字母添加了消息(可能是或可能不是你想要的)。