

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 課程設(shè)計(jì)報(bào)告</b></p><p> 課程名稱(chēng): </p><p> 設(shè)計(jì)題目: </p><p> 系 別: </p>
2、<p> 專(zhuān) 業(yè): </p><p> 組 別: </p><p> 學(xué)生姓名: </p><p> 起止日期: 年 月 日 ~
3、年 月 日 </p><p> 指導(dǎo)教師: </p><p> 《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計(jì)報(bào)告</p><p> 題目:實(shí)現(xiàn)對(duì)算術(shù)四則混合運(yùn)算表達(dá)式的求值以及大整數(shù)計(jì)算</p><p><b> 一.設(shè)計(jì)目的</b></p>&l
4、t;p> 數(shù)據(jù)結(jié)構(gòu)是計(jì)算機(jī)專(zhuān)業(yè)的核心課程,是一門(mén)實(shí)踐性很強(qiáng)的課程。課程設(shè)計(jì)是加強(qiáng)學(xué)生實(shí)踐能力的一個(gè)強(qiáng)有力手段,要求學(xué)生掌握數(shù)據(jù)結(jié)構(gòu)的應(yīng)用、算法的編寫(xiě)、類(lèi)C語(yǔ)言的算法轉(zhuǎn)換成C程序并上機(jī)調(diào)試的基本方法,還要求學(xué)生在完成程序設(shè)計(jì)的同時(shí)能夠?qū)懗霰容^規(guī)范的設(shè)計(jì)報(bào)告。嚴(yán)格實(shí)施課程設(shè)計(jì)這一環(huán)節(jié),對(duì)于學(xué)生基本程序設(shè)計(jì)素養(yǎng)的培養(yǎng)和軟件工作者工作作風(fēng)的訓(xùn)練,將起到顯著的促進(jìn)作用。</p><p><b> 二.問(wèn)
5、題描述</b></p><p> 當(dāng)用戶輸入一個(gè)合法的算術(shù)表達(dá)式后,能夠返回正確的結(jié)果。能夠計(jì)算的運(yùn)算符包括:加、減、乘、除、括號(hào);能夠計(jì)算的操作數(shù)要求在實(shí)數(shù)范圍內(nèi);對(duì)于異常表達(dá)式能給出錯(cuò)誤提示。</p><p> 求兩個(gè)不超過(guò)200位的非負(fù)整數(shù)的和,積和商。</p><p><b> 三.調(diào)試與操作說(shuō)明</b></p&
6、gt;<p><b> ?。ㄒ唬┬枨蠓治?lt;/b></p><p> 本程序所做的工作為:能直接求出四則表達(dá)式的值,并輸出;可以解決因數(shù)值位數(shù)太大unsigned類(lèi)型都無(wú)法表示的大數(shù)之間的運(yùn)算。本程序可用于小學(xué)教師對(duì)學(xué)生作業(yè)的快速批改以及對(duì)數(shù)值位數(shù)要求較大的科學(xué)運(yùn)算。</p><p><b> 此程序規(guī)定:</b></p&g
7、t;<p> 1.程序的主要功能包括兩部分:表達(dá)式求解和大整數(shù)的運(yùn)算。</p><p> 2.表達(dá)式求解中輸入的必需為一個(gè)正確的四則表達(dá)式,可以是整型也可以為浮點(diǎn)型,比如:3*(7-2)+5和3.154*(12+18)-23。大整數(shù)的運(yùn)算中根據(jù)提示要輸入兩行數(shù)據(jù)位數(shù)不能大于200位。</p><p> 3.程序的輸出:表達(dá)式求解中為一浮點(diǎn)型數(shù)據(jù),大整數(shù)運(yùn)算中輸出的即為運(yùn)
8、算之后的結(jié)果,結(jié)果里不能有多余的前導(dǎo)0。</p><p><b> (二) 概要設(shè)計(jì)</b></p><p> 1.ADT LinkStack{</p><p> 數(shù)據(jù)元素:此鏈棧中的所有元素類(lèi)型為字符型的數(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)造一個(gè)空棧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 被銷(xiāo)毀</p><p> }ADT LinkStack</p
13、><p> 2.ADT LinkCharStack{</p><p> 數(shù)據(jù)對(duì)象D:元素類(lèi)型為字符型的符號(hào)字符</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():計(jì)算兩個(gè)不大于200位的大整數(shù)的和,此文件包含于頭文件calculator.h中。</p><p> multiply():實(shí)現(xiàn)兩個(gè)大整數(shù)的積的運(yùn)算,此文件也包含于頭證件calculator.h中。</p><p> Comop(char ch):判斷輸入的字符是否為運(yùn)算符</p><p> char Precede(char ch,cha
17、r c):比較兩個(gè)運(yùn)算符的優(yōu)先級(jí),ch是棧頂字符,c是表達(dá)式字符。</p><p> 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)對(duì)多種非法四則表達(dá)式的判斷,并給出提示,讓用
18、戶更正自己的輸入錯(cuò)誤。</p><p> void MenuPrint():主菜單打印函數(shù)。</p><p> void submenu():大整數(shù)運(yùn)算功能模塊的子菜單。</p><p> void Clear():清屏函數(shù)。</p><p> ElementType EvaluateExpression(char *exp):這是此
19、程序的核心函數(shù),可以綜合其它子函數(shù),實(shí)現(xiàn)最終的表達(dá)式求解。</p><p> 各程序模塊之間的調(diào)用關(guān)系(子程序編號(hào)見(jià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.詳細(xì)設(shè)計(jì)</b></p>
20、<p> 表達(dá)式計(jì)算核心算法的思想及偽代碼:</p><p><b> 此算法的基本思想:</b></p><p> 首先置操作數(shù)棧OPND為空棧,表達(dá)式起始符“#”為運(yùn)算符的棧底元素;依次讀入表達(dá)式中每個(gè)字符,若是操作數(shù)則進(jìn)棧,若是運(yùn)算符則和OPTR棧的棧頂運(yùn)算符比較優(yōu)先權(quán)作相應(yīng)操作,直至整個(gè)表達(dá)式求值完畢(即OPTR棧的棧頂元素和當(dāng)前讀入的字符均
21、為“#”)</p><p><b> 此算法的偽代碼:</b></p><p> ElementType EvaluateExpression(char *exp){</p><p> 定義兩個(gè)字符變量c和ch,c代表輸入表達(dá)式中的字符,ch代表?xiàng)m斶\(yùn)算符;</p><p> 定義字符指針 *p,*q,*temp
22、;temp指向運(yùn)算符后面的一個(gè)字符</p><p> double i=0,a=0,b=0;</p><p> 將傳入的實(shí)參賦給p,q;</p><p> 定義一個(gè)運(yùn)算符棧 OPTR;</p><p> 定義一個(gè)操作數(shù)棧 OPND;</p><p> 調(diào)用函數(shù)InitStack()初始化棧OPND; <
23、/p><p> 調(diào)用函數(shù)InitCharStack()初始化棧OPNR ;</p><p> 調(diào)用函數(shù)CPush(OPTR,'#')將#壓入運(yùn)算符棧;</p><p> c=*p;temp=p;p++;</p><p> if(第一個(gè)字符就為‘-’)</p><p><b> {<
24、/b></p><p> c=*p;temp=p;p++;</p><p><b> }</b></p><p> while(棧不為空或表達(dá)式?jīng)]有結(jié)束)</p><p> {//進(jìn)入最外層循環(huán)</p><p> if(不是運(yùn)算符)//則解析數(shù)字字符串然后進(jìn)操作數(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(沒(méi)有遇到小數(shù)點(diǎn)并且為數(shù)字字符)</p><p> { 解析整數(shù)部分m }</
26、p><p><b> if(遇到小數(shù)點(diǎn))</b></p><p><b> { 解析小數(shù)部分</b></p><p><b> c=*p;</b></p><p> 將p指針移到第一個(gè)出現(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(運(yùn)算符為‘-’并且運(yùn)算符前一個(gè)為‘(’或者為表達(dá)式的開(kāi)始)</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ù)字進(jìn)棧結(jié)束</b></p><p> else//是運(yùn)算符時(shí)則進(jìn)棧OPTR</p><p><b&
30、gt; {</b></p><p> if(運(yùn)算符為‘-’&&運(yùn)算符前一個(gè)為‘(’)</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)生級(jí)別)</p><p><b> {</b></p><p> case 棧頂運(yùn)算符優(yōu)先權(quán)低:</p><p> 調(diào)用函數(shù)CPush(OPTR,c)將c入運(yùn)算符棧;</p><p><
33、;b> 接收下一個(gè)字符;</b></p><p> case 棧頂運(yùn)算符優(yōu)先權(quán)高:</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
34、 優(yōu)生權(quán)相等:脫括號(hào)并接收下一個(gè)字符;</p><p> 調(diào)用CPop(OPTR,ch)脫括號(hào);</p><p><b> 接收下一個(gè)字符;</b></p><p><b> default:</b></p><p><b> 接收下一個(gè)字符;</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> 將兩個(gè)棧消毀;</b></p><p><b> 返回I;</b></p><p> }EvaluateExpression函數(shù)結(jié)束</p><p> 實(shí)現(xiàn)大整數(shù)相加的add()函數(shù)的偽代碼:</p><p> void add()</p>
37、<p><b> {</b></p><p> 輸入兩個(gè)要運(yùn)算的大整數(shù)分別存在長(zhǎng)度為MAX_LEN+10的</p><p> 字符串?dāng)?shù)組szline1和szline2中;</p><p> 循環(huán)計(jì)數(shù)變量 i,j;</p><p> 調(diào)用庫(kù)函數(shù)memeset()將地址an1開(kāi)始的sizeof(an1
38、)字節(jié)內(nèi)容置成0;</p><p> 調(diào)用庫(kù)函數(shù)memeset()將地址an2開(kāi)始的sizeof(an2)字節(jié)內(nèi)容置成0;</p><p> 將szline1中存儲(chǔ)的字符串形式的整數(shù)轉(zhuǎn)換到an1中去</p><p> 將szline1中存儲(chǔ)的字符串形式的整數(shù)轉(zhuǎn)換到an1中去</p><p> for(i=0;i<最大的長(zhǎng)度;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]++即進(jìn)位;</p><p><b> }</b></p><p><b> }</b></p><p> //下面是無(wú)前導(dǎo)0地輸出計(jì)算的結(jié)果; </p><p> for(i=最大長(zhǎng)度;i>=0;i--)</p><p><b>
41、 {</b></p><p> 如果 沒(méi)有標(biāo)記第一次出現(xiàn)過(guò)了0</p><p> 那么 輸出an1[i];</p><p> 否則 如果 an1[i]為0 </p><p> 則 輸出an1[i];</p><p><b> 標(biāo)記已經(jīng)出現(xiàn)過(guò)0;</b></p>
42、;<p><b> }</b></p><p><b> }</b></p><p> 實(shí)現(xiàn)大整數(shù)相加的add()函數(shù)的偽代碼:</p><p> void multiply()</p><p><b> {</b></p><p&g
43、t; 輸入兩個(gè)要運(yùn)算的大整數(shù)分別存在長(zhǎng)度為MAX_LEN+10的</p><p> 字符串?dāng)?shù)組szline1和szline2中;</p><p> 循環(huán)計(jì)數(shù)變量 i,j;</p><p> 調(diào)用庫(kù)函數(shù)memeset()將地址an1開(kāi)始的sizeof(an1)字節(jié)內(nèi)容置成0;</p><p> 調(diào)用庫(kù)函數(shù)memeset()將地址an2
44、開(kāi)始的sizeof(an2)字節(jié)內(nèi)容置成0;</p><p> 調(diào)用庫(kù)函數(shù)memeset()將地址aresult開(kāi)始的sizeof(aresult)字節(jié)內(nèi)容置成0。</p><p> 將szline1中存儲(chǔ)的字符串形式的整數(shù)轉(zhuǎn)換到an1中去</p><p> 將szline1中存儲(chǔ)的字符串形式的整數(shù)轉(zhuǎn)換到an1中去</p><p>
45、for(i=0;i<nlen2;i++){每一都用an1的一位,去和an2各位相乘</p><p> //從an1的個(gè)位開(kāi)始</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)一處理進(jìn)位問(wèn)題</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.測(cè)試分析</b></p><p> 按照附錄中的測(cè)試數(shù)據(jù),得出如下測(cè)試、分析結(jié)果:</p><p><b> 表達(dá)式求解功能</b></p><p> 當(dāng)我們輸入表格中兩個(gè)正確的四則表達(dá)式時(shí)程序能準(zhǔn)確地求得其值
49、:</p><p> 完全支持浮點(diǎn)數(shù),正負(fù)數(shù)的運(yùn)算;</p><p> 而當(dāng)我們輸入第三組錯(cuò)誤的表達(dá)式時(shí),程序能做出正確判斷,提醒用給用戶輸入一個(gè)正確的表達(dá)式。</p><p> 其數(shù)據(jù)測(cè)試的情況見(jiàn)截圖:</p><p><b> 表達(dá)式一運(yùn)算結(jié)果</b></p><p><b>
50、; 由表一知結(jié)果正確。</b></p><p><b> 表達(dá)式二運(yùn)算結(jié)果</b></p><p><b> 由表一知結(jié)果正確。</b></p><p> 表達(dá)式三運(yùn)算出錯(cuò)情況</p><p><b> 大整數(shù)加法功能</b></p><
51、;p> 輸入兩組不大于200位的大整數(shù),能準(zhǔn)確計(jì)算出結(jié)果 其截圖如下圖所示:</p><p><b> 選擇功能b</b></p><p><b> 大整數(shù)乘法功能</b></p><p><b> 其測(cè)試截圖如:</b></p><p><b> 第
52、二組數(shù)據(jù)</b></p><p><b> 結(jié)果正確。</b></p><p><b> 5.使用說(shuō)明</b></p><p> 1. 運(yùn)行程序,首先出現(xiàn)主菜單。主菜單包括四個(gè)選項(xiàng):選項(xiàng)a:表達(dá)式求解,選擇該項(xiàng)可進(jìn)行四則表達(dá)式的求解;選項(xiàng)b:大整數(shù)運(yùn)算,選擇該項(xiàng)可進(jìn)行不大于200位的大整數(shù)的加法和乘法運(yùn)算
53、(目前只支持加,乘);選項(xiàng)c:清屏;選項(xiàng)d:退出程序,選擇該項(xiàng)將退出程序。</p><p> 2. 大整數(shù)運(yùn)算界面包括4個(gè)選項(xiàng):選項(xiàng)1:兩個(gè)大整數(shù)相加;選項(xiàng)2:兩個(gè)大整數(shù)相乘;選項(xiàng)3:返回上一級(jí)菜單,可返回主界面。選項(xiàng)4:直接退出本程序。</p><p> 6.附錄(一):測(cè)試數(shù)據(jù)</p><p><b> (表一)</b></p&
54、gt;<p><b> ?。ū矶?lt;/b></p><p> 7.附錄(二):C語(yǔ)言實(shí)現(xiàn)(源代碼)</p><p><b> 源程序文件名清單:</b></p><p> LinkStack.h//鏈棧的實(shí)現(xiàn) 數(shù)字棧</p><p> LinkCharStack.h//鏈棧的實(shí)
55、現(xiàn) 符號(hào)棧</p><p> Calculator.h//主要實(shí)現(xiàn)大整數(shù)的加,乘運(yùn)算</p><p> Calculator.cpp//主程序</p><p> LinkStack.h頭文件</p><p> //這個(gè)棧是用來(lái)存儲(chǔ)數(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> //這個(gè)棧是用來(lái)存儲(chǔ)符號(hào)字符的</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("請(qǐng)輸入兩個(gè)要運(yùn)算的大整數(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));//庫(kù)函數(shù)memeset將地址an1開(kāi)始的sizeof(an1)字節(jié)內(nèi)容置成</p><p> memset(an2,0,sizeof(an2));</p><p> //下面將szline1中存儲(chǔ)的字符串形式的整數(shù)轉(zhuǎn)換到an1中去</p><p> //an1[0]對(duì)應(yīng)于個(gè)
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)//看是否要進(jìn)位</p><p><b> {</b></p><p> an1[i]-=10;</p&
86、gt;<p> an1[i+1]++;//進(jìn)位</p><p><b> }</b></p><p><b> }</b></p><p> printf("計(jì)算的結(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("請(qǐng)輸入兩個(gè)要運(yùn)算的大整數(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));//庫(kù)函數(shù)memeset將地址an1開(kāi)始的sizeof(an1)字節(jié)內(nèi)容置成</p><p> memset(an2,0,sizeof(an2));</p><p> memset(aresult,0,sizeof(aresult));</p><p> //下面將szline
91、1中存儲(chǔ)的字符串形式的整數(shù)轉(zhuǎn)換到an1中去</p><p> //an1[0]對(duì)應(yīng)于個(gè)位</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> //以下為進(jìn)行計(jì)算</b></p><p> for(i=0;i<nlen2;i++){//每一都用an1的一位,去和an2各位相乘</p><p> //從an1的個(gè)位開(kāi)始</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)一處理進(jìn)位問(wèn)題</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("計(jì)算的結(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是否為運(yùn)算符</
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> //比較兩個(gè)運(yùn)算符的優(yōu)先級(jí)</p><p> char Precede(char ch,char c)//ch是棧頂字符,c 是表達(dá)式字符</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> //運(yùn)算函數(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> //錯(cuò)誤提示函數(shù)
117、</b></p><p> int error(char *str) //在用的過(guò)程中可以不斷擴(kuò)充錯(cuò)誤的類(lèi)型</p><p><b> {</b></p><p> int i=0,err=0;</p><p> while(str[i]!='#') //主要通過(guò)判斷所有輸入的字符
118、數(shù)組str[30]</p><p><b> {</b></p><p> if(err==1 //err是為有些字符并不滿足其它函數(shù)而設(shè)的一個(gè)錯(cuò)誤點(diǎn) </p><p><b> ||(</b></p>&
119、lt;p> (str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/'||str[i]=='.') </p><p> && //其它函數(shù)只要一聲明err=1也就說(shuō)明輸入有誤</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> }//錯(cuò)誤提示函數(shù)</b></p><p><b> //表達(dá)
129、式計(jì)算</b></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>
130、 double i=0,a=0,b=0;</p><p><b> p=q=exp;</b></p><p> LinkCharStack OPTR;//運(yùn)算符棧</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)) //棧不為空或表達(dá)式?jīng)]有結(jié)束</p><p> {//*********************進(jìn)入最外層循環(huán)*********************</p><p> if(!Comop
133、(c))//不是運(yùn)算符則解析數(shù)字字符串然后進(jìn)操作數(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ù)字進(jìn)棧結(jié)束******</p><p> else//是運(yùn)算符時(shí)則進(jìn)棧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ùn)算符優(yōu)先權(quán)低</p><p> CPush(OPTR,c);c=*p;temp=p;p++;break;</p><p> case '>'://棧頂運(yùn)算符優(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 '='://脫括號(hào)并接收下一個(gè)字符</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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--算術(shù)表達(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ì)---中綴算術(shù)表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)帶括號(hào)的算術(shù)表達(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ì)-表達(dá)式求值
- 數(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ì)--《十進(jìn)制表達(dá)式四則運(yùn)算》
- 算術(shù)表達(dá)式求值課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--表達(dá)式求值問(wèn)題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--表達(dá)式求值問(wèn)題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告(二)表達(dá)式求值(計(jì)算器)
- 算術(shù)表達(dá)式求值演示-課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--長(zhǎng)整數(shù)的四則運(yùn)算
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)(表達(dá)式計(jì)算)
評(píng)論
0/150
提交評(píng)論