Непонятное поведение программы на C++ [закрыт]

94
09 мая 2021, 08:50
Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском.

Закрыт 1 год назад.

Улучшить вопрос
#include "stdafx.h"
#include <iostream>
#include "typeinfo"
#include <conio.h>
#include <string>
#include <cstdlib>
#include <istream>
#include <cctype>
#include <limits>
using namespace std;

int main()
{
    setlocale(LC_CTYPE, "rus");
    string a, b;
    int A, B;
    int result = NULL;
    int flag_a = 0;
    int flag_b = 0;
    char op;
    do {
        do
        {
            if (result != NULL)
                a = result;
            if (result == NULL)
            {
                cout << "Введите первый операнд: ";
                getline(cin, a);
            }
            for (int i = 0; i < a.length(); i++)
            {
                if (!isdigit(a[i]))
                {
                    flag_a++;
                    break;
                }
            }
            if (flag_a > 0)
            {
                cout << "Вы ввели не число, пожалуйста повторите попытку." << endl;
                cin.ignore(numeric_limits<streamsize>::max(), '\n');
                flag_a = 0;
                continue;
            }
            else
            {
                A = atoi(a.c_str());
                break;
            }
        } while (true);
        do {
            cout << "Введите операцию: ";
            cin >> op;
            if ((op != '+') && (op != '-') && (op != '*') && (op != '/'))
            {
                cout << "Вы ввели некорректную операцию" << endl;
                cout << "Возможные операции: + - * /" << endl;
                cin.clear(); // на случай, если предыдущий ввод завершился с ошибкой
                cin.ignore(numeric_limits<streamsize>::max(), '\n');
                result = NULL;
                continue;
            }
            else break;
        } while (true);
        do {
            cout << "Введите второй операнд: ";
            getline(cin, b);
            for (int i = 0; i < b.length(); i++)
            {
                if (!isdigit(b[i]))
                {
                    flag_b++;
                    break;
                }
            }
            if (flag_b > 0)
            {
                cout << b << endl;
                cout << "Вы ввели не число, пожалуйста повторите попытку." << endl;
                system("pause");
                cin.ignore(numeric_limits<streamsize>::max(), '\n');
                flag_b = 0;
                continue;
            }
            else
            {
                B = atoi(b.c_str());
                break;
            }
        } while (true);
        if (op == '+')
        {
            result = A + B;
            cout << result << endl;
        }
        if (op == '-')
        {
            result = A - B;
            cout << result << endl;
        }
        if (op == '*')
        {
            result = A*B;
            cout << result << endl;
        }
        if (op == '/')
        {
            result = A / B;
            cout << result << endl;
        }
    } while (true);
    system("pause");
    return 0;
}

Добрый день всем! Помогите новичку, пожалуйста. На практике дали задание написать несложный калькулятор с поддержкой базовых математических функций - сложения, умножения, вычитания и деления. Калькулятор должен контролировать корректность введенных пользователем данных, что я и попытался реализовать. Проверка первого операнда на то, является ли он числом проходит успешно, но дальше происходит что-то не совсем мне понятное. Как только мы доходим до присвоения значения второму операнду программа присваивает ему значение первого и говорит, что это не число. В чем может быть проблема?

Answer 1
  1. Команда getline конфликтует с оператором >>. Используйте только cin >> a ; и не будет проблем.
  2. Команда a = result; делает не то, что вы думаете. Вы строке присваиваете один символ с кодом математического результата. Нужно присваивание числа строке делать по-другому. Например a = std::to_string(result);.
  3. Не пользуйтесь NULL. Он имеет тип указателя, а вы присваиваете указатель целому числу. Можно просто написать 0.
READ ALSO
Какая сделать явную специализацию для функции?

Какая сделать явную специализацию для функции?

Какая сделать явную специализацию для функции foo оставив const T* arr??

108
SFML, растягивание спрайтов вместе с окном

SFML, растягивание спрайтов вместе с окном

Что нужно сделать, чтобы спрайт не растягивался в месте с окном?

83
Как тянуть стандартные библиотеки из произвольного места

Как тянуть стандартные библиотеки из произвольного места

Пишу под линукс в Qt5Как сделать так,что бы проект тянул библиотеки стандартные(Qt5Gui,Qt5Core

81
Аномалии в кастомном классе строки

Аномалии в кастомном классе строки

Так вот, я начал писать класс для реализации строки C++, хотя использую я методики из C, впрочем сейчас это неважноКак и обычный класс string из STL основная...

73