#c
Вопрос:
Я новичок в C , и английский не мой родной язык, так что извините за любую путаницу с моей стороны. В калькуляторе, который я пытаюсь создать, я сделал так, чтобы он мог обрабатывать «недопустимый» ввод и возвращаться в мое меню, однако теперь «правильный» ввод в моем случае переключателя больше не работает. Может кто-нибудь сказать мне, почему это так?
Код ниже
#include <iostream.h>
#include <conio.h>
#include <cmath>
#include <limits>
int main ()
{
cout << "Calculator [v.1.0]" << endl;
cout << "(c) 2021 <Chayenne van der Erf>" << endl << endl;
Menu:
cout << "Kies een bewerking en druk op Enter:" << endl;
cout << "1. Optellen 2. Aftrekken" << endl;
cout << "3. Vermenigvuldigen 4. Delen" <<endl;
cout << "5. Kwadraat 6. Worteltrekken" <<endl;
cout << "7. Reciproke 8. Logarithme" <<endl;
cout << "0. Exit" << endl << endl;
int Bewerking;
cout << "Bewerking: ";
cin >> Bewerking;
while (!(cin >> Bewerking)) {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), 'n');
cout << endl << "Ongeldige input. Alleen getallen toegestaan." << endl << endl;
cout << "___" << endl; goto Menu;}
cout << endl;
switch (Bewerking) {
case 1:
cout << "Optellen";
break;
case 2:
cout << "Aftrekken";
break;
case 3:
cout << "Vermenigvuldigen";
break;
case 4:
cout << "Delen";
break;
case 5:
cout << "Kwadraat";
break;
case 6:
cout << "Worteltrekken";
break;
case 7:
cout << "Reciproke";
break;
case 8:
cout<< "Logarithme";
break;
case 0:
exit (0);
default: cout << "Invalid Input" << endl;}
cout << endl;
if (Bewerking == 1) {
double A, B;
double antwoord;
cout << "Enter een waarde: ";
cin >> A;
if (!cin.fail()) {
cout << "Enter een waarde: ";
cin >> B;
if (!cin.fail()) {
antwoord = A B;
cout << endl;
cout << "= " << antwoord << endl << endl; } } }
else if (Bewerking == 2) {
double A, B;
double antwoord;
cout << "Enter een waarde: ";
cin >> A;
if (!cin.fail()) {
cout << "Enter een waarde: ";
cin >> B;
if (!cin.fail()) {
antwoord = A - B;
cout << endl;
cout << "= " << antwoord << endl << endl;
cout << "___" << endl; goto Menu; } } }
else if (Bewerking == 3) {
double A, B;
double antwoord;
cout << "Enter een waarde: ";
cin >> A;
if (!cin.fail()) {
cout << "Enter een waarde: ";
cin >> B;
if (!cin.fail()) {
antwoord = A * B;
cout << endl;
cout << "= " << antwoord << endl << endl;
cout << "___" << endl; goto Menu; } } }
else if (Bewerking == 4) {
double A, B;
double antwoord;
cout << "Enter een waarde: ";
cin >> A;
if (!cin.fail()) {
cout << "Enter een waarde: ";
cin >> B;
if (!cin.fail()) { cout << endl;
while (B == 0)
{cout << "Delen door 0 is niet mogelijk." << endl;
cout << endl;
cout << "Enter een andere waarde: ";
cin >> B; }
{antwoord = A / B;}
cout << endl;
cout << "= " << antwoord << endl << endl;
cout << "___" << endl; goto Menu; } } }
else if (Bewerking == 5) {
double X;
double antwoord;
cout << "Enter waarde: ";
cin >> X;
if (!cin.fail()) {
antwoord = X * X;
cout << endl;
cout << "= " << antwoord << endl << endl;
cout << "___" << endl; goto Menu; } }
else if (Bewerking == 6) {
double X;
double antwoord;
cout << "Enter waarde: ";
cin >> X;
if (!cin.fail()) {
antwoord = pow (X,0.5);
cout << endl;
cout << "= " << antwoord << endl << endl;
cout << "___" << endl; goto Menu; } }
else if (Bewerking == 7) {
double X;
double antwoord;
cout << "Enter waarde: ";
cin >> X;
if (!cin.fail()) {
antwoord = 1 / X;
cout << endl;
cout << "= " << antwoord << endl << endl;
cout << "___" << endl; goto Menu; } }
else if (Bewerking == 8) {
double X;
double antwoord;
cout << "Enter waarde: ";
cin >> X;
if (!cin.fail()) {
antwoord = log (X);
cout << endl;
cout << "= " << antwoord << endl << endl;
cout << "___" << endl; goto Menu; } }
getch();
return 0;
}
Комментарии:
1. Плохой отступ 🙁
2. Зачем использовать
goto
? может быть, вы стали жертвой кода спагетти.3. Ваш код менее читаем и имеет плохие отступы.
4.
cin >> Bewerking; while (!(cin >> Bewerking))
Так почему же вы читаете одно и то же два раза подряд? Вы ожидаете, что ваш пользователь введет его дважды подряд?5. @MikeCAT Я абсолютный любитель, я узнал все это неделю назад :/
Ответ №1:
Делая while (!(cin >> Bewerking)) {
это, вы продолжаете присваивать значения до Bewerking
тех пор, пока оно не станет пустым — но вы все равно присваиваете это значение Bewerking
— эффективно переопределяя «хорошее» значение.
Хотя с кодом есть много других проблем — для решения конкретной проблемы в вопросе — вам нужно сохранить последнее значение Bewerking
— и использовать его вместо переопределенной переменной.