У меня есть довольно сложный калькулятор, который печатает вывод, когда пользователь вводит ";" (и нажимает клавишу ввода.) Теперь я пытаюсь разрешить пользователю печатать вывод при нажатии клавиши ввода (без использования точки с запятой.) Мне нужно знать, как я могу это реализовать.
Примечание: калькулятор использует токенизацию для чтения ввода пользователя
Это часть источника калькулятора, и единственная часть, которую необходимо изменить. Это функция-член Token_stream, которая вызывается, когда различные другие функции калькулятора вызывают для получения следующего токена.
const char let = '#';
const char quit = 'Q';
const char print = ';';
const char number = '8';
const char name = 'a';
const char sq_rt = '@';
const char power = '^';
const char constant = '~';
Token Token_stream::get()
{
if (full) { full=false; return buffer; }
char ch;
cin >> ch;
switch (ch) {
case '(':
case ')':
case '+':
case '-':
case '*':
case '/':
case '%':
case ';':
case '=':
case ',':
case constant:
case power:
case sq_rt:
case let:
case quit:
case name:
return Token(ch); // let each character represent itself
case '.':
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
{ cin.unget(); // equivalent of putback
double val;
cin >> val;
return Token(number,val);
}
default:
if (isalpha(ch)) { // in order to create variable names
string s;
s += ch;
while(cin.get(ch) && (isalpha(ch) || isdigit(ch) || ch == '_')) s += ch;
cin.unget();
if (s == "const") return Token(constant);
if (s == "quit") return Token(quit);
if (s == "pow") return Token(power);
if (s == "sqrt") return Token(sq_rt);
if (s == "let") return Token(let);
if (s == "name") return Token(name);
return Token(name,s);
}
else if (isspace(ch)) { // my attempt at allowing enter to produce output
string s;
cin.get(ch);
s += ch;
if(s == "\n") return Token(print);
}
}
error("Bad token");
}
Пока пользователь вводит 5 * 5 и нажимает пробел, то ввод ... ничего не происходит. Однако, если они нажимают пробел, затем вводят случайный символ (любой символ, не только;), затем нажимают ввод, он выводит ответ. После этого пользователь может использовать ввод для создания выходных данных, но он сохраняет дополнительный токен, который вводит пользователь после попадания в пробел, поэтому порядок операций становится совершенно неясным.
Короче говоря, мне нужно знать, как разрешить пользователю сначала нажимать пробел, а затем вводить (или даже просто вводить, но пока работать с пробелом и вводить) для вывода - без каких-либо дополнительных символов.
Если вы хотите увидеть больше источников или у вас есть вопросы относительно самого калькулятора, чтобы решить проблему, я с удовольствием выложу больше.
P.S. Оригинальная программа из книги, из которой я изучаю C ++. Я только что делал упражнения, которые меняют его и добавляют к нему новые функции.