我试图用C语言编写一个计算器,使用函数进行每个操作并切换大小写,但输出如下:例如,当我输入5和6,并选择添加它打印sss5. 000000 + 6. 000000 = 11. 000000我如何删除sss之前5. 000000和什么原因导致这个问题?谢谢帮助。
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
qzwqbdag2#
您需要传递希望scanf()填充的变量的地址(num2应该是&num2)。检查scanf()的返回值,否则您的值可能未定义。另一个主要问题是您的printf()字符串“%d”与您的参数浮点参数不匹配。也添加了一个换行符。最后,你在开关之前调用了所有的函数,而不仅仅是你在开关中需要的函数。实现了你的伪函数。把main()移到了底部,这样你就不需要函数的原型了。
scanf()
num2
&num2
printf()
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()函数来代替:
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!"); } }
2条答案
按热度按时间cbjzeqam1#
更短更简单:
输出
qzwqbdag2#
您需要传递希望
scanf()
填充的变量的地址(num2
应该是&num2
)。检查scanf()
的返回值,否则您的值可能未定义。另一个主要问题是您的printf()
字符串“%d”与您的参数浮点参数不匹配。也添加了一个换行符。最后,你在开关之前调用了所有的函数,而不仅仅是你在开关中需要的函数。实现了你的伪函数。把main()
移到了底部,这样你就不需要函数的原型了。运行示例:
@abelenky向你展示了如何进一步重构它。另一个想法是观察到这5种情况之间的唯一区别仅仅是运算符,所以写一个
print()
函数来代替: