Остался символ новой строки в stdin
от предыдущей операции ввода.Ваш
scanf("%c",&repeat);
читает этот символ новой строки, потому что спецификатор преобразования %c
не пропускает пробельные символы.Используйте
scanf(" %c", &repeat);
для пропуска начальных пробелов.
В C и C ++ одиночные символы заключаются в одинарные кавычки.
char ch;
ch == "A";
будет сравнивать значениеch
по адресу строкового литерала "A"
.
Итак ...
while(repeat=="y"||repeat=="Y");
~>
while(repeat == 'y' || repeat == 'Y');
и
char operation, repeat="y";
~>
char operation, repeat = 'y';
Ваш компилятор должен был предупредить вас об этом.Если нет, вы должны увеличить уровень предупреждения вашего компилятора.
Вы также можете проверить деление на ноль, которое не определено.
И последнее: printf()
не заботится о спецификаторе длины l
в %lf
, он такой же, как %f
из-за распространения параметров по умолчанию.Аргумент float
в вызове функции, которая принимает переменное число аргументов, всегда преобразуется в double
перед передачей в функцию.Таким образом, есть только %f
для printf()
.
PS: как Cacahuete Frito сказано в комментариях:
Вы должны проверитьвозвращаемое значение scanf()
Да, вы должны.Никогда не доверяй пользователю.