Обьясните плиз.

День добрый уважаемые.

Обьясните идиоту, в чем косяки и как их подправить можно?

Проблема 1 : При вводе в консоле значений для num1 кроме числовых, происходит бесконечное зацикливание 20 строки:

cout<<"Вы ввели неправильное действие, введите правильное:"<<endl;

Проблема 2 : Если при объявлении sign ввести в консоле несколько букв, то текст «Вы ввели неправильное действие, введите правильное:», дублируется под каждый знак. Т.е. выглядит все так дубли
как это все можно подправить?

Собственно сам код:

1       #include <iostream>
2        #include <windows.h>
3        using namespace std;
4        
5        
6        //Простой калькулятор
7        int main()
8        {
9            SetConsoleCP(1251);
10            SetConsoleOutputCP(1251);
11            cout << "Перед вами простой калькулятор, который может складывать, вычитать, делить и\n умножать два числа"<<endl;
12        labelstart:    cout << "Введите первое число: "<< endl;
13            float num1,num2,num3;
14            char sign;
15            cin >> num1;
16            cout << "Введите действие: "<<endl;
17            cin>> sign;
18         label1:   if(sign!='+'&& sign!='-'&& sign!= '*'&& sign!= '/' )
19            {
20         cout<<"Вы ввели неправильное действие, введите правильное:"<<endl;
21            cin>>sign;
22            goto label1;
23            }
24            cout << "Введите второе число: "<< endl;
25            cin >> num2;
26             if(sign=='+')
27            {
28                num3=num1+num2;
29            } else if (sign=='-')
30        
31            {
32                num3=num1-num2;
33            }else if (sign=='/')
34            {
35                num3=num1/num2;
36            }else if (sign=='*')
37            {
38                num3=num1*num2;
39            }
40        
41            cout << "Ответ: "<<num3<<endl;
42            goto labelstart;
43            return 0;
44        }

Самое простое — это считывать пользовательский ввод в string через std::getline(). А потом анализировать его в программе.

Можно, конечно, и с istream пободаться. Но это жопа.

Также не стоит использовать goto без острой на то необходимости, так как это сильно усложняет чтение исходников. Особенно это касается больших и/или сложных проектов

Вот так работает. Уже после первого cin.clear() перестало пролистывать.

   #include <iostream>
   #include <string>
 //#include <windows.h>
   using namespace std;


    //Простой калькулятор
    int main()
    {
        //SetConsoleCP(1251);
        //SetConsoleOutputCP(1251);
        cout << "Перед вами простой калькулятор, который может складывать, вычитать, делить и\n умножать два числа"<<endl;
    labelstart: cout << "Введите первое число: "<< endl;
        float num1, num2, num3;
        char sign;
        //string s;


        cin >> num1;

        cout << "Введите действие: "<<endl;
        cin.clear();
        cin >> sign;

     label1:  if(sign!='+'&& sign!='-' && sign!= '*' && sign!= '/' )
        {

     cout<<"Вы ввели неправильное действие, введите правильное:"<<endl;
        cin.clear();
        cin >> sign;
        goto label1;
        }

        cout << "Введите второе число: "<< endl;
        cin >> num2;
         if(sign=='+')
        {
            num3=num1+num2;
        } else if (sign=='-')

        {
            num3=num1-num2;
        }else if (sign=='/')
        {
            num3=num1/num2;
        }else if (sign=='*')
        {
            num3=num1*num2;
        }

        cout << "Ответ: "<<num3<<endl;
        goto labelstart;
        return 0;
    }

Особенно прочти последний комментарий в статье по ссылке сверху.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.