Другие языки программирования и технологии

С/С++ Неправильно работает программа

Только начинаю учить С. Написал прогу для сложения, вычитания, умножения и деления в консоли. Подскажите что не так, а то выдает вообще не то что должна.

#include <iostream>

#include <stdlib.h>

using namespace std;

main(){

int a,b,res,operation;

system("chcp1251");

system("cls");

cout << "Program for addition, subtraction, division and multiplication of two numbers" << endl;

cout << "Select operation: 1 - addition, 2 - subtraction, 3 - division, 4 - multiplication";

cin >> operation;

if (1>operation>4){

cout << "You have chosen an invalid operation";

system("pause");

}

cout << "Enter 2 numbers";

cin >> a >> b;

if (operation=1){

res = a+b;

cout <<a<<'+'<<b<<'='<<res;

}

if (operation=2){

res = a-b;

cout <<a<<'-'<<b<<'='<<res;

}

if (operation=3){

res = a*b;

cout <<a<<'*'<<b<<'='<<res;

}

if (operation=4){

res = a/b;

cout <<a<<'/'<<b<<'='<<res;

}

system ("pause");

}

if (1>operation>4) неправильно составлено условие.
И при выполнении условия при не попадании в диапазон от 1 до 4 надо сообщать и прекращать дальнейшую обработку. У Вас после нажатия клавиши программа продолжит работу. Ничего страшного в данном случае не произойдет - просто будут лишние проверки и вторая пауза. Тут Вам решать чем выходить return или if - else. Я бы сделал return.

operation=2 - сравнение в C/C++ происходит через == (двойное равно) . а так Вы присваеваете.

куча if дальше и предыдущая проверка заменяется на switch/case

Вывод результата делать после всех вычислений, а не на каждом. Подумайте над выводом операции в этом случае (заведите char с операцией) .

Дерзайте =)

В идеале лучше вообще делать иначе, но для начала сойдет. Сразу всё не охватите.
KS
Kazybek Sagidanov
84 764
Лучший ответ
Александр Чиркин Спасибо, запомню)
if (1>operation>4)

В вашем случает сравнит 1>operation, получится булево (true либо false), после чего это булево будет сравниваться с 4, но поскольку 4 - число, то булево будет преобразовано в число: true -> 1, false -> 0, и это число будет сравниваться с 4.
Компилятор ошибку может и не выдать, это семантическая ошибка.
Следует написать так: if (1 > operation && operation > 4)

operation=1
Также компилятор ошибку может не выдать (но большинство выдают предупреждение) . Одиночный знак = означает присваивание. В итоге у вас переменной operation будет присвоено значение 1, а затем (поскольку все это находится в if-е) эта единица преобразуется в булево: 1 превратится в true. Т. е. данный оператор всегда будет выдавать истину.
Следует написать так: if (operation == 1)
А вообще, я бы рекомендовал воспользоваться switch, и тут же проверить на правильность выбора операции:
switch (operation)
{
case 1:
// Выполняем сложение
break;
case 2:
// Выполняем вычитание
break;
// аналогично 3, 4
default:
// Пишем, что операция выбрана неверно
};
Руслан Хасанов
Руслан Хасанов
54 366
Александр Чиркин Спасибо)
Переписал вот так:
Кроме того, что одинарное "равно" - это не сравнения, а присваивание, переменные, наверное, нужно сделать не int, а float, или double, иначе 6 / 12 так и будет равно 0 (результат - целая часть от деления) . Разделитель - например, \n (перенос строки).
Александр Окс
Александр Окс
47 413
Все отлично.
Только после res в каждом месте неплохо бы пробел вывести, или строку перенести, или хотя бы запятую вывести в консоль.