2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩26頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論