2014-06-08 37 views
-1

我想用C做一个计算器程序。我已经完成了大部分工作,我认为...只是输出不正确。应该出来的输出不会。下面是计算器程序的代码!C中的计算器错误

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

void add(double num1,double num2); 
void del(double num1,double num2); 
void mul(double num1,double num2); 
void divide(double num1,double num2); 
main(){ 
    FILE *fp; 
    char sym; 
    float num1, num2; 
    int ret; 
    fp = fopen("input.txt","r"); 
    if(fp==NULL){ 
     exit(1); 
    } 
    while(fscanf(fp,"%f%c%f", &num1,&sym,&num2)!=EOF){ 
     switch(sym){ 
      case '+': add(num1,num2); 
        break; 
      case '-': del(num1,num2); 
        break; 
      case '*': mul(num1,num2); 
        break; 
      case '/': divide(num1,num2); 
        break; 
      default: printf("%f%c%f", num1,sym,num2); 
     } 
    } 
    fclose(fp); 
} 

void add(double num1,double num2){ 
    double result; 
    result = num1+num2; 
    printf("%f\n", result); 
} 

void del(double num1,double num2){ 
    double result; 
    result = num1-num2; 
    printf("%f\n", result); 
} 

void mul(double num1,double num2){ 
    double result; 
    result = num1*num2; 
    printf("%f\n", result); 
} 

void divide(double num1,double num2){ 
    double result; 
    result = num1/num2; 
    printf("%f\n", result); 
} 

当我有投入:

123456789+987654321 
123456789-987654321 
12345*54321 
1349.238912+12384.12871 
3918.381631-1287.38272 

我应该得到的结果如下:

1111111110.000000 
-864197532.000000 
670592745.000000 
13733.367622 
2090.998911 

但这些结果我居然得到:

1111111128.000000 
-864197544.000000 
670592745.000000 
13733.367798 
2090.998901 

我不是t甚至可以肯定为什么中间操作运行良好时,其余不 我已经尝试使用float作为我的数据类型为num1num2,但结果远比使用double更关闭。

+0

请注意,每个函数都可以解析为一行。 (即printf(“%f \ n”,num1 + num2);)。或者,您甚至可以将这些单线插入您的开关盒中。 – sherrellbc

+4

[每个计算机科学家应该知道的关于浮点算术](http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) – Pavel

+1

上周的课程主页作品似乎是计算器和阅读/打印字符元组...... ;-) – alk

回答

1

在回答你的问题在我所说的关于简化程序的意见,考虑下面的代码:

请注意,我还包括修订码反映了原来的问题。也就是说,您正在使用float数据类型,该数据类型正被隐式转换为double,然后是带有float说明符的printf()调用。

#include <stdio.h> 
#include <stdlib.h> 

main(){ 
    FILE *fp; 
    char sym; 
    double num1, num2; 

    fp = fopen("input.txt","r"); 
    if(fp == NULL) 
     exit(1); 

    while(fscanf(fp,"%f%c%f", &num1,&sym,&num2) != EOF) 
     switch(sym){ 
      case '+': 
        printf("%f\n", num1+num2); 
        break; 
      case '-': 
        printf("%f\n", num1-num2); 
        break; 
      case '*': 
        printf("%f\n", num1*num2); 
        break; 
      case '/': 
        printf("%f\n", num1/num2); 
        break; 
      default: 
        printf("%f%c%f", num1,sym,num2); 
     } 
    fclose(fp); 
} 

注意括号也减少了。您只需要为包含多个依赖于它的语句的语句包含括号。

如:

if(myVar == 1){ 
    printSomething(); 
    doSomething(); 
    doSomethingElse(); 
} 

不过,如果你只需要一个说法,那么你可以删除括号。

if(myVar == 1) 
    printSomething(); 

注意,如果你有遵循,你还是可以滴括号码单block(如与上面的代码相同的 - while循环只有一个开关的情况下)。

+0

不要迂腐,但这不是对原始问题的回答。我认为降低投票有点苛刻,所以我不会,但你可能也想解决真正的问题。 – Pankrates

+0

在这里回答只是比在评论中输入我的意思更简单。答案已经解决了 - 他使用的是float类型,然后隐式地转换为double,然后使用float说明符。 – sherrellbc

+0

我同意,这就是为什么我没有downvote,但它会很好,如果你可以在答案的评论中包括答案,以便它更加可见 – Pankrates