C/C++

Не могу разораться с калькулятором на языке СИ

Не могу разобраться с калькулятором.
При компиляции программы после выполнения операции(например сложение), он выводит 2 раза подряд слово "Знак" Почему так происходит?#include<stdio.h>
int main()
{ float x,y;
char c='1';

while(c!='0')
{ printf("Знак: ");
scanf("%c",&c);
if (c=='0'){break;}
else if(c=='+'||c=='-'||c=='*'||c=='/')
{printf("X: ");
scanf("%f",&x);
printf("Y: ");
scanf("%f",&y);
if (c=='+')
{printf("Ответ: %.2f\n",x+y);}
else if (c=='-')
{printf("Ответ: %.2f\n",x-y);}
else if(c=='*')
{printf("Ответ: %.2f\n",x*y);}
else if (c=='/')
{if(y==0)
{printf("Ошибка!\n");}
else
printf("Ответ: %.2f\n",x/y);}

}else if (c!='+'||c!='-'||c!='*'||c!='/') {printf("Ошибка\n");}
}

return 0;
}
JF
Just Friends
510
После while..{ в начале цикла добавь строчку, чтоб было так:
while(c!='0')
{
if(c=='0') break;
Дмитрий Спиридонов
Дмитрий Спиридонов
6 845
Лучший ответ
Just Friends Смотри как починил это. Программа работает, но я все равно не понимаю почему так.


#include<stdio.h>
int main()
{ float x,y;
char c='1';

while(c!='0')
{
printf("Знак: ");
scanf("%c",&c);
if (c=='0'){break;}
else if(c=='+'||c=='-'||c=='*'||c=='/')
{printf("X: ");
scanf("%f",&x);
printf("Y: ");
scanf("%f",&y);
if (c=='+')
{printf("Ответ: %.2f\n",x+y);}
else if (c=='-')
{printf("Ответ: %.2f\n",x-y);}
else if(c=='*')
{printf("Ответ: %.2f\n",x*y);}
else if (c=='/')
{if(y==0)
{printf("Ошибка!\n");}
else
printf("Ответ: %.2f\n",x/y);}

}else if (c!='+'||c!='-'||c!='*'||c!='/') { scanf("%*[^\n]"); printf("Ошибка\n");}
scanf("%c",&c);
}

return 0;
}
Ошибка возникает из-за того, что при чтении символа scanf не пропускает разделители (пробелы, разделитель строк, табуляция, вертикальная табуляция или подача страницы). При чтении одиночного символа символы разделителей читаются так же, как и любой другой символ, хотя при чтении данных других типов разделители интерпретируются как разделители полей.

Чтобы избежать этого, надо изменить формат для scanf
 scanf(" %c",&c); 
Пробел перед %c как раз даёт указание пропустить все начальные разделители.
Умербек Турумбаев Резумируя все высказанные замечания, предложу такой код:
 #include   

int main()
{
float x, y;
char c='1';
while(c!='0') {
printf("Знак: ");
scanf(" %c",&c);
if(c=='0') break;
if(c=='+'||c=='-'||c=='*'||c=='/') {
printf("X: ");
scanf("%f",&x);
printf("Y: ");
scanf("%f",&y);
if(c=='+')
printf("Ответ: %.2f\n",x+y);
else if(c=='-')
printf("Ответ: %.2f\n",x-y);
else if(c=='*')
printf("Ответ: %.2f\n",x*y);
else if(c=='/')
if(y!=0)
printf("Ответ: %.2f\n",x/y);
else
printf("Ошибка! Деление на 0.\n");
}
else
printf("Ошибка в знаке.\n");
}
return 0;
}
есть несколько проблем с кодом, которые я могу вам помочь решить:

В условии вашего if-else блока на строке 18, вы используете некорректное условие:

else if (c!='+'||c!='-'||c!='*'||c!='/')

Это условие всегда будет истинно, потому что символ c не может быть одновременно равен и '+', '-', '*' и '/'. Вам нужно использовать условие else if (c!='+' && c!='-' && c!='*' && c!='/')

Ваш код не обрабатывает проблему с пробелами и переносами строки при считывании операции. Это может привести к тому, что программа будет считывать неожиданный символ или пустую строку. Вы можете использовать комбинацию функций fgets и sscanf для считывания символа операции, как это:
char input[10];
fgets(input, sizeof(input), stdin);
sscanf(input, "%c", &c);
В случае, если пользователь ввел деление на ноль, сейчас ваш код просто выводит сообщение об ошибке. Но вам нужно сделать исключение, которое завершит работу программы
if(y==0)
{
printf("Ошибка! Деление на ноль. \n");
return 1;
}
Ваш код не добавляет перевод строки в конце вывода результата. Это может привести к неожиданному выводу при следующей итерации цикла. Вы можете добавить "\n" в конце строки с printf, чтобы добавить перевод строки.
Итого может выглядеть так:
#include<stdio.h>

int main() {
float x, y;
char c = '1';
char input[10];

while (c != '0') {
printf("Знак: ");
fgets(input, sizeof(input), stdin);
sscanf(input, "%c", &c);
if (c == '0') {
break;
} else if (c == '+' || c == '-' || c == '*' || c == '/') {
printf("X: ");
scanf("%f", &x);
printf("Y: ");
scanf("%f", &y);
if (c == '+') {
printf("Ответ: %.2f\n", x + y);
} else if (c == '-') {
printf("Ответ: %.2f\n", x - y);
} else if (c == '*') {
printf("Ответ: %.2f\n", x * y);
} else if (c == '/') {
if (y == 0) {
printf("Ошибка! Деление на ноль.\n");
return 1;
} else {
printf("Ответ: %.2f\n", x / y);
}
}
} else {
printf("Ошибка! Недопустимый знак операции.\n");
}
}

return 0;
}
Умербек Турумбаев
В случае, если пользователь ввел деление на ноль, сейчас ваш код просто выводит сообщение об ошибке. Но вам нужно сделать исключение, которое завершит работу программы

Вряд ли пользователь калькулятора обрадуется вылету программы при некорректных введенных значениях. :)