2014-06-08 61 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