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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、<p><b>  課程設(shè)計報告</b></p><p>  課程名稱: </p><p>  設(shè)計題目: </p><p>  系 別: </p>

2、<p>  專 業(yè): </p><p>  組 別: </p><p>  學(xué)生姓名: </p><p>  起止日期: 年 月 日 ~

3、年 月 日 </p><p>  指導(dǎo)教師: </p><p>  《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計報告</p><p>  題目:實現(xiàn)對算術(shù)四則混合運算表達式的求值以及大整數(shù)計算</p><p><b>  一.設(shè)計目的</b></p>&l

4、t;p>  數(shù)據(jù)結(jié)構(gòu)是計算機專業(yè)的核心課程,是一門實踐性很強的課程。課程設(shè)計是加強學(xué)生實踐能力的一個強有力手段,要求學(xué)生掌握數(shù)據(jù)結(jié)構(gòu)的應(yīng)用、算法的編寫、類C語言的算法轉(zhuǎn)換成C程序并上機調(diào)試的基本方法,還要求學(xué)生在完成程序設(shè)計的同時能夠?qū)懗霰容^規(guī)范的設(shè)計報告。嚴(yán)格實施課程設(shè)計這一環(huán)節(jié),對于學(xué)生基本程序設(shè)計素養(yǎng)的培養(yǎng)和軟件工作者工作作風(fēng)的訓(xùn)練,將起到顯著的促進作用。</p><p><b>  二.問

5、題描述</b></p><p>  當(dāng)用戶輸入一個合法的算術(shù)表達式后,能夠返回正確的結(jié)果。能夠計算的運算符包括:加、減、乘、除、括號;能夠計算的操作數(shù)要求在實數(shù)范圍內(nèi);對于異常表達式能給出錯誤提示。</p><p>  求兩個不超過200位的非負整數(shù)的和,積和商。</p><p><b>  三.調(diào)試與操作說明</b></p&

6、gt;<p><b> ?。ㄒ唬┬枨蠓治?lt;/b></p><p>  本程序所做的工作為:能直接求出四則表達式的值,并輸出;可以解決因數(shù)值位數(shù)太大unsigned類型都無法表示的大數(shù)之間的運算。本程序可用于小學(xué)教師對學(xué)生作業(yè)的快速批改以及對數(shù)值位數(shù)要求較大的科學(xué)運算。</p><p><b>  此程序規(guī)定:</b></p&g

7、t;<p>  1.程序的主要功能包括兩部分:表達式求解和大整數(shù)的運算。</p><p>  2.表達式求解中輸入的必需為一個正確的四則表達式,可以是整型也可以為浮點型,比如:3*(7-2)+5和3.154*(12+18)-23。大整數(shù)的運算中根據(jù)提示要輸入兩行數(shù)據(jù)位數(shù)不能大于200位。</p><p>  3.程序的輸出:表達式求解中為一浮點型數(shù)據(jù),大整數(shù)運算中輸出的即為運

8、算之后的結(jié)果,結(jié)果里不能有多余的前導(dǎo)0。</p><p><b> ?。ǘ?概要設(shè)計</b></p><p>  1.ADT LinkStack{</p><p>  數(shù)據(jù)元素:此鏈棧中的所有元素類型為字符型的數(shù)字字符</p><p>  數(shù)據(jù)關(guān)系:棧中數(shù)據(jù)元素之間是線性關(guān)系。</p><p>

9、<b>  基本操作:</b></p><p>  InitStack(LinkStack &head)</p><p>  操作結(jié)果:構(gòu)造一個空棧head</p><p>  IsEmpty(LinkStack head)</p><p>  初始條件:棧head已存在</p><p>

10、  操作結(jié)果:若棧為空棧,則返回TRUE,否則FALSE</p><p>  Push(LinkStack &head,ElementType element)</p><p>  初始條件:棧head已存在</p><p>  操作結(jié)果:插入元素element為新的棧頂元素</p><p>  Pop(LinkStack &

11、head,ElementType &element)</p><p>  初始條件:棧head已存在且非空</p><p>  操作結(jié)果:刪除head的棧頂元素,并用e返回其值</p><p>  GetTop(LinkStack head, ElementType &element)</p><p>  初始條件:棧head

12、已存在并且非空</p><p>  操作結(jié)果:用e返回head的棧頂元素</p><p>  DestroyStack(LinkStack &head)</p><p>  初始條件:棧head已存在</p><p>  操作結(jié)果:棧head 被銷毀</p><p>  }ADT LinkStack</p

