版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 課程設(shè)計(jì)報(bào)告</b></p><p> 2011年 12月 31日</p><p><b> 目 錄</b></p><p><b> 1.設(shè)計(jì)目的:1</b></p><p><b> 2.設(shè)計(jì)要求:1<
2、/b></p><p><b> 3.設(shè)計(jì)方案:1</b></p><p><b> 4.設(shè)計(jì)內(nèi)容:2</b></p><p> 4.1.需求分析2</p><p> 4.2.概要設(shè)計(jì)2</p><p> 4.3.詳細(xì)設(shè)計(jì)4</p>&
3、lt;p> 4.4.調(diào)試分析與結(jié)果7</p><p> 4.5:使用說明11</p><p><b> 5.總結(jié):12</b></p><p> 6.附錄三:源代碼12</p><p><b> 表達(dá)式求值問題</b></p><p><b>
4、; 1.設(shè)計(jì)目的:</b></p><p> 《數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)》是計(jì)算機(jī)專業(yè)集中實(shí)踐性環(huán)節(jié)之一,是學(xué)習(xí)完《數(shù)據(jù)結(jié)構(gòu)》課程后進(jìn)行的一次全面的綜合練習(xí)。其目的是: </p><p> ?。?)要達(dá)到理論與實(shí)際應(yīng)用相結(jié)合,使學(xué)生能夠根據(jù)數(shù)據(jù)對象的特性,學(xué)會(huì)數(shù)據(jù)組織的方法,能把現(xiàn)實(shí)世界中的實(shí)際問題在計(jì)算機(jī)內(nèi)部表示出來,并培養(yǎng)良好的程序設(shè)計(jì)技能。 </p><p
5、> ?。?)在實(shí)踐中認(rèn)識(shí)為什么要學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu),掌握數(shù)據(jù)結(jié)構(gòu)、程序設(shè)計(jì)語言、程序設(shè)計(jì)技術(shù)之間的關(guān)系,是前面所學(xué)知識(shí)的綜合和回顧。</p><p><b> 2.設(shè)計(jì)要求:</b></p><p> 以字符序列的形式從鍵盤輸入語法正確的、不含變量的整數(shù)(或?qū)崝?shù))表達(dá)式,實(shí)現(xiàn)對算術(shù)四則混合運(yùn)算表達(dá)式的求值。當(dāng)用戶輸入一個(gè)合法的算術(shù)表達(dá)式后,能夠返回正確的結(jié)果。能夠
6、計(jì)算的運(yùn)算符包括:加、減、乘、除、括號(hào),對于異常表達(dá)式能給出錯(cuò)誤提示。</p><p><b> 3.設(shè)計(jì)方案:</b></p><p> 任何一個(gè)表達(dá)式都是由操作符,運(yùn)算符組成的。我們分別用順序棧來寄存表達(dá)式的操作數(shù)和運(yùn)算符。棧是限定于緊僅在表尾進(jìn)行插入或刪除操作的線性表。順序棧的存儲(chǔ)結(jié)構(gòu)是利用一組連續(xù)的存儲(chǔ)單元依次存放自棧底到棧頂?shù)臄?shù)據(jù)元素。</p>
7、;<p> 為了實(shí)現(xiàn)算符優(yōu)先算法。可以使用兩個(gè)棧。一個(gè)稱為OPF,用以寄存運(yùn)算符,另一個(gè)稱做OPS,用以寄存操作數(shù)或運(yùn)算結(jié)果。</p><p> 1.首先置操作數(shù)棧為空棧,表達(dá)式起始符”#”為運(yùn)算符棧的棧底元素;</p><p> 2.依次讀入表達(dá)式,若是操作符即進(jìn)OPS棧,若是運(yùn)算符則和OPF棧的棧頂運(yùn)算符比較優(yōu)先權(quán)后作相應(yīng)的操作,直至整個(gè)表達(dá)式求值完畢(即OPF棧的
8、棧頂元素和當(dāng)前讀入的字符均為”#”)。</p><p><b> 4.設(shè)計(jì)內(nèi)容:</b></p><p><b> 4.1.需求分析</b></p><p> 本程序所做的工作為:能直接求出四則表達(dá)式的值,并輸出;本程序可用于小學(xué)教師對學(xué)生作業(yè)的快速批改以及對數(shù)值位數(shù)要求較大的科學(xué)運(yùn)算。</p><
9、;p><b> 4.2.概要設(shè)計(jì)</b></p><p> 1.//用于存儲(chǔ)操作數(shù)和運(yùn)算結(jié)果(OPS):</p><p> ADT LinkStack{</p><p> 數(shù)據(jù)元素:此鏈棧中的所有元素類型為字符型的數(shù)字字符</p><p> 數(shù)據(jù)關(guān)系:棧中數(shù)據(jù)元素之間是線性關(guān)系。</p>&
10、lt;p><b> 基本操作:</b></p><p> ?。?)InitStack(LinkStack &head)</p><p> 操作結(jié)果:構(gòu)造一個(gè)空棧head</p><p> ?。?)IsEmpty(LinkStack head)</p><p> 初始條件:棧head已存在</p&
11、gt;<p> 操作結(jié)果:若棧為空棧,則返回TRUE,否則FALSE</p><p> ?。?)Push(LinkStack &head,ElementType element)</p><p> 初始條件:棧head已存在</p><p> 操作結(jié)果:插入元素element為新的棧頂元素</p><p> ?。?
12、)Pop(LinkStack &head,ElementType &element)</p><p> 初始條件:棧head已存在且非空</p><p> 操作結(jié)果:刪除head的棧頂元素,并用e返回其值</p><p> ?。?)GetTop(LinkStack head, ElementType &element)</p>
13、<p> 初始條件:棧head已存在并且非空</p><p> 操作結(jié)果:用e返回head的棧頂元素</p><p> ?。?)DestroyStack(LinkStack &head)</p><p> 初始條件:棧head已存在</p><p> 操作結(jié)果:棧head 被銷毀</p><p
14、> }ADT LinkStack</p><p> 2.//用于存儲(chǔ)運(yùn)算符(OPF):</p><p> ADT LinkCharStack{</p><p> 數(shù)據(jù)對象D:元素類型為字符型的符號(hào)字符</p><p><b> 數(shù)據(jù)關(guān)系R:</b></p><p> 基本操作:棧
15、中數(shù)據(jù)元素之間是線性關(guān)系。</p><p> ?。?)CInitStack(LinkCharStack &head) </p><p> 操作結(jié)果:構(gòu)造一個(gè)空棧head</p><p> (2)CIsEmpty(LinkCharStack head)</p><p> 初始條件:棧head已存在</p><p
16、> 操作結(jié)果:若棧為空棧,則返回TRUE,否則FALSE</p><p> ?。?)CPush(LinkCharStack &head,ElementType element)</p><p> 初始條件:棧head已存在</p><p> 操作結(jié)果:插入元素element為新的棧頂元素</p><p> ?。?)CPop
17、(LinkCharStack &head,ElementType &element)</p><p> 初始條件:棧head已存在且非空</p><p> 操作結(jié)果:刪除head的棧頂元素,并用e返回其值</p><p> ?。?)CGetTop(LinkCharStack head, ElementType &element)</
18、p><p> 初始條件:棧head已存在并且非空</p><p> 操作結(jié)果:用e返回head的棧頂元素</p><p> ?。?)CDestroyStack(LinkCharStack &head)</p><p> 初始條件:棧head已存在</p><p> 操作結(jié)果:棧head 被銷毀</p&
19、gt;<p> }ADT LinkCharStack</p><p> 3.系統(tǒng)中子程序及功能要求:</p><p> Comop(char ch):判斷輸入的字符是否為運(yùn)算符</p><p> char Precede(char ch,char c):比較兩個(gè)運(yùn)算符的優(yōu)先級,ch是棧頂字符,c是表達(dá)式字符。</p><p&
20、gt; ElementType Operate(ElementType a,char ch,ElementType b):解析表達(dá)式中的雙目運(yùn)算,其返回的結(jié)果即為雙目運(yùn)算表達(dá)式的值。</p><p> int error(char *str) :錯(cuò)誤提示函數(shù),實(shí)現(xiàn)對多種非法四則表達(dá)式的判斷,并給出提示,讓用戶更正自己的輸入錯(cuò)誤。</p><p> void MenuPrint():
21、主菜單打印函數(shù)。</p><p> void Clear():清屏函數(shù)。</p><p> ElementType EvaluateExpression(char *exp):這是此程序的核心函數(shù),可以綜合其它子函數(shù),實(shí)現(xiàn)最終的表達(dá)式求解。</p><p> 各程序模塊之間的調(diào)用關(guān)系(子程序編號(hào)見上):</p><p> 主函數(shù)可調(diào)用
22、子程序5,6,7。</p><p> 子程序7可調(diào)用子程序1,2,3,4。 </p><p><b> 4.3.詳細(xì)設(shè)計(jì)</b></p><p><b> 此算法的基本思想:</b></p><p> 首先置操作數(shù)棧OPS為空棧,表達(dá)式起始符“#”為運(yùn)算符的棧底元素;依次讀入表達(dá)式中每個(gè)字符
23、,若是操作數(shù)則進(jìn)棧,若是運(yùn)算符則和OPF棧的棧頂運(yùn)算符比較優(yōu)先權(quán)作相應(yīng)操作,直至整個(gè)表達(dá)式求值完畢(即OPF棧的棧頂元素和當(dāng)前讀入的字符均為“#”)</p><p><b> 此算法的偽代碼:</b></p><p> ElementType EvaluateExpression(char *exp)</p><p> { 定義兩個(gè)字符
24、變量c和ch,c代表輸入表達(dá)式中的字符,ch代表?xiàng)m斶\(yùn)算符;</p><p> 定義字符指針 *p,*q,*temp;temp指向運(yùn)算符后面的一個(gè)字符</p><p> double i=0,a=0,b=0;</p><p> 將傳入的實(shí)參賦給p,q;</p><p> 定義一個(gè)運(yùn)算符棧 OPF;</p><p&g
25、t; 定義一個(gè)操作數(shù)棧 OPS;</p><p> 調(diào)用函數(shù)InitStack()初始化棧OPS; </p><p> 調(diào)用函數(shù)CInitCharStack()初始化棧OPF;</p><p> 調(diào)用函數(shù)CPush(OPF,'#')將#壓入運(yùn)算符棧;</p><p> c=*p;temp=p;p++;</p&g
26、t;<p> if(第一個(gè)字符就為‘-’)</p><p><b> {</b></p><p> c=*p;temp=p;p++;</p><p><b> }</b></p><p> while(棧不為空或表達(dá)式?jīng)]有結(jié)束)</p><p> {
27、//進(jìn)入最外層循環(huán)</p><p> if(不是運(yùn)算符)//則解析數(shù)字字符串然后進(jìn)操作數(shù)棧</p><p><b> {</b></p><p><b> 整數(shù)部分m=0;</b></p><p><b> 小數(shù)部分n=0;</b></p><p&g
28、t; while(沒有遇到小數(shù)點(diǎn)并且為數(shù)字字符)</p><p> { 解析整數(shù)部分m }</p><p><b> if(遇到小數(shù)點(diǎn))</b></p><p><b> { 解析小數(shù)部分</b></p><p><b> c=*p;</b></p>
29、<p> 將p指針移到第一個(gè)出現(xiàn)的字符;</p><p> 將q指針指向小數(shù)的最后一位;</p><p> while(p指針不指向’.’)</p><p><b> {</b></p><p> 將p指向的字符轉(zhuǎn)為小數(shù)n</p><p><b> p--;&l
30、t;/b></p><p><b> }</b></p><p><b> p=q;</b></p><p><b> p++;</b></p><p><b> }</b></p><p> if(運(yùn)算符為‘-
31、’并且運(yùn)算符前一個(gè)為‘(’或者為表達(dá)式的開始)</p><p> 調(diào)用Push(OPS,-(m+n))將m+n的相反數(shù)入棧;</p><p><b> else </b></p><p> 調(diào)用Push(OPS,m+n)將m+n入棧;</p><p><b> }數(shù)字進(jìn)棧結(jié)束</b><
32、/p><p> else//是運(yùn)算符時(shí)則進(jìn)棧OPF</p><p> { if(運(yùn)算符為‘-’&&運(yùn)算符前一個(gè)為‘(’)</p><p><b> { c=*p;</b></p><p><b> temp=p;</b></p><p><b>
33、; p++;</b></p><p><b> }</b></p><p><b> else</b></p><p> { 調(diào)用函數(shù)CGetTop(OPF,ch)得到OPF的棧頂元素;</p><p> switch(調(diào)用函數(shù)Precede(ch,c)判斷棧頂元素與接收的字符
34、的優(yōu)生級別)</p><p><b> {</b></p><p> case 棧頂運(yùn)算符優(yōu)先權(quán)低:</p><p> 調(diào)用函數(shù)CPush(OPF,c)將c入運(yùn)算符棧;</p><p><b> 接收下一個(gè)字符;</b></p><p> case 棧頂運(yùn)算符優(yōu)先權(quán)
35、高:</p><p> 運(yùn)算符出棧得到ch;</p><p> 數(shù)字棧連續(xù)出棧兩次得到a,b ;</p><p> 調(diào)用Operate(a,ch,b)并將結(jié)果入棧到數(shù)字棧;break;</p><p> case 優(yōu)生權(quán)相等:脫括號(hào)并接收下一個(gè)字符;</p><p> 調(diào)用CPop(OPF,ch)脫括號(hào);接收
36、下一個(gè)字符;</p><p> default:接收下一個(gè)字符;</p><p> }退出switch循環(huán)</p><p><b> }//else1</b></p><p><b> }//else2</b></p><p> }//退出最外層while循環(huán)<
37、;/p><p> 調(diào)用函數(shù)GetTop(OPS,i)得到棧頂元素i;</p><p><b> 將兩個(gè)棧消毀;</b></p><p> }EvaluateExpression函數(shù)結(jié)束</p><p> 利用該算法對算術(shù)表達(dá)式3*(7-2)求值操作過程如下:</p><p><b>
38、 表一</b></p><p> 4.4.調(diào)試分析與結(jié)果</p><p><b> 附錄一:測試數(shù)據(jù)</b></p><p><b> 表二</b></p><p> 按照附錄中的測試數(shù)據(jù),得出如下測試、分析結(jié)果:</p><p> 當(dāng)我們輸入表格中兩
39、個(gè)正確的四則表達(dá)式時(shí)程序能準(zhǔn)確地求得其值:</p><p> 完全支持浮點(diǎn)數(shù),正負(fù)數(shù)的運(yùn)算;</p><p> 而當(dāng)我們輸入第五組錯(cuò)誤的表達(dá)式時(shí),程序能做出正確判斷,提醒用戶輸入的表達(dá)式錯(cuò)誤。</p><p> 其數(shù)據(jù)測試的情況見截圖:</p><p><b> 表達(dá)式一運(yùn)算結(jié)果</b></p>&
40、lt;p><b> 表達(dá)式二運(yùn)行結(jié)果</b></p><p><b> 表達(dá)式三運(yùn)行結(jié)果</b></p><p><b> 表達(dá)式四運(yùn)行結(jié)果</b></p><p> 由表二可知以上四組表達(dá)式運(yùn)行結(jié)果皆正確。</p><p><b> 表達(dá)式五運(yùn)行結(jié)果
41、</b></p><p> 由表二可知第五組表達(dá)式錯(cuò)誤。</p><p> 附錄二:部分錯(cuò)誤表達(dá)式</p><p><b> 表三</b></p><p><b> 4.5:使用說明</b></p><p> 運(yùn)行程序,首先出現(xiàn)主菜單。主菜單包括三個(gè)選項(xiàng)
42、:選項(xiàng)a:表達(dá)式求解,選擇該項(xiàng)可進(jìn)行四則表達(dá)式的求解;選項(xiàng)b:清屏;選項(xiàng)c:退出程序,選擇該項(xiàng)將退出程序。</p><p><b> 5.總結(jié):</b></p><p> 這次課程設(shè)計(jì)讓我更加了解了學(xué)到的C語言和數(shù)據(jù)結(jié)構(gòu)。課程設(shè)計(jì)不僅要求對課本知識(shí)有較深刻的了解,同時(shí)要求程序設(shè)計(jì)者有較強(qiáng)的思維和動(dòng)手能力同時(shí)這也使我更加了解編程思想和編程技巧。</p>
43、<p> 這次課程設(shè)計(jì)讓我有一個(gè)深刻的體會(huì),那就是細(xì)節(jié)決定成敗,編程最需要的是嚴(yán)謹(jǐn),如何的嚴(yán)謹(jǐn)都不過分,往往檢查了半天發(fā)現(xiàn)錯(cuò)誤發(fā)生在某個(gè)括號(hào),分號(hào),引號(hào),或者數(shù)據(jù)類型上。就像我在寫EvaluateExpression()函數(shù)時(shí),忘了指針的地址符值不用加*,這一點(diǎn)小小的錯(cuò)誤也耽誤了我?guī)资昼?,所以說細(xì)節(jié)很重要。</p><p> 程序設(shè)計(jì)時(shí),也不要怕遇到錯(cuò)誤,在實(shí)際操作過程中犯的一些錯(cuò)誤還會(huì)有意外的
44、收獲,感覺課程設(shè)計(jì)很有意思。在具體操作中這學(xué)期所學(xué)的數(shù)據(jù)結(jié)構(gòu)的理論知識(shí)得到鞏固,達(dá)到課程設(shè)計(jì)的基本目的,也發(fā)現(xiàn)自己的不足之出,在以后的上機(jī)中應(yīng)更加注意。</p><p><b> 6.附錄三:源代碼</b></p><p> //這個(gè)棧是用來存儲(chǔ)數(shù)字字符的</p><p> #include<stdlib.h></p&g
45、t;<p> # include <stdio.h></p><p> # include <string.h></p><p> #define ERROR 0</p><p> #define OK 1</p><p> #defineTRUE 1</p><p>
46、 #define FALSE 0</p><p> typedef char ElemType;</p><p> typedef int Status;</p><p> typedef double ElementType;</p><p> typedef int Status;</p><p> #
47、 define STACK_INIT_SIZE 30</p><p> # define STACKINCREAMENT 10</p><p> # define NUMBER 30</p><p> typedef struct node{</p><p> ElementType data;</p><p>
48、; struct node *next;</p><p> }StackNode, *LinkStack;</p><p> void InitStack(LinkStack &head){</p><p> head=(LinkStack)malloc(sizeof(StackNode)); </p><p> head-
49、>next=NULL;</p><p><b> }</b></p><p> Status IsEmpty(LinkStack head){</p><p> if(head->next==NULL)return TRUE;</p><p> else return ERROR;</p>
50、<p><b> }</b></p><p> Status Push(LinkStack &head,ElementType element){//入棧</p><p> LinkStack p;</p><p> p=(LinkStack)malloc(sizeof(StackNode));</p>
51、<p> if(p== NULL) return FALSE;</p><p> p->data=element;</p><p> p->next=head->next;</p><p> head->next=p;</p><p> return OK;</p><p&g
52、t;<b> }</b></p><p> Status Pop(LinkStack &head,ElementType &element){//出棧</p><p> if(IsEmpty(head))return FALSE;</p><p> LinkStack temp=head->next;</p&
53、gt;<p> element=temp->data;</p><p> head->next=temp->next;</p><p> free(temp);</p><p> return OK;</p><p><b> }</b></p><p>
54、 Status GetTop(LinkStack head, ElementType &element){</p><p> if(head->next==NULL)</p><p> return ERROR;</p><p> element =head->next->data;</p><p> re
55、turn OK;</p><p><b> }</b></p><p> Status DestroyStack(LinkStack &head)</p><p><b> {</b></p><p> LinkStack q;</p><p> while
56、(head)</p><p><b> {</b></p><p> q=head->next;</p><p> free(head);</p><p><b> head=q;</b></p><p><b> }</b></p
57、><p> return TRUE;</p><p><b> }</b></p><p> //這個(gè)棧是用來存儲(chǔ)符號(hào)字符的</p><p> typedef struct node1{</p><p> ElemType data;</p><p> struct
58、 node1 *next;</p><p> }StackCharNode,*LinkCharStack;</p><p> void CInitCharStack(LinkCharStack &head){</p><p> head=(LinkCharStack)malloc(sizeof(StackCharNode));</p>&
59、lt;p> head->next=NULL;</p><p><b> }</b></p><p> Status CIsEmpty(LinkCharStack head){</p><p> return (head->next==NULL)?TRUE:FALSE;</p><p><b
60、> }</b></p><p> Status CPush(LinkCharStack &head,ElemType element){</p><p> LinkCharStack temp=(LinkCharStack)malloc(sizeof(StackCharNode));</p><p> if(!temp)return
61、 ERROR;</p><p> temp->data=element;</p><p> temp->next=head->next;</p><p> head->next=temp;</p><p> return TRUE;</p><p><b> }</b&
62、gt;</p><p> Status CPop(LinkCharStack &head,ElemType &element){</p><p> if(CIsEmpty(head))return FALSE;</p><p> StackCharNode *temp=head->next;</p><p> e
63、lement=temp->data;</p><p> head->next=temp->next;</p><p> free(temp);</p><p> return TRUE;</p><p><b> }</b></p><p> Status CGetTo
64、p(LinkCharStack head,ElemType &element){</p><p> if(head->next!=NULL)</p><p><b> {</b></p><p> element=head->next->data;</p><p> return TRU
65、E;</p><p><b> }</b></p><p> element='#';</p><p> return FALSE;</p><p><b> }</b></p><p> Status CDestroyStack(LinkCharS
66、tack &head){</p><p> LinkCharStack q;</p><p> while(head)</p><p><b> {</b></p><p> q=head->next;</p><p> free(head);</p><
67、;p><b> head=q;</b></p><p><b> }</b></p><p> return TRUE;</p><p><b> }</b></p><p> //判斷ch是否為運(yùn)算符</p><p> int Com
68、op(char ch)</p><p><b> {</b></p><p> switch(ch)</p><p><b> {</b></p><p><b> case '+':</b></p><p><b>
69、 case '-':</b></p><p><b> case '*':</b></p><p><b> case '/':</b></p><p><b> case '(':</b></p><
70、;p><b> case ')':</b></p><p><b> case '[':</b></p><p><b> case ']':</b></p><p><b> case '{':</b>
71、;</p><p><b> case '}':</b></p><p> case '#':return 1;</p><p> default:return 0;</p><p><b> }</b></p><p><b&g
72、t; }//Comop</b></p><p> //比較兩個(gè)運(yùn)算符的優(yōu)先級</p><p> char Precede(char ch,char c)//ch是棧頂字符,c 是表達(dá)式字符</p><p><b> {</b></p><p> switch(ch)</p><p
73、><b> {</b></p><p><b> case '+':</b></p><p><b> case '-':</b></p><p> if(c=='+'||c=='-'||c==')'||c=
74、='#'||c==')'||c==']'||c=='}')return '>';</p><p> if(c=='*'||c=='/'||c=='('||c=='['||c=='{')return '<';</p>
75、<p><b> case '*':</b></p><p><b> case '/':</b></p><p> if(c=='+'||c=='-'||c=='*'||c=='/'||c==')'||c==
76、9;]'||c=='}'||c=='#')return '>';</p><p> if(c=='('||c=='['||c=='{')return '<';</p><p><b> case '(':</b><
77、;/p><p> if(c=='+'||c=='-'||c=='*'||c=='/')return '<';</p><p> if(c==')')return '=';</p><p><b> case ')':<
78、;/b></p><p> if(c=='+'||c=='-'||c=='*'||c=='/'||c==']')return '>';</p><p> if(c=='#')return '>';</p><p>&l
79、t;b> case'[':</b></p><p> if(c=='+'||c=='-'||c=='*'||c=='/'||c=='(')return '<';</p><p> if(c==']')return '='
80、;;</p><p><b> case']':</b></p><p> if(c=='+'||c=='-'||c=='*'||c=='/'||c=='}')return '>';</p><p> if(c=='
81、;#')return '>';</p><p><b> case'{':</b></p><p> if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c=='[')return '
82、;<';</p><p> if(c=='}')return '=';</p><p><b> case'}':</b></p><p> if(c=='+'||c=='-'||c=='*'||c=='/')re
83、turn '>';</p><p> if(c=='#')return '>';</p><p><b> case '#':</b></p><p> if(c=='+'||c=='-'||c=='*'||c==&
84、#39;/'||c=='('||c=='['||c=='{')return '<';</p><p> if(c=='#')return '=';</p><p><b> default:</b></p><p> return
85、 '$';</p><p><b> }</b></p><p> }//precede</p><p><b> //運(yùn)算函數(shù)</b></p><p> ElementType Operate(ElementType a,char ch,ElementType b)<
86、/p><p><b> {</b></p><p> switch(ch)</p><p><b> {</b></p><p> case '+':return a+b;</p><p> case '-':return a-b;<
87、;/p><p> case '*':return a*b;</p><p><b> case '/':</b></p><p><b> if(b==0)</b></p><p><b> {</b></p><p>
88、; return -32767;</p><p><b> }</b></p><p> return a/b;</p><p><b> default:</b></p><p> return -32767;</p><p><b> }</b
89、></p><p> }//Operate</p><p><b> //錯(cuò)誤提示函數(shù)</b></p><p> int error(char *str) </p><p><b> {int i=0;</b></p><p> while(str[i]!=
90、'#') //主要通過判斷所有輸入的字符數(shù)組str[30]</p><p><b> {</b></p><p><b> if( (</b></p><p> (str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]
91、=='/'||str[i]=='.') </p><p> && //其它函數(shù)只要一聲明err=1也就說明輸入有誤</p><p> (str[i+1]==')'||str[i+1]==']'||str[i+1]=='}')</p><p><b
92、> )</b></p><p><b> ||(</b></p><p> (str[i]=='+'||str[i]=='*'||str[i]=='/'||str[i]=='.')</p><p><b> &&</b>
93、;</p><p> (str[i-1]=='('||str[i-1]=='['||str[i-1]=='{')</p><p><b> )</b></p><p><b> ||(</b></p><p> (str[i]==')&
94、#39; || str[i]==']'||str[i]=='}')&& str[i+1]=='.'</p><p><b> )</b></p><p><b> ||(</b></p><p> str[i]=='.' &&am
95、p;( str[i+1]=='('||str[i+1]=='['||str[i+1]=='{')</p><p><b> )</b></p><p> ||(str[i]==')' && str[i+1]=='(')</p><p> ||(
96、str[i]=='(' && str[i+1]==')')</p><p> ||(str[i]=='[' && str[i+1]==']')</p><p> ||(str[i]==']' && str[i+1]=='[')</p>
97、;<p> ||(str[i]=='{' && str[i+1]=='}')</p><p> ||(str[i]=='}' && str[i+1]=='{')</p><p><b> ||(</b></p><p> (st
98、r[i]==')'||str[i]==']'||str[i]=='}') && str[i+1]>='0'&&str[i+1]<='9'</p><p><b> )</b></p><p><b> ||(</b>&l
99、t;/p><p> (str[i]>='0'&&str[i]<='9'&& (str[i+1]=='('||str[i+1]=='['||str[i+1]=='{')</p><p><b> )</b></p><p>
100、 ||(str[0]=='+'||str[0]=='*'||str[0]=='/'||str[0]==')'||str[0]==']'||str[0]=='}') </p><p><b> ||(</b></p>&
101、lt;p> (str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/'||str[i]=='.') </p><p><b> &&</b></p><p> (str[i+1]=='+'||str[
102、i+1]=='-'||str[i+1]=='*'||str[i+1]=='/'||str[i+1]=='.')</p><p><b> )</b></p><p> ||(int(str[i])>57&&(int(str[i])!=91 && int(str[i
103、])!=93 && int(str[i])!=123 && int(str[i])!=125))</p><p> ||(str[i]=='/' && str[i+1]=='0')</p><p> ||(int(str[i])>31 && int(str[i])<38)<
104、/p><p><b> )</b></p><p><b> )</b></p><p><b> return 1;</b></p><p> else if(str[i]=='#')return 0;</p><p><b&
105、gt; i++;</b></p><p><b> }//while</b></p><p><b> return 0;</b></p><p><b> }//錯(cuò)誤提示函數(shù)</b></p><p><b> //表達(dá)式計(jì)算函數(shù)</b&g
106、t;</p><p> ElementType EvaluateExpression(char *exp){</p><p> char c,ch; //c代表輸入表達(dá)式中的字符,ch代表?xiàng)m斶\(yùn)算符</p><p> char *p,*q,*temp;//temp指向運(yùn)算符后面的一個(gè)字符</p><p> double i=
107、0,a=0,b=0;</p><p><b> p=q=exp;</b></p><p> LinkCharStack OPF;//運(yùn)算符棧</p><p> LinkStack OPS;//操作數(shù)棧</p><p> CInitCharStack(OPF);CPush(OPF,'#');<
108、/p><p> InitStack(OPS);</p><p> c=*p;temp=p;p++;</p><p> if(c=='-')</p><p><b> {</b></p><p> c=*p;temp=p;p++;</p><p><
109、;b> }</b></p><p> while(c!='#'||!CIsEmpty(OPF)) //棧不為空或表達(dá)式?jīng)]有結(jié)束</p><p> {//*********************進(jìn)入最外層循環(huán)*********************</p><p> if(!Comop(c))//不是運(yùn)算符則解析數(shù)字字
110、符串然后進(jìn)操作數(shù)棧</p><p><b> {</b></p><p> double m=0,n=0;</p><p> while(c!='.'&&c>='0'&&c<='9')</p><p><b>
111、{//解析整數(shù)部分</b></p><p> m=m*10+(c-48);</p><p><b> c=*p;</b></p><p><b> p++;</b></p><p><b> }</b></p><p> if(c=
112、='.')</p><p><b> {//解析小數(shù)部分</b></p><p><b> c=*p;</b></p><p> while(c>='0'&&c<='9')</p><p> {p++;c=*p;}&
113、lt;/p><p><b> q=p;</b></p><p><b> p--;</b></p><p> while(*p!='.')</p><p><b> {</b></p><p> n=n/10+(*p-48)/10.
114、0;</p><p><b> p--;</b></p><p><b> }</b></p><p><b> p=q;</b></p><p><b> p++;</b></p><p><b> }&l
115、t;/b></p><p> if(*(temp-2)=='('&&*(temp-1)=='-'||temp-1==exp)</p><p> Push(OPS,-(m+n));</p><p><b> else </b></p><p> Push(OPS
116、,m+n);</p><p> }//*****數(shù)字進(jìn)棧結(jié)束******</p><p> else//是運(yùn)算符時(shí)則進(jìn)棧OPF</p><p><b> {</b></p><p> if(c=='-'&&*(p-2)=='(')</p><p&
117、gt;<b> {</b></p><p><b> c=*p;</b></p><p><b> temp=p;</b></p><p><b> p++;</b></p><p><b> }</b></p>
118、<p> else//else1</p><p><b> {</b></p><p> CGetTop(OPF,ch);</p><p> switch(Precede(ch,c))</p><p><b> {</b></p><p> case
119、 '<'://棧頂運(yùn)算符優(yōu)先權(quán)低</p><p> CPush(OPF,c);c=*p;temp=p;p++;break;</p><p> case '>'://棧頂運(yùn)算符優(yōu)先權(quán)高</p><p> CPop(OPF,ch);</p><p> Pop(OPS,b);Pop(OPS,a);
120、</p><p> Push(OPS,Operate(a,ch,b));break;</p><p> case '='://脫括號(hào)并接收下一個(gè)字符</p><p> CPop(OPF,ch);c=*p;temp=p;p++;break;</p><p><b> default:</b><
121、/p><p> c=*p;temp=p;p++;</p><p><b> }//switch</b></p><p><b> }//else1</b></p><p><b> }//else2</b></p><p> }//退出最外層循環(huán)&
122、lt;/p><p> GetTop(OPS,i);</p><p> DestroyStack(OPS);</p><p> CDestroyStack(OPF);</p><p><b> return i;</b></p><p> }//EvaluateExpression函數(shù)結(jié)束&l
123、t;/p><p><b> //菜單函數(shù)</b></p><p> void MenuPrint()</p><p><b> {</b></p><p> printf("\t\t┌─────────┐\n");</p><p> printf(&
124、quot;\t\t│多功能計(jì)算器 │\n");</p><p> printf("\t\t├(a)表達(dá)式求解│\n");</p><p> printf("\t\t├(b)清屏 │\n");</p><p> printf("\t\t├(c)退出 │\n");</p
125、><p> printf("\t\t└─────────┘\n");</p><p><b> } //菜單函數(shù)</b></p><p><b> //清屏函數(shù)</b></p><p> void Clear()</p><p> { system
126、("cls");</p><p> MenuPrint();</p><p><b> }//清屏函數(shù)</b></p><p><b> //main主函數(shù)</b></p><p> void main()</p><p><b> {
127、</b></p><p> double result=0;</p><p> char exp[NUMBER],c;</p><p> freopen("DS1.in", "r", stdin);</p><p> freopen("DS1.out", &quo
128、t;w", stdout);</p><p><b> Clear();</b></p><p> printf("\t\t請輸入你要進(jìn)行的操作:\n");</p><p><b> while(1)</b></p><p><b> {</b&
129、gt;</p><p> scanf("%c",&c);</p><p><b> switch(c)</b></p><p> { case 'a':</p><p><b> Clear();</b></p><p>
130、<b> sr:</b></p><p> printf("輸入要計(jì)算的表達(dá)式,以##結(jié)束\n");</p><p> scanf("%s",exp);</p><p> if(!error(exp))</p><p> { result=EvaluateExpres
131、sion(exp);</p><p> printf("計(jì)算結(jié)果為:%lf\n",result);</p><p> printf("請根據(jù)屏幕提示選擇要進(jìn)行的操作:\n");</p><p> scanf("%d",&c);</p><p><b> br
132、eak;</b></p><p><b> }</b></p><p> else if(error(exp)) </p><p> {printf("您輸入的表達(dá)式有誤!");</p><p><b> goto sr;</b></p><
133、;p><b> }</b></p><p> case 'b':Clear();</p><p> printf("\t\t請輸入你要進(jìn)行的操作:");</p><p> scanf("%d",&c);break;</p><p><b&
134、gt; break;</b></p><p> case 'c':system("cls");exit(1);</p><p> default:printf("輸入有誤!");</p><p><b> }//switch</b></p><
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)(表達(dá)式求值)課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告-表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告--表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--算術(shù)表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--表達(dá)式求值問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--算術(shù)表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--表達(dá)式求值問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---中綴算術(shù)表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告---算術(shù)表達(dá)式求值系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告-中綴算術(shù)表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--表達(dá)式求值—mfc圖形界面
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)帶括號(hào)的算術(shù)表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告(二)表達(dá)式求值(計(jì)算器)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)(表達(dá)式計(jì)算)
- 算術(shù)表達(dá)式求值課程設(shè)計(jì)
- (鹽城工學(xué)院數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì))棧的應(yīng)用表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告(逆波蘭表達(dá)式求值)
- 算術(shù)表達(dá)式求值演示-課程設(shè)計(jì)報(bào)告
評論
0/150
提交評論