Не могу разобраться с калькулятором.
При компиляции программы после выполнения операции(например сложение), он выводит 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;
}
После while..{ в начале цикла добавь строчку, чтоб было так:
while(c!='0')
{
if(c=='0') break;
Ошибка возникает из-за того, что при чтении символа scanf не пропускает разделители (пробелы, разделитель строк, табуляция, вертикальная табуляция или подача страницы). При чтении одиночного символа символы разделителей читаются так же, как и любой другой символ, хотя при чтении данных других типов разделители интерпретируются как разделители полей.
Чтобы избежать этого, надо изменить формат для scanf
scanf(" %c",&c);
Пробел перед %c как раз даёт указание пропустить все начальные разделители.
есть несколько проблем с кодом, которые я могу вам помочь решить:
В условии вашего 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;
}
#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;
}