Проверка, нажата ли буква

Программа должна прочитать 2 дюйма и рассчитать сумму или произведение в зависимости от символа, введенного с клавиатуры. Если вы нажмете q в любой момент, он должен выйти.

#include "stdafx.h"#include <iostream>
#include<conio.h>

using namespace std;

int main()
{

char k, l ='h',c;
int a,b,s, p;

aici: while (l != 'q')
{

cin >> a;if (_kbhit() == 0) //getting out of the loop
{
c = a;
if (c == 'q')
{
l = 'q';
goto aici;
}
}cin >> b;

if (_kbhit() == 0)
{
c = b;
if (c == 'q')
{
l = 'q';
goto aici;
}
}k = _getch();

if (_kbhit() == 0)
{
c = k;
if (c == 'q')
{
l = 'q';
goto aici;
}
}if (k == '+')
{

s =(int)(a + b);
cout << s;
}
if (k == '*')
{
p = (int)(a*b);
cout << p;
}
}
return 0;
}

Он ожидает, что и a, и b будут целочисленными значениями, поэтому при вводе ‘q’ вы получите беспорядок.
Можно ли заставить программу работать без объявления символов a и b?

0

Решение

Вам не нужно использовать goto и kbhit () внутри cin.
простой способ это:

#include <iostream>
#include <string>

using namespace std;

int main()
{
int a,b;
string A, B
char k;

while(1)
{
cin >> A;
if(A == "q") break;
cin >> B;
if(B == "q") break;

a = atoi(A.c_str());
b = atoi(B.c_str());

cin >> k;
if(k == 'q') break;

if (k == '+')
cout << (a + b);
if (k == '*')
cout << (a*b);

}
}
0

Другие решения

Вы не можете получить, где вы хотите быть на этом пути. Стандартные входные потоки чтения будут блокировать, не давая вам искать «q» и выходить.

Вместо этого посмотрите на все входные данные для «q», как они поступают, и преобразуйте их в значения, которые вам потребуются позже, после того как вы получите полное сообщение. Что-то вроде:

while (int input = _getch()) != 'q') // if read character not q
{
accumulate input into tokens
if enough complete tokens
convert numeric tokens into number with std::stoi or similar
perform operation
print output
}

Вполне возможно, что вы можете сделать что-то вроде

std::stringstream accumulator;
while (int input = _getch()) != 'q') // if read character not q
{
accumulator << std::static_cast<char>(input);
if (got enough complete tokens)// this be the hard part
{
int a;
int b;
char op;
if (accumulator >> a >> b >> op)
{ // read correct data
perform operation op on a and b
print output
}
accumulator.clear(); // clear any error conditions
accumulator.str(std::string()); // empty the accumulator
}
}

std :: stringstream документация.

0

По вопросам рекламы [email protected]