1. 程式人生 > >C語言實現整數四則運算表示式的計算

C語言實現整數四則運算表示式的計算

一、問題重述

【問題描述】

從標準輸入中讀入一個整數算術運算表示式,如5 - 1 * 2 * 3 + 12 / 2 / 2  = 。計算表示式結果,並輸出。

要求:
1、表示式運算子只有+、-、*、/,表示式末尾的’=’字元表示表示式輸入結束,表示式中可能會出現空格;
2、表示式中不含圓括號,不會出現錯誤的表示式;
3、出現除號/時,以整數相除進行運算,結果仍為整數,例如:5/3結果應為1。

【輸入形式】

在控制檯中輸入一個以’=’結尾的整數算術運算表示式。

【輸出形式】

向控制檯輸出計算結果(為整數)。

【樣例1輸入】

5 - 1 * 2 * 3 + 12 / 2 / 2  =

【樣例1輸出】

2

【樣例2輸入】

500 =

【樣例2輸出】

500

【樣例1說明】

輸入的表示式為5 - 1 * 2 * 3 + 12 / 2 / 2 =,按照整數運算規則,計算結果為2,故輸出2。

【樣例2說明】

輸入的表示式為500 = ,沒有運算子參與運算,故直接輸出500。

演算法之一提示:
1、可以利用gets函式,讀取整行表示式;
2、對於空格,可以考慮首先去除表示式中的所有空格
3、可以設一計數器用來記錄已讀取、但未參加運算的運算子的個數,根據該計數器來判斷如何進行運算;
4、可以設計一函式:實現二元整數算術運算。

【評分標準】

該題要求輸出整數表示式的計算結果,共有5個測試點。上傳C語言檔名為example1c.c。

二、演算法概述

這裡提供一個我的老師提過的一個演算法,概括來說就是:從左向右依次運算,遇到乘除就先算乘除。下面用一個例子來解釋:

5 - 1 * 2 * 3 + 12 / 2 / 2  =

1.該等式等價於0+5 - 1 * 2 * 3 + 12 / 2 / 2  = ,所以我們先設a1=0 , op1=+

2.讀取資料a2=5 , op2=-

3.a1=a1+a2=5 , op1=op2=-,讀取a2=1 , op2=*

4.因為op2是*,所以我們繼續讀取後面的資料把它計算完,a3=2 , op3=*

5.計算a2=a2*a3,並令op2=op3,繼續如此計算直到計算完乘、除

6.計算完第一個連乘,此時a1=5,op1=-,a2=6,op2=+

7.計算op1所在的運算,a1=-1,op1=+

8.後面的操作類似,就不多說了

這個演算法的關鍵技巧,我認為是每次讀取一個數字和一個運算子。

三、C語言實現

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

int main()
{
    int a1,a2,a3;
    char op1,op2,op3;

    //為了保證結構,在最開始加上一個0+
    a1 = 0;
    op1 = '+';
    while(op1!='=')
    {
        scanf("%d %c",&a2,&op2);    //這裡用一個空格來忽略空白符
        //計算乘除
        while(op2=='*' || op2=='/')
        {
            scanf("%d %c",&a3,&op3);
            if(op2=='*')
                a2 *= a3;
            else if(op2=='/')
                a2 /= a3;
            op2 = op3;    //此處注意
        }
        //將兩項相加(減)
        if(op1=='+')
            a1 += a2;
        else if(op1=='-')
            a1 -= a2;
        op1 = op2;    //此處注意
    }

    printf("%d",a1);

	return 0;
}

四、思路拓展

關於運算的順序還可以用棧來維護,通過建立運算子優先順序表來決定入棧和出棧順序,從而控制運算順序。同學們可以嘗試一下,如果允許括號運算該如何處理?如何把中綴表示式改為字首或字尾的?