2012-01-07 35 views
0

編程計算器程序時,我遇到了兩個絆腳石。雖然我從計算器中獲得正確的結果並正確打印加法,減法和乘法,但我只是打印了除法結果的?符號。請參閱下面的代碼。μ控制器上的C編程:printf()和FDEV_SETUP_STREAM?

static void calculate(int *val1, int *val2, char *op){ 
float a = *val1; 
float b = *val2; 
float c = a/b; 

    /* 
    A stands for addition, B for sub, C for mul, D for div 
    I have already verified that the right operation is being 
    performed 
    */ 

if(strcmp(op,"A")==0) 
    { 
    printf("%i \n\r", *val1+*val2); 
}else if(strcmp(op,"B")==0) 
    { 
    printf("%i \n\r", *val1-*val2); 
}else if(strcmp(op,"C")==0) 
    { 
    printf("%i \n\r", *val1 * *val2); 
}else if(strcmp(op,"D")==0) 
    { 
    printf("%f \n\r", c); 
} 
} 

我使用的實際增長,從我ATMEGA 32單片機的打印結果。

在調試器中,當用戶選擇的操作是分區「D」時,我確認float c具有正確的值,但它似乎沒有與它關聯的小數點,儘管它是一個浮點數。

第二個問題:

我不知道我是否可以使用字符的一個這樣的數組(字符串):

//please note that below I am just simulating user keystrokes on a keypad attached to a 
//microcontroller just for simplifying the problem. 

    char a[20] = {1,2,3,4,5,\n}; 
    FILE keypad_str = FDEV_SETUP_STREAM(NULL, a, _FDEV_SETUP_READ); 

什麼我想上面正試圖想出一個策略使我能夠立即打印出每個用戶按鍵,而不是讓keypad_strstdin然後在屏幕上輸出整個用戶輸入的命令字符串。

+1

在'printf'中嘗試'(float)* val1/* val2'來代替'c' – 2012-01-07 06:22:01

+0

同樣在你的第二個代碼中它應該是''\ n'' – 2012-01-07 06:23:31

+0

@VinayakGarg:爲什麼在' printf()'調用有什麼區別? – 2012-01-07 06:38:30

回答

1

對於你的問題,1,出現了多種問題,所以我重新寫你的程序分爲以下

#include <stdio.h> 

static void calculate(int val1, int val2, char op) 
{ 
    switch(op) { 
     case 'A': 
      printf("%d+%d = %d \n", val1, val2, val1 + val2); 
      break; 
     case 'B': 
      printf("%d-%d = %d \n", val1, val2, val1 - val2); 
      break; 
     case 'C': 
      printf("%d*%d = %d \n", val1, val2, val1 * val2); 
      break; 
     case 'D': 
      if (val2 == 0) { 
       printf("can't divide by 0\n"); 
       break; 
      }      
      printf("%d/%d = %.2f \n", val1, val2, (float)val1/(float)val2); 
      break; 
     default: 
      break; 
    } 

    return; 
} 

int main(void) 
{ 
    int a = 10, b = 20; 
    char op = 'D'; 
    calculate(a, b, op); 
    op = 'A'; 
    calculate(a, b, op); 
    return 0; 
} 

輸出:

$ ./a.out 
10/20 = 0.50 
10+20 = 30 
$ 

WRT問題2:

char a[20] = {1,2,3,4,5,\n}; 

是無效的,實際上應該如下

char a[20] = {'1', '2', '3', '4', '5', '\n'}; 
2

在分割之前,您並未檢查除以零。

不清楚爲什麼你總是做一個分割,即使當這個操作是加法或減法或乘法。您應該只做部門在必要時:

else if (strcmp(op, "D")==0) 
{ 
    float a = *val1; 
    float b = *val2; 
    if (*val2 == 0) 
     printf("Divide by zero error\n"); 
    else 
    { 
     float c = a/b; 
     printf("%f\n", c); 
    } 
} 

我已經離開了可變c到位,因爲它可以更容易地調試值。

這些都不能解釋問號輸出。

(你有沒有告訴上的Atmega 32單片機C編譯器包含浮點庫支持?這也許能夠解釋問號。)

我會選擇琴絃"+""-""*""/"作爲操作的助記符;然後我不打算解釋說明這些操作的意思。

通常情況下,您不會在格式中包含回車符。當你這樣做的時候,它通常會在換行符之前,而不是跟在換行符後面。目前還不清楚爲什麼要在輸出行末尾留空。

關於FDEV_SETUP_STREAM()的一些問題需要我沒有的知識。

然而,C編譯器應該告訴你的是:

char a[20] = {1,2,3,4,5,\n}; 

是無效的。你可能是指其中的任何一個;他們倆都是有效的,而不同:

char a[20] = { 1, 2, 3, 4, 5, '\n' }; 
    char a[20] = { '1', '2', '3', '4', '5', '\n' }; 

上面的初始化可以縮寫爲:

char a[20] = "\001\002\003\004\005\n"; 
char a[20] = "12345\n"; 

這強調了差異(沒有,雙零是不是絕對必要的,但幫助表達)。