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;
}
四、思路拓展
關於運算的順序還可以用棧來維護,通過建立運算子優先順序表來決定入棧和出棧順序,從而控制運算順序。同學們可以嘗試一下,如果允許括號運算該如何處理?如何把中綴表示式改為字首或字尾的?