2017-07-16 56 views
2

我新的C和我試圖做一個簡單的計算器簡單的使用計算器ç問題

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

int main() { 
    int firstNumber, secondNumber, answer; 
    char mathSign[20]; 

    printf("Enter first number \n"); 
    scanf("%d", &firstNumber); 

    printf("Enter sign \n a - Add \n s = Subtract \n m - Multiply \n d - Divide \n"); 
    scanf("%s", mathSign); 

    printf("Enter second number \n"); 
    scanf("%d", &secondNumber); 

    if (mathSign == 'a') { 
     answer = firstNumber + secondNumber; 
    } else if (mathSign == 's') { 
     answer = firstNumber - secondNumber; 
    } else if (mathSign == 'm') { 
     answer = firstNumber * secondNumber; 
    } else if (mathSign == 'd') { 
     answer = firstNumber/secondNumber; 
    } 

    printf("Your answer is %d", answer); 

    return 0; 
} 

答案最終總是作爲52出於某種原因。我應該讓整數加倍嗎?

+1

'mathSign'是一個*數組*,即一個字符串。你用['strcmp']比較字符串(http://en.cppreference.com/w/c/string/byte/strcmp)。或者你可以比較'mathSign'的第一個*字符*和另一個字符。 –

+0

另外,如果用戶輸入'mathSign'的一些輸入無效,該怎麼辦?你也需要處理這種情況(現在這種情況發生在無效比較中)。 –

+1

爲什麼要使用char數組?你可以簡單地在這裏使用字符 –

回答

0

您測試mathSign == 'a'mathSign是一個數組,因此您應該編寫mathSign[0] == 'a'。編譯器應該已經產生了警告。你不應該忽視這些警告,它們表明問題通常是真正的錯誤。您可以通過提高警告級別獲得更多有用的診斷:gcc -Wall -W -Werrorclang -Weverything -Werror ...

注意scanf("%s", mathSign);會導致如果用戶鍵入超過19個字符長的單詞的緩衝區溢出。您應該保護與目標數組:

scanf("%19s", mathSign); 

此外,你應該檢查轉換成功,否則,你可能有不確定的行爲,如果輸入無法轉換,你使用的仍然未初始化的值。

您可以使用" %c"來讀取單個字符並使用經典操作符以提高可讀性。請注意0​​之前的空格:它允許scanf()跳過空白字符,例如前一個響應中的換行符。

下面是修改後的版本:

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

int main(void) { 
    int firstNumber, secondNumber, answer; 
    char mathSign; 

    printf("Enter first number: "); 
    if (scanf("%d", &firstNumber) != 1) 
     return 1; 

    printf("Enter operation\n + - Add\n - = Subtract\n * - Multiply\n/- Divide\n"); 
    if (scanf(" %c", &mathSign) != 1) 
     return 1; 

    printf("Enter second number: "); 
    if (scanf("%d", &secondNumber) != 1) 
     return 1; 

    if (mathSign == '+') { 
     answer = firstNumber + secondNumber; 
    } else if (mathSign == '-') { 
     answer = firstNumber - secondNumber; 
    } else if (mathSign == '*') { 
     answer = firstNumber * secondNumber; 
    } else if (mathSign == '/') { 
     answer = firstNumber/secondNumber; 
    } else { 
     printf("unsupported operation: %c\n", mathSign); 
     return 1; 
    } 

    printf("Your answer is %d\n", answer); 

    return 0; 
} 

可以進一步與switch聲明簡化程序:

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

int main(void) { 
    int firstNumber, secondNumber, answer; 
    char mathSign; 

    printf("Enter a simple expression: "); 
    if (scanf("%i %c%i", &firstNumber, &mathSign, &secondNumber) != 3) 
     return 1; 

    switch (mathSign) { 
     case '+': answer = firstNumber + secondNumber; break; 
     case '-': answer = firstNumber - secondNumber; break; 
     case '*': answer = firstNumber * secondNumber; break; 
     case '/': answer = firstNumber/secondNumber; break; 
     case '%': answer = firstNumber % secondNumber; break; 
     default: 
     printf("unsupported operation: %c\n", mathSign); 
     return 1; 
    } 
    printf("the result is %d\n", answer); 
    return 0; 
} 
+0

謝謝!但是,只要我不把它作爲一個數組,它會跳過要求數學的整個部分.SignNode –

+0

@AntonTruong:'char mathSign; scanf(「%c」,&mathSign);'的確存在一個問題:在需要運算符之前跳過待處理的空白區域,否則您可能會讀取一個掛起的換行符到'mathSign'中。爲此,您可以將格式字符串更改爲'scanf(「%c」,mathSign)'。 – chqrlie

0

當您僅使用mathSign時,它是指向數組的指針。 要訪問第一個元素,你必須使用mathSign[0]。

或者,因爲你只打算先簽後換一個角色,你可以聲明char mathSign而不是char mathSign[20]然後閱讀使用scanf(" %c", mathSign); 在這種情況下,比較mathSign == 'a是正確的符號字符。

+0

在需要運算符之前跳過掛起的空白區域,否則您可能會讀取一個掛起的換行符到'mathSign'中。爲此,您可以將格式字符串更改爲'scanf(「%c」,mathSign)' – chqrlie

+0

@chqrlie好點!謝謝!代碼改進。 – sg7

1

試試這個代碼。這應該工作。此外,這將是最優化的一個。

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

int main() { 
    int firstNumber, secondNumber, answer; 
    char mathSign; 

    printf("1.Enter first number \n"); 
    scanf("%d", &firstNumber); 

    printf("Enter sign \n a - Add \n s = Subtract \n m - Multiply \n d - Divide \n"); 
    scanf(" %c", &mathSign); 

    printf("Enter second number \n"); 
    scanf("%d", &secondNumber); 

    switch (tolower(mathSign)) { 
    case 'a': 
     answer = firstNumber + secondNumber; 
     break; 
    case 's': 
     answer = firstNumber - secondNumber; 
     break; 
    case 'm': 
     answer = firstNumber * secondNumber; 
     break; 
    case 'd': 
     answer = firstNumber/secondNumber; 
     break; 
    default: 
     printf("Invalid Choice"); 
     break; 
    } 

    printf("Your answer is %d", answer); 
    return 0; 
}