13、><p>  2.ADT LinkCharStack{</p><p>  數(shù)據(jù)對象D:元素類型為字符型的符號字符</p><p><b>  數(shù)據(jù)關(guān)系R:</b></p><p>  基本操作:棧中數(shù)據(jù)元素之間是線性關(guān)系。</p><p>  CInitStack(LinkCharStack &am

14、p;head)</p><p>  CIsEmpty(LinkCharStack head)</p><p>  CPush(LinkCharStack &head,ElementType element)</p><p>  CPop(LinkCharStack &head,ElementType &element)</p>

15、<p>  CGetTop(LinkCharStack head, ElementType &element)</p><p>  CDestroyStack(LinkCharStack &head)</p><p>  }ADT LinkCharStack</p><p>  系統(tǒng)中子程序及功能要求:</p><p&g

16、t;  add():計算兩個不大于200位的大整數(shù)的和,此文件包含于頭文件calculator.h中。</p><p>  multiply():實現(xiàn)兩個大整數(shù)的積的運算,此文件也包含于頭證件calculator.h中。</p><p>  Comop(char ch):判斷輸入的字符是否為運算符</p><p>  char Precede(char ch,cha

17、r c):比較兩個運算符的優(yōu)先級,ch是棧頂字符,c是表達式字符。</p><p>  ElementType Operate(ElementType a,char ch,ElementType b):解析表達式中的雙目運算,其返回的結(jié)果即為雙目運算表達式的值。</p><p>  int error(char *str) :錯誤提示函數(shù),實現(xiàn)對多種非法四則表達式的判斷,并給出提示,讓用

18、戶更正自己的輸入錯誤。</p><p>  void MenuPrint():主菜單打印函數(shù)。</p><p>  void submenu():大整數(shù)運算功能模塊的子菜單。</p><p>  void Clear():清屏函數(shù)。</p><p>  ElementType EvaluateExpression(char *exp):這是此

19、程序的核心函數(shù),可以綜合其它子函數(shù),實現(xiàn)最終的表達式求解。</p><p>  各程序模塊之間的調(diào)用關(guān)系(子程序編號見上):</p><p>  主函數(shù)可調(diào)用子程序1,2,7,8,9,10。</p><p>  子程序10可調(diào)用子程序3,4,5,6。</p><p><b>  3.詳細設(shè)計</b></p>

20、<p>  表達式計算核心算法的思想及偽代碼:</p><p><b>  此算法的基本思想:</b></p><p>  首先置操作數(shù)棧OPND為空棧,表達式起始符“#”為運算符的棧底元素;依次讀入表達式中每個字符,若是操作數(shù)則進棧,若是運算符則和OPTR棧的棧頂運算符比較優(yōu)先權(quán)作相應(yīng)操作,直至整個表達式求值完畢(即OPTR棧的棧頂元素和當(dāng)前讀入的字符均

21、為“#”)</p><p><b>  此算法的偽代碼:</b></p><p>  ElementType EvaluateExpression(char *exp){</p><p>  定義兩個字符變量c和ch,c代表輸入表達式中的字符,ch代表棧頂運算符;</p><p>  定義字符指針 *p,*q,*temp

22、;temp指向運算符后面的一個字符</p><p>  double i=0,a=0,b=0;</p><p>  將傳入的實參賦給p,q;</p><p>  定義一個運算符棧 OPTR;</p><p>  定義一個操作數(shù)棧 OPND;</p><p>  調(diào)用函數(shù)InitStack()初始化棧OPND; <

23、/p><p>  調(diào)用函數(shù)InitCharStack()初始化棧OPNR ;</p><p>  調(diào)用函數(shù)CPush(OPTR,'#')將#壓入運算符棧;</p><p>  c=*p;temp=p;p++;</p><p>  if(第一個字符就為‘-’)</p><p><b>  {<

