c语言中的计算器输出

c语言中的计算器输出,c,output,calculator,C,Output,Calculator,我用SwitchCase做了一个简单的计算器程序,但输出结果与我预期的不同 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 s

我用SwitchCase做了一个简单的计算器程序,但输出结果与我预期的不同

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();
}
“和”的结果是一些巨大的天文数字。有人能告诉我为什么吗

a和b均为双型。scanf中double的正确格式说明符是%lf,而不是用于float的%f

请注意,在printf中,%f用于double或float,因为它被提升为double。由于printf中的C99,%lf与%f相同。

请尝试%lf而不是%f,因为这样您将使用a和b作为double而不是float类型。

您正在尝试将double转换为float,这在scanf或printf函数中是不可能的。scanf所做的是将整个doubleinput清除/重新格式化为空浮点值。这是一个工作:

#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);
}

正如大家所指出的,您需要扫描%lf,&a;b也一样。 现在,在switch语句中,您希望防止被零除:

case '/':
    sum = a / b;
    break;
    if (b == 0){ printf("Error"); }
    break;
但是那里发生的是你打破了;在达到条件之前。假设我们取消了第一次突破;在打印错误消息之前,仍将执行除零操作。 防止被零除的一种方法是:

case '/':
    if (b)
        sum = a / b;
    else
        printf("Error");
    break;

我们在哪里检查b!=0,然后进行除法或打印错误消息。

它可以工作,谢谢!我现在有被零除的问题。它没有打印错误消息,而是显示一个奇怪的结果1.INF或something@user2309261对于该问题,在计算sum=a/b之前,将部件移动到测试b=0;而不是把中间的部分打破。@ Kelar最好不要执行除法,如果目标是检测到除以零就要发生了。但不管怎样,如果参数是浮动的,它有什么好处呢?谢谢大家!我在做的时候修正了它:如果b==0,将浮点数与常数进行比较几乎总是一个坏主意。。。。浮点表示永远不会精确,如果fabsbcase '/': if (b) sum = a / b; else printf("Error"); break;