2013-04-24 51 views
3

所以這是我的C++的問題:等級系統中C++

Write a program that translates a letter grade into a number grade. Letter grades are 
A, B, C, D and F, possibly followed by + or -. Their numeric values are 4, 3, 2, 1 and 
0. There is no F+ or F-. A + increases the numeric value by 0.3, a – decreases it by 
0.3. However, an A+ has value 4.0. 
     Enter a letter grade: B 
     The numeric value is 2.7 

這裏是我的代碼:

int main() 
    { 
char grade; 
int value; 
cout << "Enter letter grade : " ; 
cin >> grade; 

switch(grade) 
{ 
case 'A' : value = 4; 
    break; 
case 'B' : value = 3; 
    break; 
case 'C' : value = 2; 
    break; 
case 'D' : value = 1; 
    break; 
case 'E' : value = 0; 
    break; 
default : cout << "Wrong input " << endl; 
    break; 
} 

cout << value; 
system("PAUSE"); 
return 0; 

    } 

它能夠打印出4 A,3 B等。但是,這個問題要求我們對+和 - 進行計算。我應該在開關後使用if else語句嗎?

任何幫助,將不勝感激。提前致謝。

+1

首先,你的char變量等級不能包含多個單個字符組成的字符串,即A +,A-。所以使用char數組來代替。 其次,然後使用如果在字符串比較會更容易。 請重新設計。 – 2013-04-24 09:19:33

+1

這個問題也似乎表明,'B'應該值3,然後它作爲一個例子值得2.7 ... – Chowlett 2013-04-24 09:23:10

+0

這就是爲什麼類型的價值不應該是'int' – 2013-04-24 09:24:36

回答

1

如果輸入是A+B-,那麼它不再是一個字符。所以,使用一串字符得到它,並檢查值。

char a[3]; 
float m,n; 
cin>>a; 
if(a[1]=='+') 
    m=0.3; 
else if (a[1]=='-') 
    m=-0.3; 
else 
    m=0; 
switch(a[0]) 
{ 
    //Assign the value of n as 4,3,2,1 depending upon the grade. 
} 
cout<<n+m; 

將打印品位

+0

這個怎麼樣?如果沒有'+'或'-',等級不會改變。如果沒有,那麼[1]將是'\ 0' – 2013-04-24 09:23:33

+1

終止符號的存儲位置在哪裏? – 2013-04-24 09:23:36

+0

如果第二個字符爲空,它將是'\ 0',m將被分配爲'0'。那麼這裏有什麼問題? – 2013-04-24 09:27:03

0

簡單地添加更多的情況下會有所幫助。修改您的代碼如下:

int main() 
    { 
    String grade; 
    float value; 
    cout << "Enter letter grade : " ; 
    cin >> grade; 

    switch(grade) 
    { 
    case "A" : value = 4; 
     break; 
    case "A+" : value = 4.3; 
     break; 
    case "A-" : value = 3.7; 
     break; 
    case "B" : value = 3; 
     break; 
    case "B+" : value = 3.3; 
     break; 
    case "B-" : value = 2.7; 
     break;   
    case "C" : value = 2; 
     break; 
    case "C+" : value = 2.3; 
     break; 
    case "C-" : value = 1.7; 
     break;   
    case "D" : value = 1; 
     break; 
    case "D+" : value = 1.3; 
     break; 
    case "D-" : value = 0.7; 
     break;   
    case "F" : value = 0; 
     break; 
    default : cout << "Wrong input " << endl; 
     break; 
    } 

    cout << value; 
    system("PAUSE"); 
    return 0; 

    } 

這是您所做的直接擴展,可以有其他萬種方法。

+0

好吧好吧我也想過這個,但它太長了。 Thanks tho – Rauryn 2013-04-24 09:34:00

+0

包含案例'F'的語句應該用雙引號。請改正。 – 2013-04-24 09:34:14

+0

它工作正常,但它笨重,並沒有任何可擴展性。而且,我懷疑,爲了編寫代碼中表達+和 - 是修飾符的想法,而不是在查找表中具有絕對值的「B +」,您會獲得更多的分數。 – 2013-04-24 09:36:15

0

我會依次處理每個字符。你知道第一個應該是一個字母等級,所以你先看看那個,然後你可以像使用switch語句那樣使用switch語句。

uint value = 0; 
char grade_letter = grade[0]; 

switch (grade_letter) { 
    // assign value as appropriate 
} 

然後,如果第二個字符存在,請檢查它是否爲+或 - 並相應地修改您從switch語句獲得的值。

if (grade.length() > 1) { 
    char modifier = grade[1]; 
    switch (modifier) { 
     case '+': value += 0.3; 
     // etc. 
    } 
} 

在這之前,您需要檢查A +的特殊情況並跳過其他所有內容。

另一種方法是用先前準備好的數據結構中的查找替換開關語句,例如std::map<char, int>,即使初始化代碼從硬編碼數據準備它,也會打開加載等級的方式來自配置文件或數據庫的信息。特殊外殼A +在這種情況下變得稍微棘手。

+0

由於OP提到除F以外的其他字符也可以跟+或 - 。所以特例不是A而是F? – 2013-04-24 09:38:16

+0

但是在char grade_letter = grade [0];這條線 – Rauryn 2013-04-24 09:42:53

+0

在此之前聲明爲字符串的等級.. – 2013-04-24 11:59:14