24、/b></p><p>  c=*p;temp=p;p++;</p><p><b>  }</b></p><p>  while(棧不為空或表達式?jīng)]有結(jié)束)</p><p>  {//進入最外層循環(huán)</p><p>  if(不是運算符)//則解析數(shù)字字符串然后進操作數(shù)棧</p&g

25、t;<p><b>  {</b></p><p><b>  整數(shù)部分m=0;</b></p><p><b>  小數(shù)部分n=0;</b></p><p>  while(沒有遇到小數(shù)點并且為數(shù)字字符)</p><p>  { 解析整數(shù)部分m }</

26、p><p><b>  if(遇到小數(shù)點)</b></p><p><b>  { 解析小數(shù)部分</b></p><p><b>  c=*p;</b></p><p>  將p指針移到第一個出現(xiàn)的字符;</p><p>  將q指針指向小數(shù)的最后一位;&

27、lt;/p><p>  while(p指針不指向’.’)</p><p><b>  {</b></p><p>  將p指向的字符轉(zhuǎn)為小數(shù)n</p><p><b>  p--;</b></p><p><b>  }</b></p><

28、;p><b>  p=q;</b></p><p><b>  p++;</b></p><p><b>  }</b></p><p>  if(運算符為‘-’并且運算符前一個為‘(’或者為表達式的開始)</p><p>  調(diào)用Push(OPND,-(m+n))將

29、m+n的相反數(shù)入棧;</p><p><b>  else </b></p><p>  調(diào)用Push(OPND,m+n)將m+n入棧;</p><p><b>  }數(shù)字進棧結(jié)束</b></p><p>  else//是運算符時則進棧OPTR</p><p><b&

30、gt;  {</b></p><p>  if(運算符為‘-’&&運算符前一個為‘(’)</p><p><b>  {</b></p><p><b>  c=*p;</b></p><p><b>  temp=p;</b></p>

31、<p><b>  p++;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  調(diào)用函數(shù)CGetTop(OPTR,ch)得到OPTR的棧頂元

32、素;</p><p>  switch(調(diào)用函數(shù)Precede(ch,c)判斷棧頂元素與接收的字符的優(yōu)生級別)</p><p><b>  {</b></p><p>  case 棧頂運算符優(yōu)先權(quán)低:</p><p>  調(diào)用函數(shù)CPush(OPTR,c)將c入運算符棧;</p><p><

33、;b>  接收下一個字符;</b></p><p>  case 棧頂運算符優(yōu)先權(quán)高:</p><p>  運算符出棧得到ch;</p><p>  數(shù)字棧連續(xù)出棧兩次得到a,b ;</p><p>  調(diào)用Operate(a,ch,b)并將結(jié)果入棧到數(shù)字棧;break;</p><p>  case

34、 優(yōu)生權(quán)相等:脫括號并接收下一個字符;</p><p>  調(diào)用CPop(OPTR,ch)脫括號;</p><p><b>  接收下一個字符;</b></p><p><b>  default:</b></p><p><b>  接收下一個字符;</b></p>

35、;<p>  }退出switch循環(huán)</p><p><b>  }//else1</b></p><p><b>  }//else2</b></p><p>  }//退出最外層while循環(huán)</p><p>  調(diào)用函數(shù)GetTop(OPND,i)得到棧頂元素i;</p&g

36、t;<p><b>  將兩個棧消毀;</b></p><p><b>  返回I;</b></p><p>  }EvaluateExpression函數(shù)結(jié)束</p><p>  實現(xiàn)大整數(shù)相加的add()函數(shù)的偽代碼:</p><p>  void add()</p>

37、<p><b>  {</b></p><p>  輸入兩個要運算的大整數(shù)分別存在長度為MAX_LEN+10的</p><p>  字符串?dāng)?shù)組szline1和szline2中;</p><p>  循環(huán)計數(shù)變量 i,j;</p><p>  調(diào)用庫函數(shù)memeset()將地址an1開始的sizeof(an1

38、)字節(jié)內(nèi)容置成0;</p><p>  調(diào)用庫函數(shù)memeset()將地址an2開始的sizeof(an2)字節(jié)內(nèi)容置成0;</p><p>  將szline1中存儲的字符串形式的整數(shù)轉(zhuǎn)換到an1中去</p><p>  將szline1中存儲的字符串形式的整數(shù)轉(zhuǎn)換到an1中去</p><p>  for(i=0;i<最大的長度;i+

39、+)</p><p><b>  {</b></p><p>  an1[i]+=an2[i];</p><p>  如果(得到結(jié)果大于10)</p><p><b>  {</b></p><p>  原位an1[i]-=10;</p><p>  

40、高位an1[i+1]++即進位;</p><p><b>  }</b></p><p><b>  }</b></p><p>  //下面是無前導(dǎo)0地輸出計算的結(jié)果; </p><p>  for(i=最大長度;i>=0;i--)</p><p><b>

41、  {</b></p><p>  如果 沒有標(biāo)記第一次出現(xiàn)過了0</p><p>  那么 輸出an1[i];</p><p>  否則 如果 an1[i]為0 </p><p>  則 輸出an1[i];</p><p><b>  標(biāo)記已經(jīng)出現(xiàn)過0;</b></p>

42、;<p><b>  }</b></p><p><b>  }</b></p><p>  實現(xiàn)大整數(shù)相加的add()函數(shù)的偽代碼:</p><p>  void multiply()</p><p><b>  {</b></p><p&g

43、t;  輸入兩個要運算的大整數(shù)分別存在長度為MAX_LEN+10的</p><p>  字符串?dāng)?shù)組szline1和szline2中;</p><p>  循環(huán)計數(shù)變量 i,j;</p><p>  調(diào)用庫函數(shù)memeset()將地址an1開始的sizeof(an1)字節(jié)內(nèi)容置成0;</p><p>  調(diào)用庫函數(shù)memeset()將地址an2

