版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--算術(shù)表達式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--算術(shù)表達式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告---算術(shù)表達式求值系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告-中綴算術(shù)表達式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---中綴算術(shù)表達式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計帶括號的算術(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è)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--表達式求值問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--表達式求值問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告(二)表達式求值(計算器)
- 算術(shù)表達式求值演示-課程設(shè)計報告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--長整數(shù)的四則運算
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(表達式計算)
評論
0/150
提交評論