我使用switch case制作了一个简单的计算器程序,但输出与我预期的不同。
int main(){
double a, b;
double sum = 0;
char o; //operator
printf("Enter operator\n");
scanf("%c", &o);
printf("Enter first operand\n");
scanf("%f", &a);
printf("Enter second operand\n");
scanf("%f", &b);
switch (o)
{
case '+':
sum = a + b;
break;
case '-':
sum = a - b;
break;
case '*':
sum = a * b;
break;
case '/':
sum = a / b;
break;
if (b == 0){ printf("Error"); }
break;
}
printf("The result is\n%10.10lf\n", sum);
getchar();
getchar();
}
'sum'的结果是一些巨大的天文数字。有人能说出原因吗?
答案 0 :(得分:3)
a
和b
都属于double
类型。 double
中scanf
的正确格式说明符为%lf
,而非%f
(适用于float
)。
scanf("%lf", &a);
请注意,在printf
中,%f
使用double
或float
double
相同,因为它被提升为%lf
)。自C99起,printf
中的%f
与{{1}}相同。
答案 1 :(得分:3)
请尝试使用%lf
代替%f
,因为这样您就可以a
而b
代替double
而不是float
。< / p>
答案 2 :(得分:1)
您正尝试将double
转换为float
,scanf
或printf
函数内的隐式。 scanf
正在做什么,它正在将整个(双)输入清除/重新格式化为空浮点值。这是一个工作:
#include<stdio.h>
int main(){
double a, b;
double sum = 0;
char o; //operator
printf("Enter operator\n");
scanf("%c", &o);
printf("Enter first operand\n");
scanf("%lf", &a);
printf("Enter second operand\n");
scanf("%lf", &b);
switch (o)
{
case '+':
sum = a + b;
break;
case '-':
sum = a - b;
break;
case '*':
sum = a * b;
break;
case '/':
sum = a / b;
break;
if (b == 0){ printf("Error"); }
break;
}
printf("The result is\n %f\n", sum);
}
答案 3 :(得分:1)
正如大家所指出的那样,你需要scanf ("%lf", &a);
和b一样。
现在在你的switch语句中你想要防止除以零:
case '/':
sum = a / b;
break;
if (b == 0){ printf("Error"); }
break;
但是在你达到这个条件之前,你会发现break;
会发生什么。假设我们删除了第一次休息;无论如何,在打印错误消息之前仍会执行除零。
防止除零的一种方法是:
case '/':
if (b)
sum = a / b;
else
printf("Error");
break;
我们在进行除法之前检查b != 0
然后我们要么划分或打印错误信息。