44、開始的sizeof(an2)字節(jié)內(nèi)容置成0;</p><p>  調(diào)用庫函數(shù)memeset()將地址aresult開始的sizeof(aresult)字節(jié)內(nèi)容置成0。</p><p>  將szline1中存儲的字符串形式的整數(shù)轉(zhuǎn)換到an1中去</p><p>  將szline1中存儲的字符串形式的整數(shù)轉(zhuǎn)換到an1中去</p><p>  

45、for(i=0;i<nlen2;i++){每一都用an1的一位,去和an2各位相乘</p><p>  //從an1的個位開始</p><p>  for(j=0;j<nlen1;j++)用選定的an1的那一位,去乘an2的各位</p><p>  aresult[i+j]+=an2[i]*an1[j];兩數(shù)第i,j位相乘,累加到結(jié)果的第i+j位<

46、/p><p><b>  }</b></p><p>  下面的循環(huán)統(tǒng)一處理進位問題</p><p>  for(i=0;i<MAX_LEN*2;i++)</p><p><b>  {</b></p><p>  if(aresult[i]>=10){</p&

47、gt;<p>  aresult[i+1]+=aresult[i]/10;</p><p>  aresult[i]%=10;</p><p><b>  }</b></p><p><b>  }</b></p><p>  輸出結(jié)果和上一函數(shù)一樣</p><p&

48、gt;<b>  }</b></p><p><b>  4.測試分析</b></p><p>  按照附錄中的測試數(shù)據(jù),得出如下測試、分析結(jié)果:</p><p><b>  表達式求解功能</b></p><p>  當(dāng)我們輸入表格中兩個正確的四則表達式時程序能準(zhǔn)確地求得其值

49、:</p><p>  完全支持浮點數(shù),正負數(shù)的運算;</p><p>  而當(dāng)我們輸入第三組錯誤的表達式時,程序能做出正確判斷,提醒用給用戶輸入一個正確的表達式。</p><p>  其數(shù)據(jù)測試的情況見截圖:</p><p><b>  表達式一運算結(jié)果</b></p><p><b>

50、;  由表一知結(jié)果正確。</b></p><p><b>  表達式二運算結(jié)果</b></p><p><b>  由表一知結(jié)果正確。</b></p><p>  表達式三運算出錯情況</p><p><b>  大整數(shù)加法功能</b></p><

51、;p>  輸入兩組不大于200位的大整數(shù),能準(zhǔn)確計算出結(jié)果 其截圖如下圖所示:</p><p><b>  選擇功能b</b></p><p><b>  大整數(shù)乘法功能</b></p><p><b>  其測試截圖如:</b></p><p><b>  第

52、二組數(shù)據(jù)</b></p><p><b>  結(jié)果正確。</b></p><p><b>  5.使用說明</b></p><p>  1. 運行程序,首先出現(xiàn)主菜單。主菜單包括四個選項:選項a:表達式求解,選擇該項可進行四則表達式的求解;選項b:大整數(shù)運算,選擇該項可進行不大于200位的大整數(shù)的加法和乘法運算

53、(目前只支持加,乘);選項c:清屏;選項d:退出程序,選擇該項將退出程序。</p><p>  2. 大整數(shù)運算界面包括4個選項:選項1:兩個大整數(shù)相加;選項2:兩個大整數(shù)相乘;選項3:返回上一級菜單,可返回主界面。選項4:直接退出本程序。</p><p>  6.附錄(一):測試數(shù)據(jù)</p><p><b> ?。ū硪唬?lt;/b></p&

54、gt;<p><b> ?。ū矶?lt;/b></p><p>  7.附錄(二):C語言實現(xiàn)(源代碼)</p><p><b>  源程序文件名清單:</b></p><p>  LinkStack.h//鏈棧的實現(xiàn) 數(shù)字棧</p><p>  LinkCharStack.h//鏈棧的實

55、現(xiàn) 符號棧</p><p>  Calculator.h//主要實現(xiàn)大整數(shù)的加,乘運算</p><p>  Calculator.cpp//主程序</p><p>  LinkStack.h頭文件</p><p>  //這個棧是用來存儲數(shù)字符的</p><p>  #include<stdlib.h>&l

56、t;/p><p>  #define ERROR 0</p><p>  #define OK 1</p><p>  #defineTRUE 1</p><p>  #define FALSE 0</p><p>  typedef double ElementType;</p><p>  t

