оператор switch c ++ help - PullRequest
       3

оператор switch c ++ help

4 голосов
/ 28 сентября 2011
#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, когда я должен получить регистр a

Ответы [ 9 ]

7 голосов
/ 28 сентября 2011

Вам не хватает группы else с или вы выполняете сравнения в неправильном порядке.

95 больше 90, но также больше 80, 70 и 60. Таким образом, вы 'я получу 'd'.

(И вы не работаете с 'd' в вашем коммутаторе.)

6 голосов
/ 28 сентября 2011

Я полагаю, что вы хотите

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 голосов
/ 28 сентября 2011

Вы указали его таким образом, чтобы ваш 95 удовлетворял всем случаям: 95 больше 90, но также больше 80 и 70 и т. Д. ...

В этом случае выигрывает последний.

Вы можете решить ее, используя else s, или обернув ее в функцию и возвращая, как только вы узнаете, какая оценка вам нужна:

char grade( int score ){
   if( score >= 90 ) return 'a';
   if( score >= 80 ) return 'b';
   ...
}
2 голосов
/ 28 сентября 2011

Я думаю, что вы хотите использовать 'else if', оно падает до последнего, если "score> = 60", что верно, и тогда оценка равна "d", что приводит к регистру по умолчанию в вашем выражении switch.

2 голосов
/ 28 сентября 2011

Если ветки упорядочены неправильно (или вам нужно предоставить другие ветки, например, так:)

Смотрите в прямом эфире здесь: 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;
}
1 голос
/ 28 сентября 2011

Поскольку все score сравнения не объединяются с if/else if условиями. Это независимые if заявления. Таким образом, grade перезаписывается на 95.

1 голос
/ 28 сентября 2011

Это из-за ваших операторов if наверху.Вы должны использовать другие ifs вместо отдельных ifs.То, что происходит, это ваше, если за 90 следует, а затем все остальные.Ваше письмо a по существу перезаписывается, потому что 95>> = для всех других условий.Использование 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';
0 голосов
/ 29 сентября 2011

Вы уже получили некоторые ответы, но я думаю, что я предложу немного другую возможность - избавиться от большей части потока управления и заменить немного математики:

char grades[] = "00000012344";

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. Мы используем это, чтобы выбрать и распечатать соответствующее сообщение. Я добавил сообщения (которые могут быть или не совсем то, что вы хотите) для писем, которые вы пропустили.

0 голосов
/ 28 сентября 2011

вам нужно улучшить условия if, вы проверяете score >= no., что на входе 95 выполняются все операторы if, и последний выполненный оператор был d, теперь в вашем операторе switch case d нет, поэтому онвыполняет default один.

...