2013-04-24 3 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 для А, 3 для B и так далее. Но, однако, вопрос потребовал от нас сделать расчет для + и - также. Должен ли я использовать if else после переключения?

Любая помощь будет оценена по достоинству. Заранее спасибо.

+1

Во-первых, ваш знак переменной char не может принимать строки, которые состоят из более чем одного символа, то есть A +, A-. Поэтому вместо этого используйте char. Во-вторых, то использование сравнения if on string будет проще. Пожалуйста, измените дизайн. –

+1

Вопрос также, по-видимому, предполагает, что «B» должен стоить 3, а затем он приводится в качестве примера стоимостью 2,7 ... – Chowlett

+0

Вот почему тип значения не должен быть «int» –

ответ

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' –

+1

Где хранится символ окончания для отказа? –

+0

, если второй символ равен null, это будет '\ 0', а m будет присвоено значение' 0'. Так в чем проблема? –

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

Хорошо, я тоже об этом подумал, но это слишком долго. Спасибо tho – Rauryn

+0

Заявление, содержащее случай «F», должно быть в двойных кавычках. Пожалуйста исправьте. –

+0

Он отлично работает, но он неуклюж и вовсе не доступен. И, я подозреваю, вы получаете больше меток для написания чего-то, что выражает в коде идею + и - модификаторов, а не «B +», имеющих абсолютное значение в таблице поиска. –

0

Я имел дело с каждым персонажем по очереди. Вы знаете, что первым должен быть класс письма, поэтому сначала вы смотрите на него, и вы можете просто использовать оператор switch, как вы уже это сделали.

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

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

Затем, если второй символ существует, проверьте, если это + или а - и изменить значение, которое вы получили от заявления переключателя соответственно.

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

Прежде всего это, конечно, вы хотите, чтобы проверить на частный случай A + и пропустить все остальное.

Альтернативный подход заключается в замене операторов switch поисковыми запросами в ранее подготовленной структуре данных, что-то вроде std::map<char, int>, которое, даже если код инициализации подготовил его из жестко запрограммированных данных, откроет способ загрузки оценки информацию из файла конфигурации или базы данных в какой-то момент в будущем. В этом случае специальный корпус A + становится немного сложнее.

+0

Как упоминалось в OP, другие символы, кроме F, могут также сопровождаться + или -. Поэтому особый случай - это не A, а F? –

+0

Но есть ошибка на char grade_letter = grade [0]; эта строка – Rauryn

+0

Объявите оценку как строку до этого. –

Смежные вопросы