57、ypedef int Status;</p><p>  typedef struct node{</p><p>  ElementType data;</p><p>  struct node *next;</p><p>  }StackNode, *LinkStack;</p><p>  void Init

58、Stack(LinkStack &head){</p><p>  head=(LinkStack)malloc(sizeof(StackNode)); </p><p>  head->next=NULL;</p><p><b>  }</b></p><p>  Status IsEmpty(Link

59、Stack head){</p><p>  if(head->next==NULL)return TRUE;</p><p>  else return ERROR;</p><p><b>  }</b></p><p>  Status Push(LinkStack &head,ElementType

60、 element){//入棧</p><p>  LinkStack p;</p><p>  p=(LinkStack)malloc(sizeof(StackNode));</p><p>  if(p== NULL) return FALSE;</p><p>  p->data=element;</p><p&

61、gt;  p->next=head->next;</p><p>  head->next=p;</p><p>  return OK;</p><p><b>  }</b></p><p>  Status Pop(LinkStack &head,ElementType &elem

62、ent){//出棧</p><p>  if(IsEmpty(head))return FALSE;</p><p>  LinkStack temp=head->next;</p><p>  element=temp->data;</p><p>  head->next=temp->next;</p>

63、<p>  free(temp);</p><p>  return OK;</p><p><b>  }</b></p><p>  int GetTop(LinkStack head, ElementType &element){</p><p>  if(head->next==NUL

64、L)</p><p>  return ERROR;</p><p>  element =head->next->data;</p><p>  return OK;</p><p><b>  }</b></p><p>  Status DestroyStack(LinkStac

65、k &head)</p><p><b>  {</b></p><p>  LinkStack q;</p><p>  while(head)</p><p><b>  {</b></p><p>  q=head->next;</p>&l

66、t;p>  free(head);</p><p><b>  head=q;</b></p><p><b>  }</b></p><p>  return TRUE;</p><p><b>  }</b></p><p>  LinkSta

67、ck_Char.h頭文件</p><p>  //這個棧是用來存儲符號字符的</p><p>  #include <stdlib.h></p><p>  #define TRUE 1</p><p>  #define FALSE 0</p><p>  #define NULL 0</p>

68、<p>  typedef char ElemType;</p><p>  typedef int Status;</p><p>  typedef struct node1{</p><p>  ElemType data;</p><p>  struct node1 *next;</p><p>

69、;  }StackCharNode,*LinkCharStack;</p><p>  void CInitCharStack(LinkCharStack &head){</p><p>  head=(LinkCharStack)malloc(sizeof(StackCharNode));</p><p>  head->next=NULL;<

70、/p><p><b>  }</b></p><p>  int CIsEmpty(LinkCharStack head){</p><p>  return (head->next==NULL)?TRUE:FALSE;</p><p><b>  }</b></p><p&g

71、t;  int CPush(LinkCharStack &head,ElemType element){</p><p>  LinkCharStack temp=(LinkCharStack)malloc(sizeof(StackCharNode));</p><p>  if(!temp)return ERROR;</p><p>  temp->

72、data=element;</p><p>  temp->next=head->next;</p><p>  head->next=temp;</p><p>  return TRUE;</p><p><b>  }</b></p><p>  int CPop(Link

73、CharStack &head,ElemType &element){</p><p>  if(CIsEmpty(head))return FALSE;</p><p>  StackCharNode *temp=head->next;</p><p>  element=temp->data;</p><p>

74、  head->next=temp->next;</p><p>  free(temp);</p><p>  return TRUE;</p><p><b>  }</b></p><p>  int CGetTop(LinkCharStack head,ElemType &element){&

75、lt;/p><p>  if(head->next!=NULL)</p><p><b>  {</b></p><p>  element=head->next->data;</p><p>  return TRUE;</p><p><b>  }</b>

76、</p><p>  element='#';</p><p>  return FALSE;</p><p><b>  }</b></p><p>  Status CDestroyStack(LinkCharStack &head){</p><p>  LinkCh

77、arStack q;</p><p>  while(head)</p><p><b>  {</b></p><p>  q=head->next;</p><p>  free(head);</p><p><b>  head=q;</b></p>

78、<p><b>  }</b></p><p>  return TRUE;</p><p><b>  }</b></p><p>  calculator.h頭文件</p><p>  /*calculator.h頭文件*/</p><p>  #includ

79、e<stdio.h></p><p>  #include<string.h></p><p>  #define MAX_LEN 200</p><p>  unsigned int an1[MAX_LEN+10];</p><p>  unsigned int an2[MAX_LEN+10];</p>

