Я изучал C ++ и пытался создать базовое приложение для калькулятора. Цель состоит в том, чтобы получить два числа от 0 до 9 от пользователя и математическую операцию (+, -, *, /); если набирается какой-то другой символ, я хочу зациклить программу, чтобы запросить правильный ввод.
Но всякий раз, когда я запускаю программу, она не распознает цифры 0-9 и продолжает повторять цикл. Это основные 3 функции, которые я использую. Из основного я просто звоню им, поэтому сомневаюсь, что проблема есть. Помогите, пожалуйста?
О, и я знаю, что я никогда не должен использовать переход, но я хотел практиковать.
И если бы вы могли указать более эффективные способы написания этого кода, это здорово.
Бесконечно благодарен.
int GetUserInput(){
using namespace std;
cout << "Please enter a number between 0-9." << endl;
char inputChar;
cin >> inputChar;
while (inputChar != ('1' || '2' || '3' || '4' || '5' || '6' || '7' || '8' || '9' || '0')) {
cout << "Please enter a number between 0-9." << endl;
cin >> inputChar;
}
return static_cast <int> (inputChar);
}
char GetMathematicalOperation(){
using namespace std;
cout << "Please enter a mathematical operator (+, -, *, /)" << endl;
// Storing user input character into char inputChar
char inputChar;
inputloop:
cin >> inputChar;
switch(inputChar) {
case('+'):
case('-'):
case('*'):
case('/'):
break;
default:
cout << "Please enter a mathematical operator (+, -, *, /)" << endl;
goto inputloop;
}
return inputChar;
}
int CalculateResult(int x, char Operator, int y){
if (Operator = '+')
return x+y;
if (Operator = '-')
return x-y;
if (Operator = '*')
return x*y;
if (Operator = '/')
return x/y;
return 0;
}
||
Оператор должен работать с логическими выражениями, а не с символами. Вам нужно будет расширить его до while (inputChar != '1' && inputChar != '2' && ...
,
В качестве альтернативы вы можете использовать тот факт, что коды символов цифр являются последовательными. Другими словами, вы могли бы сделать while (inputChar < '0' || inputChar > '9')
,
Кроме того, в вашем CalculateResult
функция, вам нужно изменить эти =
в ==
— иначе вы перезаписываете Operator
переменная, а не по сравнению с ней.
В C ++
('1' || '2' || '3' || '4' || '5' || '6' || '7' || '8' || '9' || '0') == true
Более конкретно, char
что имеет значение, которое не является конкретно 0
(значение, а не символ) оценивается как true
по сравнению с ==
или же !=
оператор.
Итак, ваше выражение
inputChar != ('1' || '2' || '3' || '4' || '5' || '6' || '7' || '8' || '9' || '0')
Эквивалентно
inputChar != true
Вы бы лучше поставить все эти chars
в контейнер и проверьте, существует ли пользовательский ввод в контейнере.
Непроверенный код
char mychars[] = {'1','2','3','4','5','6','7','8','9','0'};
std::set<char> inputChars;
inputChars.insert(mychars, mychars+10);
if(inputChars.find(inputChar) != inputChars.end())
{
...
}
Вы также можете использовать isdigit сделать что-то вроде:
while(!isdigit(inputChar)) {
// code here
}
Вы хотите проверить, является ли inputChar находится вне диапазона от 0 до 9, поэтому вам нужно что-то вроде этого:
while (inputChar < '0' || inputChar > '9')
Ваше состояние неверно … вам нужно проверить (inputchar! = ‘0’) && (inputchar! = ‘1’) && … && (inputchar! = ‘9’)
while (inputChar != ('1' || '2' || '3' || '4' || '5' || '6' || '7' || '8' || '9' || '0'))
Вы должны сравнить с каждым персонажем.
while ((inputChar != '1') || (inputChar != '2') ....
Или просто —
while ((inputChar < 47) || (inputChar > 57))
Следующий,
if (Operator = '+')
Компилятор должен был дать вам предупреждение. Его назначение. Вам на самом деле нужно ==
вместо оператора, если вы собираетесь сделать сравнение.
Другое решение: if (std::string("0123456789").find(inputChar) != std::string::npos)
, Переменная npos
— нет позиции — значит не найдено.