Итак, я немного изучаю C и сделал простой калькулятор, который будет выполнять некоторые базовые вычисления в зависимости от того, что вводит пользователь. Программа использует структуру переключателей, и это все. Каждый раз, когда я ввожу расчет, я получаю 0,000000. Ошибок нет, просто неправильные ответы. Программа была создана с использованием VS Code. Программа:
/*
The problem is to write a simple calculator that can add, subtract, multiply, divide, and find the
remainder when one
number is divided by another. The program must allow the calculation that is to be performed to be
keyed in a natural
way, such as 5.6 * 27 or 3 + 6.
*/
#include<stdio.h>
int main(int argc, char* argv[])
{
//declare and initialise objects
double num1 = 0.0; //1st operand value
double num2 = 0.0; //2nd operand value
char operation; //operations that will be performed: +, -, *, /, %
//user input
printf("Enter the calculation: ");
scanf("%1f %c %1f", &num1, &operation, &num2);
//calculations
switch (operation)
{
case '+':
printf(" = %1f\n", num1 + num2);
break;
case '-':
printf(" = %1f\n", num1 - num2);
break;
case '*':
printf(" = %1f\n", num1*num2);
break;
case '/':
if (num2 == 0) //can't divide by zero
{
printf("\n\nDivision by zero error!\n");
}
else
{
printf(" = %1f\n", num1/num2);
}
break;
case '%':
if ((long)num2 == 0) //can't divide by zero
{
printf("\n\nDivision by zero error!\n");
}
else
{
printf(" = %1ld\n", (long)num1 % (long)num2);
}
break;
default:
printf("\n\naIllegal Operation!"); //operation is illegal if we get to here
break;
}
//end of program
return 0;
}
Пример:
Enter the calculation: 4.7-3.2
= 0.000000
Я чувствую, что проблема очень проста, однако Google подвел меня, потому что мой «поиск» кажется слишком конкретным. Любой, у кого есть представление о том, что здесь происходит, будет очень признателен.
Пожалуйста, включите предупреждения компилятора и попытайтесь понять, что они означают. Есть 3 предупреждения, которые очень связаны с этой проблемой.
Если вы компилируете с помощью GCC , используйте gcc -Wall -Wextra -g
, а затем GDB
Теперь у вас есть %1f
, но должно быть %lf
. Это строчная буква L, а не цифра.
Вы обязательно должны использовать и понимать предупреждения компилятора. Если бы вы поняли их причины, а затем обратились к ним, не было бы необходимости писать здесь. Это предупреждения, которые я получаю при компиляции кода, который вы изначально опубликовали:
main.c:12:11: warning: format ‘%f’ expects argument of type ‘float *’, but argument 2 has type ‘double *’ [-Wformat=]
main.c:12:17: warning: format ‘%f’ expects argument of type ‘float *’, but argument 4 has type ‘double *’ [-Wformat=]
main.c:47:30: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long int’ [-Wformat=]
Предупреждения о нарушениях находятся в вашем scanf
, а printf
в случае '%'
для печати уравнения.
Чтобы прочитать значение double
через scanf
, спецификатором формата является %lf
, а не %f
.
См.: Чтение двойных значений с помощью scanf в c
Чтобы распечатать значение long int
через printf
, спецификатором формата является %ld
, а не %d
.
Смотрите: Каков аргумент для printf, который форматирует длинное?
Итак, ваш код должен иметь:
scanf("%lf %c %lf", &num1, &operation, &num2);
И (по сравнению с тем, что было в вашем исходном посте, в котором только что было %1d
):
printf(" = %1ld\n", (long)num1 % (long)num2);
Показать пример ввода. Проверьте возвращаемое значение
scanf()
.