80、<p>  unsigned int aresult[MAX_LEN*2+10];</p><p>  char szline1[MAX_LEN+10];</p><p>  char szline2[MAX_LEN+10];</p><p>  void add()</p><p><b>  {</b>&

81、lt;/p><p>  printf("請輸入兩個要運算的大整數(shù):\n");</p><p>  scanf("%s",szline1);</p><p>  scanf("%s",szline2);</p><p><b>  int i,j;</b></p

82、><p>  memset(an1,0,sizeof(an1));//庫函數(shù)memeset將地址an1開始的sizeof(an1)字節(jié)內(nèi)容置成</p><p>  memset(an2,0,sizeof(an2));</p><p>  //下面將szline1中存儲的字符串形式的整數(shù)轉(zhuǎn)換到an1中去</p><p>  //an1[0]對應(yīng)于個

83、位</p><p>  int nlen1=strlen(szline1);</p><p><b>  j=0;</b></p><p>  for(i=nlen1-1;i>=0;i--)</p><p>  an1[j++]=szline1[i]-'0';</p><p>

84、;  int nlen2=strlen(szline2);</p><p><b>  j=0;</b></p><p>  for(i=nlen2-1;i>=0;i--)</p><p>  an2[j++]=szline2[i]-'0';</p><p>  for(i=0;i<MAX_L

85、EN;i++)</p><p><b>  {</b></p><p>  an1[i]+=an2[i];</p><p>  if(an1[i]>=10)//看是否要進位</p><p><b>  {</b></p><p>  an1[i]-=10;</p&

86、gt;<p>  an1[i+1]++;//進位</p><p><b>  }</b></p><p><b>  }</b></p><p>  printf("計算的結(jié)果為:\n");</p><p>  bool bstartoutput=false;<

87、;/p><p>  for(i=MAX_LEN;i>=0;i--)</p><p>  if(bstartoutput)</p><p>  printf("%d",an1[i]);</p><p>  else if(an1[i]){</p><p>  printf("%d"

88、;,an1[i]);</p><p>  bstartoutput=true;</p><p><b>  }</b></p><p><b>  }</b></p><p>  void multiply()</p><p><b>  {</b>&l

89、t;/p><p>  printf("請輸入兩個要運算的大整數(shù):\n");</p><p>  scanf("%s",szline1);</p><p>  scanf("%s",szline2);</p><p><b>  int i,j;</b></p&

90、gt;<p>  memset(an1,0,sizeof(an1));//庫函數(shù)memeset將地址an1開始的sizeof(an1)字節(jié)內(nèi)容置成</p><p>  memset(an2,0,sizeof(an2));</p><p>  memset(aresult,0,sizeof(aresult));</p><p>  //下面將szline

91、1中存儲的字符串形式的整數(shù)轉(zhuǎn)換到an1中去</p><p>  //an1[0]對應(yīng)于個位</p><p>  int nlen1=strlen(szline1);</p><p><b>  j=0;</b></p><p>  for(i=nlen1-1;i>=0;i--)</p><p&g

92、t;  an1[j++]=szline1[i]-'0';</p><p>  int nlen2=strlen(szline2);</p><p><b>  j=0;</b></p><p>  for(i=nlen2-1;i>=0;i--)</p><p>  an2[j++]=szline2[

93、i]-'0';</p><p><b>  //以下為進行計算</b></p><p>  for(i=0;i<nlen2;i++){//每一都用an1的一位,去和an2各位相乘</p><p>  //從an1的個位開始</p><p>  for(j=0;j<nlen1;j++)//用選定

94、的an1的那一位,去乘an2的各位</p><p>  aresult[i+j]+=an2[i]*an1[j];//兩數(shù)第i,j位相乘,累加到結(jié)果的第i+j位</p><p><b>  }</b></p><p>  //下面的循環(huán)統(tǒng)一處理進位問題</p><p>  for(i=0;i<MAX_LEN*2;i+

95、+)</p><p><b>  {</b></p><p>  if(aresult[i]>=10){</p><p>  aresult[i+1]+=aresult[i]/10;</p><p>  aresult[i]%=10;</p><p><b>  }</b&g

96、t;</p><p><b>  }</b></p><p>  printf("計算的結(jié)果為:\n");</p><p>  bool bstartoutput=false;</p><p>  for(i=MAX_LEN*2;i>=0;i--){</p><p>  

97、if(bstartoutput)</p><p>  printf("%d",aresult[i]);</p><p>  else if(aresult[i]){</p><p>  printf("%d",aresult[i]);</p><p>  bstartoutput=true;</p

98、><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  Calculator.cpp</p><p>  # include <stdio.h></p>

99、<p>  # include <string.h></p><p>  # include <stdlib.h></p><p>  # include "LinkStack.h"</p><p>  # include "LinkCharStack.h"</p><p&

100、gt;  # include "calculator.h"</p><p>  # define STACK_INIT_SIZE 30</p><p>  # define STACKINCREAMENT 10</p><p>  # define NUMBER 30</p><p>  //判斷ch是否為運算符</

101、p><p>  int Comop(char ch)</p><p><b>  {</b></p><p>  switch(ch)</p><p><b>  {</b></p><p><b>  case '+':</b></p

102、><p><b>  case '-':</b></p><p><b>  case '*':</b></p><p><b>  case '/':</b></p><p><b>  case '(':

103、</b></p><p><b>  case ')':</b></p><p>  case '#':return 1;</p><p>  default:return 0;</p><p><b>  }</b></p><p&g

104、t;<b>  }//Comop</b></p><p>  //比較兩個運算符的優(yōu)先級</p><p>  char Precede(char ch,char c)//ch是棧頂字符,c 是表達式字符</p><p><b>  {</b></p><p>  switch(ch)</p&g

105、t;<p><b>  {</b></p><p><b>  case '+':</b></p><p><b>  case '-':</b></p><p>  if(c=='+'||c=='-'||c==')

106、'||c=='#')return '>';</p><p>  if(c=='*'||c=='/'||c=='(')return '<';</p><p><b>  case '*':</b></p><p>&

107、lt;b>  case '/':</b></p><p>  if(c=='+'||c=='-'||c=='*'||c=='/'||c==')'||c=='#')return '>';</p><p>  if(c=='('

108、)return '<';</p><p><b>  case '(':</b></p><p>  if(c=='+'||c=='-'||c=='*'||c=='/'||c=='(')return '<';</p>

109、<p>  if(c==')')return '=';</p><p>  if(c=='#')return ' ';</p><p><b>  case ')':</b></p><p>  if(c=='+'||c=='-&

110、#39;||c=='*'||c=='/'||c==')')return '>';</p><p>  if(c=='(')return ' ';</p><p>  if(c=='#')return '>';</p><p>&

111、lt;b>  case '#':</b></p><p>  if(c=='+'||c=='-'||c=='*'||c=='/'||c=='(')return '<';</p><p>  if(c==')')return ' &#

112、39;;</p><p>  if(c=='#')return '=';</p><p><b>  default:</b></p><p>  return '$';</p><p><b>  }</b></p><p>

113、  }//precede</p><p><b>  //運算函數(shù)</b></p><p>  ElementType Operate(ElementType a,char ch,ElementType b)</p><p><b>  {</b></p><p>  switch(ch)</

114、p><p><b>  {</b></p><p>  case '+':return a+b;</p><p>  case '-':return a-b;</p><p>  case '*':return a*b;</p><p><b>

115、;  case '/':</b></p><p><b>  if(b==0)</b></p><p><b>  {</b></p><p>  return -32767;</p><p><b>  }</b></p><p

116、>  return a/b;</p><p><b>  default:</b></p><p>  return -32767;</p><p><b>  }</b></p><p>  }//Operate</p><p><b>  //錯誤提示函數(shù)

117、</b></p><p>  int error(char *str) //在用的過程中可以不斷擴充錯誤的類型</p><p><b>  {</b></p><p>  int i=0,err=0;</p><p>  while(str[i]!='#') //主要通過判斷所有輸入的字符

118、數(shù)組str[30]</p><p><b>  {</b></p><p>  if(err==1 //err是為有些字符并不滿足其它函數(shù)而設(shè)的一個錯誤點 </p><p><b>  ||(</b></p>&

119、lt;p>  (str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/'||str[i]=='.') </p><p>  && //其它函數(shù)只要一聲明err=1也就說明輸入有誤</p><p>  (str[i+1]=='

120、;)')</p><p><b>  )</b></p><p><b>  ||(</b></p><p>  (str[i]=='+'||str[i]=='*'||str[i]=='/'||str[i]=='.')</p><p

121、><b>  &&</b></p><p>  (str[i-1]=='(')</p><p><b>  )</b></p><p>  ||(str[i]==')' && str[i+1]=='.')</p><p

122、>  ||(str[i]=='.' && str[i+1]=='(')</p><p>  ||(str[i]==')' && str[i+1]=='(')</p><p>  ||(str[i]=='(' && str[i+1]==')')

123、</p><p>  ||(str[i]==')' && str[i+1]>='0'&&str[i+1]<='9')</p><p>  ||(str[i]>='0'&&str[i]<='9'&& str[i+1]==

124、9;(')</p><p>  ||(str[0]=='+'||str[0]=='*'||str[0]=='/'||str[0]==')') </p><p><b>  ||(</b></p><p>  (s

125、tr[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/'||str[i]=='.') </p><p><b>  &&</b></p><p>  (str[i+1]=='+'||str[i+1]=='-

126、'||str[i+1]=='*'||str[i+1]=='/'||str[i+1]=='.'))</p><p>  ||(int(str[i])>57)</p><p>  ||(str[i]=='/' && str[i+1]=='0')</p><p>

127、  ||(int(str[i])>31 && int(str[i])<38)</p><p><b>  )</b></p><p><b>  return 1;</b></p><p>  else if(str[i]=='#')return 0;</p>&l

128、t;p><b>  i++;</b></p><p><b>  }//while</b></p><p><b>  return 0;</b></p><p><b>  }//錯誤提示函數(shù)</b></p><p><b>  //表達

129、式計算</b></p><p>  ElementType EvaluateExpression(char *exp){</p><p>  char c,ch; //c代表輸入表達式中的字符,ch代表棧頂運算符</p><p>  char *p,*q,*temp;//temp指向運算符后面的一個字符</p><p>

130、  double i=0,a=0,b=0;</p><p><b>  p=q=exp;</b></p><p>  LinkCharStack OPTR;//運算符棧</p><p>  LinkStack OPND;//操作數(shù)棧</p><p>  CInitCharStack(OPTR);CPush(OPTR,&#

131、39;#');</p><p>  InitStack(OPND);</p><p>  c=*p;temp=p;p++;</p><p>  if(c=='-')</p><p><b>  {</b></p><p>  c=*p;temp=p;p++;</p&g

132、t;<p><b>  }</b></p><p>  while(c!='#'||!CIsEmpty(OPTR)) //棧不為空或表達式?jīng)]有結(jié)束</p><p>  {//*********************進入最外層循環(huán)*********************</p><p>  if(!Comop

133、(c))//不是運算符則解析數(shù)字字符串然后進操作數(shù)棧</p><p><b>  {</b></p><p>  double m=0,n=0;</p><p>  while(c!='.'&&c>='0'&&c<='9')</p><

134、;p><b>  {//解析整數(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>

135、<p>  if(c=='.')</p><p><b>  {//解析小數(shù)部分</b></p><p><b>  c=*p;</b></p><p>  while(c>='0'&&c<='9')</p><p&

136、gt;  {p++;c=*p;}</p><p><b>  q=p;</b></p><p><b>  p--;</b></p><p>  while(*p!='.')</p><p><b>  {</b></p><p>  n

137、=n/10+(*p-48)/10.0;</p><p><b>  p--;</b></p><p><b>  }</b></p><p><b>  p=q;</b></p><p><b>  p++;</b></p><p>

138、;<b>  }</b></p><p>  if(*(temp-2)=='('&&*(temp-1)=='-'||temp-1==exp)</p><p>  Push(OPND,-(m+n));</p><p><b>  else </b></p>&

139、lt;p>  Push(OPND,m+n);</p><p>  }//*****數(shù)字進棧結(jié)束******</p><p>  else//是運算符時則進棧OPTR</p><p><b>  {</b></p><p>  if(c=='-'&&*(p-2)=='('

140、;)</p><p><b>  {</b></p><p><b>  c=*p;</b></p><p><b>  temp=p;</b></p><p><b>  p++;</b></p><p><b>  }

141、</b></p><p>  else//else1</p><p><b>  {</b></p><p>  CGetTop(OPTR,ch);</p><p>  switch(Precede(ch,c))</p><p><b>  {</b></p

142、><p>  case '<'://棧頂運算符優(yōu)先權(quán)低</p><p>  CPush(OPTR,c);c=*p;temp=p;p++;break;</p><p>  case '>'://棧頂運算符優(yōu)先權(quán)高</p><p>  CPop(OPTR,ch);</p><p> 

143、 Pop(OPND,b);Pop(OPND,a);</p><p>  Push(OPND,Operate(a,ch,b));break;</p><p>  case '='://脫括號并接收下一個字符</p><p>  CPop(OPTR,ch);c=*p;temp=p;p++;break;</p><p><b&

144、gt;  default:</b></p><p>  c=*p;temp=p;p++;</p><p><b>  }//switch</b></p><p><b>  }//else1</b></p><p><b>  }//else2</b></p&

145、gt;<p>  }//退出最外層循環(huán)</p><p>  GetTop(OPND,i);</p><p>  DestroyStack(OPND);</p><p>  CDestroyStack(OPTR);</p><p><b>  return i;</b></p><p>

146、;  }//EvaluateExpression函數(shù)結(jié)束</p><p><b>  //菜單函數(shù)</b></p><p>  void MenuPrint()</p><p><b>  {</b></p><p>  printf("\t\t┌─────────┐\n");&

溫馨提示

  • 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)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論