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

2021-07-10 19:37:35 字數 1499 閱讀 2074

一、問題重述

【問題描述】

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

要求:1、表示式運算子只有+、-、*、/,表示式末尾的』=』字元表示表示式輸入結束,表示式中可能會出現空格;

2、表示式中不含圓括號,不會出現錯誤的表示式;

3、出現除號/時,以整數相除進行運算,結果仍為整數,例如:5/3結果應為1。

【輸入形式】

在控制台中輸入乙個以』=』結尾的整數算術運算表示式。

【輸出形式】

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

【樣例1輸入】

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

【樣例1輸出】

【樣例2輸入】

500 =

【樣例2輸出】

【樣例1說明】

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

【樣例2說明】

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

【評分標準】

該題要求輸出整數表示式的計算結果,共有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 #include #include #include int main()

//將兩項相加(減)

if(op1=='+')

a1 += a2;

else if(op1=='-')

a1 -= a2;

op1 = op2; //此處注意

}printf("%d",a1);

return 0;

}

四、思路拓展

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

棧 四則運算表示式實現

棧的乙個常見應用,四則運算表示式求值。主要有兩個步驟 1,中綴轉字尾 2,字尾求值 實現起來比較簡單,我通過c 的容器stack實現一遍。從左到右遍歷中綴表示式的每個數字和符號,若是數字就輸出,即稱為字尾表示式的一部分,若是符號,則判斷其與棧頂符號的優先順序,是右括號或優先順序低於棧頂符號 乘除優先...

四則運算表示式求值

03 四則運算表示式求值 輸入輸入為四則運算表示式,僅由陣列 四則運算符 左右括號組成,不含空格。假設運算子結果都是整數。輸出輸出這個表示式的值 分析首先我們要搞清楚表示式的定義是什麼 表示式 由乙個或者多個項組成,多個項的表示式由 連線 項 由乙個或者多個因子組成,多個因子由 連線 因子 由 表示...

四則運算表示式求值

表示式求值是關於棧的應用,涉及到中綴與字尾式的轉換,本文關於10以內不帶括號的四則運算。9 3 4 x 3 24 1 x 9 5 9 9 5 x 9 4 6 2 x 3 1 42 思路 遇到數字直接入數字棧。遇到運算子,第乙個運算子直接入符號棧,後面的需要與符號棧棧頂元素比較優先順序。若當前優先順序...