用C寫一個計算機

如題

運算方法有5種 + - * / %

不管輸入幾次

直到 "=" 出現

但如果一開始就有等於 輸入 50 = 輸出是 50

不能用switch 只能用dowhile for if

已更新項目:

Jerry

你寫的好複雜...看不太懂

我後來用不到50行就把它寫出來摟@@

不過還是謝了!

1 個解答

評分
  • Jerry
    Lv 4
    1 0 年前
    最佳解答

    這個題目蠻有趣的,我來試試看~

    #include <stdio.h>

    #define MAX_DIGIT_STACK 100

    #define MAX_OP_STACK 100

    const char op[6] = { '=', '+', '-', '*', '/', '%' };

    const int val[6] = { 0 , 1 , 1 , 2 , 2 , 2 }; // 運算優先權

    int GetPrecedence(char c) // 取得運算優先權

    {

    int i;

    for (i=0;i<6;i++)

    if (c == op[i])

    return val[i];

    return 0;

    }

    int IsOp(char c) // 是否為運算元

    {

    int i;

    for (i=0;i<6;i++)

    if (c == op[i])

    return 1;

    return 0;

    }

    double DoOp(double d1, double d2, char op) // 做運算

    {

    if (op == '+')

    return d1 + d2;

    if (op == '-')

    return d1 - d2;

    if (op == '*')

    return d1 * d2;

    if (op == '/')

    return d1 / d2;

    if (op == '%')

    return (int) d1 % (int) d2;

    }

    int main()

    {

    double digitStack[MAX_DIGIT_STACK] = {0};

    char opStack[MAX_OP_STACK] = {0};

    int digitStackCount = 0, opStackCount = 0;

    char c;

    double digit = 0;

    int isPrevDigit = 0;

    char temp;

    do

    {

    c = getch();

    if (c == ' ')

    continue;

    if (c >= '0' && c <= '9')

    {

    printf("%c",c);

    digit = (digit * 10) + (c - '0');

    isPrevDigit = 1;

    continue;

    }

    if (isPrevDigit == 1) // 把整個數字 push 進去 digitStack

    {

    digitStack[digitStackCount] = digit;

    digitStackCount++;

    digit = 0;

    isPrevDigit = 0;

    }

    if (IsOp(c) == 1)

    {

    printf("%c",c);

    if (opStackCount == 0)

    {

    if (c == '=')

    break;

    // push 運算元

    opStack[opStackCount] = c;

    opStackCount++;

    continue;

    }

    // 將 opStack 裡優先權較高的運算元處理完

    while(GetPrecedence(c) <= GetPrecedence(opStack[opStackCount-1]))

    {

    temp = opStack[opStackCount-1];

    opStackCount--;

    digitStack[digitStackCount-2] = DoOp(digitStack[digitStackCount-2], digitStack[digitStackCount-1], temp);

    digitStackCount--;

    if(opStackCount == 0)

    break;

    }

    if (c == '=')

    break;

    // push 運算元

    opStack[opStackCount] = c;

    opStackCount++;

    }

    } while(1);

    while(opStackCount > 0) // 將剩餘的運算處理完

    {

    temp = opStack[opStackCount-1];

    opStackCount--;

    digitStack[digitStackCount-2] = DoOp(digitStack[digitStackCount-2], digitStack[digitStackCount-1], temp);

    digitStackCount--;

    }

    2008-09-29 21:42:48 補充:

    // 輸出結果

    printf("%f",digitStack[0]);

    getch();

    return 0;

    }

還有問題?馬上發問,尋求解答。