版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 一、設(shè)計思想</b></p><p> (一)中綴轉(zhuǎn)后綴的設(shè)計思想</p><p> 設(shè)計一個能實現(xiàn)表達式自動求值計算,算術(shù)表達式由操作數(shù)、算符和括號組成。由于運算符的優(yōu)先級不同還要考慮括號。所以表達式不可能一直的從左到右進行,所以就借助棧來實現(xiàn)這個表達式的求值。</p><p> 首先要把算術(shù)表達式變換成與
2、之等值的無括號表達式,也就是中綴轉(zhuǎn)后綴,它也是這個算法的關(guān)鍵。設(shè)計兩個棧,一個為字符型的,存放運算符,用以將算術(shù)表達式變成無括號的表達式;另一個浮點型的,存放操作數(shù),用以對無符號的表達式進行求值。我們要假設(shè)運算符的優(yōu)先級:( ) , * /, + - 。首先將一左括號‘(’入棧,作為棧底元素;接著從左到右對算術(shù)表達式進行掃描。每次讀一位,若遇到左括號‘(’,則進棧;若遇到的是操作數(shù),則立即輸出;若又遇到運算符,如果它的優(yōu)先級比棧頂元素
3、的優(yōu)先級數(shù)高的話,則直接進棧,否則輸出棧頂元素,直到新的棧頂元素的優(yōu)先級數(shù)比它低的,然后將它壓棧;若遇到是右括號‘)’,則將棧頂?shù)倪\算符輸出,直到棧頂?shù)脑貫椤ā缓?,左右括號互相底消;到設(shè)計的結(jié)束標志的時候表示表達式已經(jīng)掃描完畢,表達式已經(jīng)全部輸入,將棧中的運算符全部輸出,刪除棧底的左括號。以上完成了中綴表達式轉(zhuǎn)后綴表達式,輸出無括號的后綴表達式。</p><p> 讀后綴表達式,若遇數(shù)值,操作數(shù)進棧;若
4、遇運算符,讓操作數(shù)棧的棧頂和次棧頂依次出棧并與此運算符進行運算,運算結(jié)果入操作數(shù)棧;重復(fù)這個步驟,直到遇到結(jié)束標志,則此時棧中的結(jié)果便是所求的后綴表達式的值,接著輸出結(jié)果。以上就是設(shè)計這個算法的主要的思想。</p><p> (二) 直接計算的設(shè)計思想</p><p> 直接計算其實跟上一個相似,它是在上面掃兩遍的思想進行修改的得來。</p><p> 首先,
5、要建立兩個棧,一個為字符型的,存放運算符,另一個浮點型的,存放操作數(shù),我們開始對表達式進行掃描。首先要確定運算符的優(yōu)先級:(、)、*、/、+、-。如果掃描到的是數(shù)字符號,把它們轉(zhuǎn)換成浮點型數(shù)據(jù)或其他可運算的數(shù)據(jù)類型,存入操作數(shù)棧中。如果掃描到的是運算符號,第一個運算符進棧,遇到‘(’存入運算符棧中,我們按照第一種算法的方法將表達式依次掃描。只不過不同的是,當每取得的一個運算符的時候,都要與棧頂?shù)倪\算符進行比較,如果它的優(yōu)先級小于棧頂運算
6、符優(yōu)先級時,取出棧頂運算符并從操作數(shù)棧中取棧頂兩個數(shù)進行運算,得到的結(jié)果則要存回操作數(shù)棧,就這樣邊掃描邊比較,再進行計算。遇到“)”對運算符的處理相同。掃描結(jié)束后,把運算符棧的元素和操作數(shù)棧里的數(shù)進行運算。每次的運算結(jié)果再放入操作數(shù)棧,一直到計算到運算符???。最后操作數(shù)棧的棧頂留下的操作數(shù)即表達式的計算結(jié)果。以上就是直接計算表達式的思路。</p><p><b> 二、算法流程圖</b>&
7、lt;/p><p> ?。ㄒ唬┲芯Y轉(zhuǎn)后綴算法的流程圖</p><p> 圖1中綴轉(zhuǎn)后綴算法的流程圖</p><p> 流程圖說明:該流程圖分兩部分成,第一部分是中綴轉(zhuǎn)后綴部分,第二部分是用于后綴表達式求值的。</p><p> (二)直接計算算法的流程圖</p><p> 圖2接計算算法的流程圖</p>
8、<p> 流程圖說明:該流程圖進過圖1 改進得到,只是缺少中綴轉(zhuǎn)后綴的部分。</p><p><b> 三、源代碼</b></p><p> 下面給出的是用中綴轉(zhuǎn)后綴算法實現(xiàn)的程序的源代碼:</p><p> #include <stdio.h></p><p> #define N
9、50</p><p> typedef struct StackArray{</p><p> float data[N];</p><p><b> int top;</b></p><p> }StackArray; /*定義操作數(shù)棧*/</p><
10、;p> typedef struct StackChar{</p><p> char data[N];</p><p><b> int top;</b></p><p> }StackChar; /*定義操作符棧*/ </p><p>
11、 StackArray *InitNum() /*初始化數(shù)值棧*/</p><p><b> {</b></p><p> StackArray *p = (StackArray *)malloc(sizeof(StackArray)); /*取一段內(nèi)存賦予數(shù)值棧*/</p><p> p-&
12、gt;top=-1;</p><p> return p; /*返回*/</p><p><b> }</b></p><p> StackChar *InitChar() /*初始化操作符棧*/</p><p><b> {</b></p><p>
13、StackChar *p=(StackChar *)malloc(sizeof(StackChar)); /*取一段內(nèi)存賦予數(shù)值棧*/</p><p> p->top=-1;</p><p><b> return p;</b></p><p><b> }</b></p><p>
14、 int PushNum(StackArray *p,float value) /*定義入棧函數(shù)*/</p><p><b> {</b></p><p> if(p->top<50-1)</p><p><b> {</b></p><p> p->top+=1;&l
15、t;/p><p> p->data[p->top]=value; /*棧頂*/</p><p><b> return 1;</b></p><p><b> }</b></p><p><b> else</b></p><p>&
16、lt;b> {</b></p><p><b> return 0;</b></p><p><b> }</b></p><p><b> }</b></p><p> int PushChar(StackChar *p,char value)
17、 /*操作符入棧*/</p><p><b> {</b></p><p> if(p->top<50-1)</p><p><b> {</b></p><p> p->top+=1;</p><p> p->data[p->top
18、]=value; /*入棧為棧頂*/</p><p><b> return 1;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p&
19、gt; return 0; /*返回值*/</p><p><b> }</b></p><p><b> }</b></p><p> int PopNum(StackArray *p,float *value) /*操作數(shù)出棧*/</p><p><b> {<
20、/b></p><p> if(p->top>=0) /*判斷棧是否為空*/</p><p><b> {</b></p><p> *value=p->data[p->top];</p><p> p->top-=1;</p><p><b>
21、; }</b></p><p><b> return 1;</b></p><p><b> }</b></p><p> int PopChar(StackChar *p,char *q) /*操作符出棧函數(shù)*/</p><p><b> {</b>
22、</p><p> if(p->top>=0) /*定義操作符棧*/ </p><p><b> {</b></p><p> *q=p->data[p->top];</p><p> p->top-=1;</p><p><b> }<
23、;/b></p><p><b> return 1;</b></p><p><b> }</b></p><p> float VisitNum(StackArray *p) /*定義數(shù)值棧遍歷函數(shù)*/</p><p><b> {</b></p>
24、;<p> if(p->top!=-1)</p><p> return p->data[p->top];</p><p> else return 0;</p><p><b> }</b></p><p> char visitChar(StackChar *p) /*定
25、義操作符棧遍歷函數(shù)*/</p><p><b> {</b></p><p> if(p->top!=-1)</p><p> return p->data[p->top];</p><p> else return 0;</p><p><b> }<
26、/b></p><p> int level(char c) /*優(yōu)先級*/</p><p><b> {</b></p><p><b> switch(c)</b></p><p><b> {</b></p&
27、gt;<p> case '#': return 0; /*#的優(yōu)先級*/</p><p> case '+':return 1;</p><p> case '-':return 1; /* ‘-‘的優(yōu)先級*/</p><p> case '*':return 2;</
28、p><p> case '/':return 2;</p><p> case '(':return 3; /*(優(yōu)先級*/</p><p> default : return -1;</p><p><b> }</b></p><p><b>
29、 }</b></p><p> int strLen(char *L) /*字符串長度函數(shù)*/</p><p><b> {</b></p><p><b> int i;</b></p><p> for(i=0;L[i]!='\0';i++); /*循
30、環(huán)條件*/</p><p> if(L[0]=='-'||L[0]=='+')</p><p><b> { </b></p><p><b> i=i-1;</b></p><p><b> }</b></p>
31、<p><b> return i;</b></p><p><b> }</b></p><p> float Compute(float a,char c,float b) /*計算*/</p><p><b> {</b></p><p><b&
32、gt; switch(c)</b></p><p><b> {</b></p><p> case '+':return a+b; /*加號的運算*/</p><p> case '-':return a-b;</p><p> case '*'
33、;:return a*b; /*乘號的運算*/</p><p> case '/':return a/b; /*除號的運算*/</p><p> default : return -1;</p><p><b> }</b></p><p><b> }</b>&
34、lt;/p><p> void main()</p><p><b> {</b></p><p> StackArray *data;</p><p> StackChar *op;</p><p> int i,j=0;</p><p><b> fl
35、oat n;</b></p><p> float result,opA,opB;</p><p> char opChar;</p><p> char array[N];</p><p> char *ptarray=NULL; /*定義指針*/</p><p> float houz
36、hui[N];</p><p> printf("Please enter a data:\t");</p><p> while((scanf("%s",array))!=EOF) /*循環(huán)條件*/</p><p><b> {</b></p><p> op=I
37、nitChar();</p><p> data=InitNum();</p><p> PushChar(op,'#');</p><p> array[strLen(array)]='#'; /*結(jié)束標志*/</p><p> ptarray=array;</p><p>
38、; for(i=0;i<strLen(ptarray);i++) /*循環(huán)條件*/</p><p><b> {</b></p><p> if(array[i]>=48&&array[i]<=57||array[i]=='.') /*判斷數(shù)值</p><p><b> {&
39、lt;/b></p><p> double weight=0.1;</p><p> int flag=0; /*定義變量*/</p><p> float n=0; /*定義變量*/</p><p> n=array[i]-48;</p><p> while(array[i+1]>
40、;=48&&array[i+1]<=57||array[i+1]=='.') /*判定數(shù)值*/</p><p><b> {</b></p><p> if(array[i+1]=='.') /*小數(shù)*/</p><p>
41、<b> flag=1;</b></p><p><b> else</b></p><p><b> {</b></p><p> if(flag==0)n=n*10+array[i+1]-48; /*整數(shù)化浮點數(shù)*/</p><p><b>
42、 else</b></p><p><b> {</b></p><p> n=n+(array[i+1]-48)*weight; /*小數(shù)化浮點數(shù)*/</p><p> weight*=0.1; /*小數(shù)位權(quán)*/</p>
43、<p><b> }</b></p><p><b> }</b></p><p><b> i++;</b></p><p><b> }</b></p><p> houzhui[j]=n;</p><p&g
44、t;<b> j++;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> if(array[i]=='#')
45、 /*結(jié)束標志*/</p><p><b> {</b></p><p> while(visitChar(op)!='#') /*對操作符棧遍歷*/</p><p><b> {</b></p><p> PopChar(op,&opChar);
46、</p><p> houzhui[j]=opChar; /*出棧入數(shù)組*/</p><p><b> j++;</b></p><p><b> }</b></p><p><b> }</b></p><p><
47、b> else</b></p><p> { </p><p> if(level(array[i])>level(visitChar(op))||</p><p> visitChar(op)=='(') /*判斷優(yōu)先級*/<
48、/p><p><b> {</b></p><p> PushChar(op,array[i]); /*入棧*/</p><p><b> }</b></p><p><b> else</b></p><p&
49、gt;<b> {</b></p><p> if(array[i]==')') /*遇見字符‘)’*/</p><p><b> {</b></p><p> while(visitChar(op)!='(')
50、 /*出戰(zhàn)到‘(’*/</p><p><b> {</b></p><p> PopChar(op,&opChar);</p><p> houzhui[j]=opChar;j++; /*操作符入數(shù)組*/</p><p> }
51、 </p><p> PopChar(op,&opChar);</p><p><b> }else</b></p><p><b> {</b></p><p> while(level(array[i
52、])<=</p><p> level(visitChar(op))) /*優(yōu)先級*/</p><p><b> {</b></p><p> PopChar(op,&opChar);</p><p> houzhui[j]=opChar; /*出棧*/</p><p&
53、gt;<b> j++;</b></p><p><b> }</b></p><p> PushChar(op,array[i]); /*運算符進棧*/</p><p><b> }</b></p><p><b> }</b></p
54、><p><b> }</b></p><p><b> } </b></p><p><b> }</b></p><p> for(j=0;houzhui[j]!='\0';j++)</p><p><b> {&
55、lt;/b></p><p> if((char)houzhui[j]=='+'||(char)houzhui[j]=='-'||</p><p> (char)houzhui[j]=='*'||(char)houzhui[j]=='/') /*類型轉(zhuǎn)換*/</p><p><b&g
56、t; {</b></p><p> printf("%2c",(char)houzhui[j]); /*輸出一個運算符*/</p><p> PopNum(data,&opA);</p><p> PopNum(data,&opB);</p><p> resu
57、lt=Compute(opB,(char)houzhui[j],opA); /*調(diào)用函數(shù)*/</p><p> PushNum(data,result); /*結(jié)果入棧*/</p><p><b> }</b></p><p><b> else</b></p&g
58、t;<p><b> {</b></p><p> PushNum(data,houzhui[j]);</p><p> printf("%8f",houzhui[j]) /*輸出后綴表達式*/;</p><p><b> }</b></p><p><
59、;b> }</b></p><p> printf("\nthe Result is:%.2f\n\n",result); /*輸出結(jié)果*/</p><p><b> }</b></p><p><b> }</b></p><p> 下面給出
60、的是用直接計算算法實現(xiàn)的程序的源代碼:</p><p> #include <stdio.h></p><p> #define N 50</p><p> typedefstructlistStack</p><p><b> {</b></p><p> float da
61、ta[N];</p><p><b> int top;</b></p><p> }listStack; /*定義存儲操作數(shù)的棧*/</p><p> typedefstructopStack</p><p><
62、b> {</b></p><p> char data[N];</p><p><b> int top;</b></p><p> }opStack; /*用于定義存儲操作符號的棧*/</p><p> li
63、stStack *InitNum() /*初始化數(shù)值棧*/</p><p><b> {</b></p><p> listStack *p=(listStack *)malloc(sizeof(listStack)); /*取一段內(nèi)存賦予數(shù)值棧*/</p><p
64、> p->top = -1; /*定義棧底*/</p><p><b> return p;</b></p><p><b> }</b></p><p> opStack *InitChar()
65、 /*初始化操作符棧*/</p><p><b> {</b></p><p> opStack *p=(opStack *)malloc(sizeof(opStack)); /*取一段內(nèi)存賦予操作符棧*/</p><p> p->top =-1;</p>&l
66、t;p><b> return p;</b></p><p><b> }</b></p><p> intPushNum(listStack *p,float value) /*定義入棧函數(shù)*/</p><p><b> {</b></p
67、><p> if(p->top<N-1)</p><p><b> {</b></p><p> p->top+=1;</p><p> p->data[p->top]=value; /*入棧的數(shù)值為棧頂元素*/</p>&l
68、t;p><b> return 1;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> return 0; </p>&l
69、t;p><b> }</b></p><p><b> }</b></p><p> intPopNum(listStack *p,float *a) /*定義數(shù)值出棧函數(shù)*/</p><p><b> {</b></p>
70、<p> if(p->top>=0) /*判定棧不為空*/</p><p><b> {</b></p><p> *a=p->data[p->top];</p><p> p->top-=1;</p>&l
71、t;p><b> }</b></p><p><b> return 1;</b></p><p><b> }</b></p><p> float VisitNum(listStack *p) /*定義數(shù)值棧遍歷函數(shù)*/
72、</p><p><b> {</b></p><p> if(p->top!=-1) /*判定棧是否為空*/</p><p> return p->data[p->top];</p><p> else ret
73、urn 0;</p><p><b> }</b></p><p> void PushChar(opStack *p,char a) /* 定義操作符入棧函數(shù)*/</p><p><b> {</b></p><p> if(p-&g
74、t;top<N-1)</p><p><b> {</b></p><p> p->top+=1;</p><p> p->data[p->top]=a; /*入棧字符為棧頂元素*/</p><p><b> }<
75、;/b></p><p><b> else;</b></p><p><b> }</b></p><p> intPopChar(opStack *p,char *a) /*定義操作符出棧函數(shù)*/</p><p><b&g
76、t; {</b></p><p> if(p->top>=0) /*判定棧不為空*/</p><p><b> {</b></p><p> *a=p->data[p->top];</p><p>
77、 p->top-=1;</p><p><b> }</b></p><p><b> return 1;</b></p><p><b> }</b></p><p> char visitChar(opStack *p)
78、 /*定義操作符棧遍歷函數(shù)*/</p><p><b> {</b></p><p> if(p->top!=-1)</p><p> return p->data[p->top]; /*返回棧頂?shù)闹?/</p>
79、<p> else return 0;</p><p><b> }</b></p><p> intstrLen(char *L) /*計算字符串長度*/</p><p><b> {</b></p><
80、p><b> inti;</b></p><p> for(i=0;L[i]!='\0';i++); /*循環(huán)條件的判定*/</p><p> if(L[0]=='-'||L[0]=='+')</p><p><
81、;b> { </b></p><p><b> i=i-1;</b></p><p><b> }</b></p><p><b> returni;</b></p><p><b> }</b></p>
82、<p> int level(char c) /*符號的優(yōu)先級*/</p><p><b> {</b></p><p><b> switch(c)</b></p><p><b> {</b><
83、/p><p> case '#': return 0;</p><p> case '+':return 1;</p><p> case '-':return 1;</p><p> case '*':return 2;</p><p> case
84、 '/':return 2;</p><p> case '(':return 3;</p><p> default : return -1;</p><p><b> }</b></p><p><b> }</b></p><p>
85、; float Compute(float a,charch,float b) /*數(shù)據(jù)運算*/</p><p><b> {</b></p><p> switch(ch) </p><p><b> {</b></p><p>
86、case '+':return a+b; /*返回加號數(shù)值運算*/</p><p> case '-':return a-b; /*返回減號數(shù)值運算*/</p><p> case '*':return a*
87、b;</p><p> case '/':return a/b; /*返回除號數(shù)值運算*/</p><p> default :return -1;</p><p><b> }</b></p><p><b> }<
88、;/b></p><p> void main()</p><p><b> {</b></p><p> listStack *data; /*定義操作數(shù)棧,由指針data指出*/</p><p> opStack *op;</p&
89、gt;<p> inti; /*對變量進行聲明*/</p><p><b> float n;</b></p><p> floatresult,opA,opB;</p><p> char operand[2],opCh
90、ar; /*定義字符型數(shù)組和字符變量*/</p><p> char array[N];</p><p> char *ptarray=NULL; /*定義字符型指針*/</p><p> printf("Please
91、 enter a data:\t");</p><p> while((scanf("%s",array))!=EOF) /*判斷循環(huán)的條件*/</p><p><b> {</b></p><p> op=InitChar();</p><p> da
92、ta=InitNum();</p><p> PushChar(op,'#');</p><p> array[strLen(array)]='#'; /*將字符#賦予數(shù)組最后*/</p><p> ptarray=array;</p><p>
93、for(i=0;i<strLen(ptarray);i++) /*判定循環(huán)的條件*/</p><p><b> {</b></p><p> if(array[i]>=48&&array[i]<=57||</p><p> array[i]=='.'
94、) /*判斷值*/</p><p><b> {</b></p><p> double weight=0.1;</p><p> int flag=0; /*定義整形變量flag*/</p><p>
95、 float n=0; /*定義浮點型變量*/</p><p> n=array[i]-48;</p><p> while(array[i+1]>=48&&array[i+1]<=57||</p><p> array[i+1]=='.')
96、 /*判定數(shù)值*/</p><p><b> {</b></p><p> if(array[i+1]=='.') </p><p> flag=1;/*讀到小數(shù)點*/</p><p><b> else</b></p>&l
97、t;p><b> {</b></p><p> if(flag==0)n=n*10+array[i+1]-48; /*將整數(shù)部分字符串轉(zhuǎn)化為實數(shù)*/</p><p><b> else</b></p><p><b> {</b></p><p> n=n+(
98、array[i+1]-48)*weight; /*將表示小數(shù)部分的字符也轉(zhuǎn)化過來*/</p><p> weight*=0.1; /*weight為小數(shù)位權(quán)*/</p><p><b> }</b></p><p><b> }</b></p><p><
99、;b> i++;</b></p><p><b> }</b></p><p> PushNum(data,n); /*將數(shù)值進棧*/</p><p><b> }</b></p><p><b> else</
100、b></p><p><b> {</b></p><p> if(array[i]=='#') /*遇見字符#*/</p><p><b> {</b></p><p> while(visitChar(op)!=&
101、#39;#') /*對操作符棧進行遍歷*/</p><p><b> {</b></p><p> PopChar(op,&opChar); /*字符出棧*/</p><p> PopNum(data,&opA);</p><p> PopNum(data,&
102、amp;opB); /*數(shù)出棧*/</p><p> result=Compute(opB,opChar,opA); /*調(diào)用運算函數(shù)*/</p><p> PushNum(data,result);</p><p><b> }</b></p><p><b>
103、}</b></p><p><b> else</b></p><p> { </p><p> if(level(array[i])>level(visitChar(op))||</p><p> visitChar(op)=='(')
104、 /*判斷操作符的優(yōu)先級高低*/</p><p><b> {</b></p><p> PushChar(op,array[i]); /*操作符進棧*/</p><p><b> }</b></p><p><b> else</b></
105、p><p><b> {</b></p><p> if(array[i]==')') /*當操作符為)時*/</p><p><b> {</b></p><p> while(visitChar(op)!='(') /*遍
106、歷操作符棧*/</p><p><b> {</b></p><p> PopChar(op,&opChar);</p><p> PopNum(data,&opA);</p><p> PopNum(data,&opB); /*從數(shù)值棧輸出一個值*/</p>
107、<p> result=Compute(opB,opChar,opA);</p><p> PushNum(data,result); /*結(jié)果放回棧里*/</p><p> } </p><p> PopChar(op,&opChar
108、); /*輸出操作符*/</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> while(level(array[i])<=level(visitChar(op))) /
109、*判斷操作符的優(yōu)先級高低*/</p><p><b> {</b></p><p> PopChar(op,&opChar);</p><p> PopNum(data,&opA); /*從數(shù)值棧輸出數(shù)值*/</p><p> PopNum(data,&opB);</p>
110、;<p> esult=Compute(opB,opChar,opA); /*調(diào)用運算函數(shù)*/</p><p> PushNum(data,result); /*將運算結(jié)果入棧*/</p><p><b> }</b></p><p> PushChar(op,array[i]); /*將操作符入棧*
111、/</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> } </b></p><p><b> }</b>&
112、lt;/p><p> printf("the Result is:%.6f\n\n",result); /*輸出掃描一遍的運算結(jié)果*/</p><p><b> }</b></p><p><b> }</b></p><p><b> 四、運行結(jié)果<
113、/b></p><p> ?。ㄒ唬┲芯Y轉(zhuǎn)后綴算法的運行結(jié)果:</p><p> 圖 3中綴轉(zhuǎn)后綴算法的運行結(jié)果</p><p> (二)直接計算算法的運行結(jié)果:</p><p> 圖 4 直接計算算法的運行結(jié)果</p><p> 五、遇到的問題及解決</p><p> 這部分我主
114、要遇到了如下兩個問題,其內(nèi)容與解決方法如下所列:</p><p><b> 問題1: </b></p><p> 在遇到小數(shù)點處理的問題上,雖然說處理小數(shù)點的方法不是唯一的,但我在處理的時候只能計算一位小數(shù),如果輸入的是兩位的話,計算結(jié)果的時候它就把一位小數(shù)后面的數(shù)據(jù)全丟了。</p><p><b> 解決方法: </b&
115、gt;</p><p> 在輸出后綴表達式的時候可以看到棧里存的數(shù)據(jù)最多只帶一位小數(shù),所以結(jié)果也只能出現(xiàn)一位小數(shù)。因為在處理小數(shù)的時候我是讓小數(shù)點后面的數(shù)乘以0.1,再加上前面的。但如果是兩位的話,那么最后的那一個是要乘以0.01的,也就是乘以0.1的自乘,所以在處理小數(shù)時我加了自乘的這行代碼,運行的結(jié)果才真確的出來了。 </p><p><b> 問題2: </b&g
116、t;</p><p> 無論輸入什么表達式,不知道結(jié)果為什么始終是‘0.00‘,運行還是行的,有的時候程序只是按照掃到最后的一個運算符來執(zhí)行。</p><p><b> 圖 5 運行出錯</b></p><p><b> 解決方法: </b></p><p> 剛開始不知道哪兒出錯了,就瞎找
117、那些有可能會出現(xiàn)錯的地方,比如:能從圖中直接看出來,沒有后綴表達式;計算結(jié)果也是錯誤的;還有可能是哪個函數(shù)調(diào)用時出了錯。隨后就從最簡單的函數(shù)調(diào)用出錯的問題 開始檢查,沒有發(fā)現(xiàn)什么明顯的錯誤,就放棄了這個問題,接著就是計算有沒有出現(xiàn)簡單的錯誤,因為它比較于中綴轉(zhuǎn)后綴要簡單一些,就開始試,單獨的對這一段代碼試,結(jié)果還是沒發(fā)現(xiàn)什么錯誤,最后就剩下最難的中綴轉(zhuǎn)后綴的問題了,如果這個也沒有錯,那就不知道哪兒出錯了,就開始對它調(diào)試,看了兩個小時也沒
118、找出來什么錯誤。以后才找到那兒出了漏洞,原來缺少一句賦值語句“houzhui[j]=n;”就成這樣了,這個錯誤告訴我一點點的小錯誤也能導(dǎo)致整個程序的錯誤。</p><p><b> 六、心得體會</b></p><p> 通過這次的作業(yè)我充分的認識到了自己的不足,特別是對寫程序代碼這方面,一個程序從算法到用程序把它實現(xiàn)出來,這一整個過程是很不容易的,你懂得它的算法
119、,不一定就能寫的出來,通過這次我也深深的了這一點。對于一個新手來說,小的錯誤出現(xiàn)的太多,而且一個小的錯誤就能讓我束手無策,因為想不通錯在哪,所以就一直在亂改,邏輯錯誤就更難了,有時候程序運行語法沒有錯誤,但只要輸入表達式計算結(jié)果時,出來的結(jié)果要不是錯的,要不就不出現(xiàn)結(jié)果,這種錯的原因更難找。感覺難的原因可能就是平時少練習(xí),代碼量也是積累很少的,這樣我們尋找程序的錯誤覺得很難,修改過來就更難了。但是運行的正確結(jié)果出來的時候,覺得有點興奮。
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---用兩種方式實現(xiàn)表達式自動計算
- 用兩種方式實現(xiàn)表達式自動計算
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(表達式計算)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-表達式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---表達式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--表達式求值
- 數(shù)據(jù)結(jié)構(gòu)(表達式求值)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告-表達式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告--表達式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--算術(shù)表達式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--表達式求值問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--算術(shù)表達式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--表達式求值問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---中綴算術(shù)表達式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告(二)表達式求值(計算器)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-表達式類型的實現(xiàn)(難度系數(shù)1.2)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告---算術(shù)表達式求值系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告-中綴算術(shù)表達式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--表達式求值—mfc圖形界面
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計帶括號的算術(shù)表達式求值
評論
0/150
提交評論