c# 用函数和switch语句实现c语言计算器

bqujaahr  于 2022-12-02  发布在  C#
关注(0)|答案(2)|浏览(166)

我试图用C语言编写一个计算器,使用函数进行每个操作并切换大小写,但输出如下:例如,当我输入5和6,并选择添加它打印sss5. 000000 + 6. 000000 = 11. 000000我如何删除sss之前5. 000000和什么原因导致这个问题?谢谢帮助。

cbjzeqam

cbjzeqam1#

更短更简单:

#include <stdio.h>
#include <math.h>

float addTwoNumbers   (float num1, float num2) { return num1+num2;       }
float subtTwoNumbers  (float num1, float num2) { return num1-num2;       }
float divideTwoNumbers(float num1, float num2) { return num1/num2;       }
float multTwoNumbers  (float num1, float num2) { return num1*num2;       }
float powerTwoNumbers (float num1, float num2) { return powf(num1,num2); }

float(*operation_map[])(float,float) =
{
     addTwoNumbers,
     subtTwoNumbers,
     divideTwoNumbers,
     multTwoNumbers,
     powerTwoNumbers
};

char choice_map[]= { '+', '-', '/', '*', '^' };

int main() {

    int choice;
    printf("choose one operation:\n"
           " 1.addition\n"
           " 2.substraction\n"
           " 3.division\n"
           " 4.multiplication\n"
           " 5.power\n");
    scanf("%d" ,&choice);
    
    printf("Enter two numbers: ");
    float num1, num2;
    scanf("%f %f" ,&num1, &num2);
    
    float result = operation_map[choice-1](num1, num2);
    printf("%.2f %c %.2f = %.2f", num1, choice_map[choice-1], num2, result);

    return 0;
}

输出

choose one operation:  1
 1.addition
 2.substraction
 3.division
 4.multiplication
 5.power
Enter two numbers: 3.14 2.71

3.14 + 2.71 = 5.85
qzwqbdag

qzwqbdag2#

您需要传递希望scanf()填充的变量的地址(num2应该是&num2)。检查scanf()的返回值,否则您的值可能未定义。另一个主要问题是您的printf()字符串“%d”与您的参数浮点参数不匹配。也添加了一个换行符。最后,你在开关之前调用了所有的函数,而不仅仅是你在开关中需要的函数。实现了你的伪函数。把main()移到了底部,这样你就不需要函数的原型了。

#include <stdio.h>
#include <math.h>

float addTwoNumbers(float num1, float num2) {
    return num1+num2;
}

float subtTwoNumbers(float num1, float num2) {
    return num1-num2;
}

float divideTwoNumbers(float num1, float num2) {
    return num1 / num2;
}

float multTwoNumbers(float num1, float num2) {
    return num1 * num2;
}

float powerTwoNumbers(float num1, float num2) {
    return pow(num1, num2);
}

int main() {
    printf("choose one operation:\n 1.addition\n 2.substraction\n 3.division\n 4.multiplication\n 5.power\n");
    int choice;
    if(scanf("%d", &choice) != 1) {
        printf("scanf failed\n");
        return 1;
    }
    printf("Enter two numbers: ");
    float num1, num2;
    if(scanf("%f %f", &num1, &num2) != 2) {
        printf("scanf failed\n");
        return 1;
    }
    switch (choice) {
        case 1:
            printf("%f + %f = %f\n" ,
                num1,
                num2,
                addTwoNumbers(num1, num2)
            );
            break;
        case 2:
            printf("%f - %f = %f\n" ,
                num1,
                num2,
               subtTwoNumbers(num1, num2)
            );
            break;
        case 3:
            printf("%f / %f = %f\n",
                num1,
                num2,
                divideTwoNumbers(num1, num2)
            );
            break;
        case 4:
            printf("%f * %f = %f\n" ,
                 num1,
                 num2,
                 multTwoNumbers(num1, num2)
            );
            break;
        case 5:
            printf("%f^%f = %f\n" ,
                num1,
                num2,
                powerTwoNumbers(num1, num2)
            );
            break;
        default:
            printf("Error!");
    }
}

运行示例:

choose one operation:
 1.addition
 2.substraction
 3.division
 4.multiplication
 5.power
1 
Enter two numbers: 1.2 2.3
1.200000 + 2.300000 = 3.500000

@abelenky向你展示了如何进一步重构它。另一个想法是观察到这5种情况之间的唯一区别仅仅是运算符,所以写一个print()函数来代替:

#include <stdio.h>
#include <math.h>

void print(float num1, char op, float num2, float result) {
    printf("%f %c %f = %f\n", num1, op, num2, result);
}

int main() {
    printf("choose one operation:\n 1.addition\n 2.substraction\n 3.division\n 4.multiplication\n 5.power\n");
    int choice;
    if(scanf("%d" ,&choice) != 1) {
        printf("scanf failed\n");
        return 1;
    }
    printf("Enter two numbers: ");
    float num1, num2;
    if(scanf("%f %f" ,&num1, &num2) != 2) {
        printf("scanf failed\n");
        return 1;
    }
    switch (choice) {
        case 1:
            print(num1, '+', num2, num1 + num2);
            break;
        case 2:
            print(num1, '-', num2, num1 - num2);
            break;
        case 3:
            print(num1, '/', num2, num1 / num2);
            break;
        case 4:
            print(num1, '*', num2, num1 * num2);
            break;
        case 5:
            print(num1, '^', num2, pow(num1, num2));
            break;
        default:
            printf("Error!");
    }
}

相关问题