2014-09-12 12 views
1

Привет Я изучаю базовый язык C++, и я выполняю задание. Я спрашиваю, есть ли более простой способ написать эту часть.Есть ли более простой способ написать это?

if (100 >= projectgrade && 0<= projectgrade) {} 
else 
{ 
    cout<<endl<<"invalid data, please retry again."; 
    cin.ignore(); 
    cin.get(); 
    return EXIT_SUCCESS; 
} 
if (100 >= midtermgrade && 0<= midtermgrade) {} 
else 
{ 
    cout<<endl<<"invalid data, please retry again."; 
    cin.ignore(); 
    cin.get(); 
    return EXIT_SUCCESS; 
} 
if (100 >= finalexamgrade && 0<= finalexamgrade) {} 
else 
{ 
    cout<<endl<<"invalid data, please retry again."; 
    cin.ignore(); 
    cin.get(); 
    return EXIT_SUCCESS; 
} 

Можно ли написать все эти ограничения в одной скобке, если? Я пробую много времени, но не могу понять. Ты помогаешь!

+4

Используйте '' || и круглые скобки. – SLaks

+2

Я не уверен насчет мудрости возврата 'EXIT_SUCCESS' при сбое ... –

+0

if (100 projectgrade) – michaeltang

ответ

2
if ((projectgrade <0) || (projectgrade > 100) || (midtermgrade <0) || (midtermgrade > 100) || (finalexamgrade < 0) || (finalexamgrade > 100)) 
{ 
    cout<<endl<<"invalid data, please retry again."; 
    cin.ignore(); 
    cin.get(); 
    return EXIT_SUCCESS; 
} 
+0

компилятор показывает такую ​​же сборку для версии ShotYe и вашего кода XD.но этот раз гораздо легче читать XD – GameDeveloper

4

Ну, если вы исследуете вашу логику это, если какой-либо из классов составляет менее 0 или больше чем 100, так что-то вроде этого -

if (projectgrade < 0 || projectgrade > 100 || 
    midtermgrade < 0 || midtermgrade > 100 || 
    finalexamgrade < 0 || finalexamgrade > 100 
    ) { 
    cout<<endl<<"invalid data, please retry again."; 
    cin.ignore(); 
    cin.get(); 
    return EXIT_SUCCESS; 
} 

Редактировать , и мы всегда могли добавить #define как

#define range(x) x < 0 || x > 100 

то, что если можно было бы сократить до

if (range(projectgrade) || range(midtermgrade) || range(finalexamgrade)) 
+0

Хорошо, спасибо! – ShotYe

+1

Не используйте этот макрос диапазона. Это небезопасно и может привести к двойной оценке 'x'. Рассмотрим 'range (++ x)', а затем поймем, что вы можете в два раза увеличить показатель! Вместо этого используйте функцию шаблона. – KitsuneYMG

+0

Используйте функцию вместо MACRO. – Jarod42

0

В C++ 11 вы можете написать:

auto failure = [](){ 
    cout << "invalid data, please try again" << endl; 
    cin.ignore(); 
    cin.get(); 
    return 0; 
}; 

, а затем использовать его, когда сбои случаются:

if (!(100 >= projectgrade && 0<= projectgrade)) 
    return failure(); 

// do more stuff 

if (!(100 >= midtermgrade && 0<= midtermgrade)) 
    return failure(); 

Примечание, делая endl после текста, а не до того, предпочтительно ; return 0; всегда указывает на успех, а cin.ignore() просто игнорирует один символ (в общем, вы можете игнорировать остальную часть строки).

0

Во-первых, вы можете добавить функцию для теста

bool is_valid_grade(int grade) 
{ 
    return 0 <= grade && grade <= 100; 
} 

или

bool is_valid_grade(unsigned int grade) 
{ 
    return grade <= 100; // unsigned cannot be negative 
} 

затем использовать его как:

if (is_valid_grade(projectgrade) 
    && is_valid_grade(midtermgrade) 
    && is_valid_grade(finalexamgrade)) 
{ 
    // Valid code 
} 
else 
{ 
    return failure(); // your previous code into a function 
} 
Смежные вопросы