版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、HUBEI UNIVERSITY OF AUTOMOTIVE TECHNOLOGY數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告課設(shè)題目: 利用棧計(jì)算簡(jiǎn)單表達(dá)式 專 業(yè): 汽車電子工程 班 級(jí): T1323-14 姓 名: 華勝 完成日期: 2015-01-16 指導(dǎo)教師: 付勇智 目錄1.課程設(shè)計(jì)題目與內(nèi)容32.需求分析32.1要求42.2任務(wù)描述42.3運(yùn)行環(huán)境42.4開發(fā)工具33.總體設(shè)計(jì)4 3.1設(shè)計(jì)任務(wù)與目標(biāo)4 3.2程序中的功能函數(shù)5 3.3方案設(shè)計(jì)與論證54算法說(shuō)明6 4.1程序所含函數(shù)6 4.2函數(shù)間的調(diào)用關(guān)系74.3函數(shù)調(diào)用詳細(xì)說(shuō)明84.4函數(shù)流程圖85詳細(xì)設(shè)計(jì)說(shuō)明95.1數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)9 5.2模塊接
2、口設(shè)計(jì)106.程序運(yùn)行10 6.1 函數(shù)主界面10 6.2 計(jì)算表達(dá)式11 6.3保存結(jié)果136.4查看記錄146.5清空記錄166.6幾種輸入錯(cuò)誤176.7程序退出197.編程心得與體會(huì)198.程序源代碼21利用棧計(jì)算表達(dá)式1.題目描述及其要求:棧是計(jì)算機(jī)中常用的一種數(shù)據(jù)結(jié)構(gòu),具有廣泛的使用。利用棧的性質(zhì)及其操作原理編寫一個(gè)使用棧計(jì)算表達(dá)式的程序有助于更好的掌握棧的使用規(guī)則和原理應(yīng)用。數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)是理解和掌握數(shù)據(jù)結(jié)構(gòu)的重要環(huán)節(jié),主要任務(wù)是實(shí)現(xiàn)各種數(shù)據(jù)組織中的數(shù)據(jù)邏輯結(jié)構(gòu)、存儲(chǔ)結(jié)構(gòu)以及有關(guān)操作的算法。使學(xué)生學(xué)會(huì)分析研究計(jì)算機(jī)加工的數(shù)據(jù)結(jié)構(gòu)的特性,以便為應(yīng)用涉及的數(shù)據(jù)選擇適當(dāng)?shù)倪壿嫿Y(jié)構(gòu)、存儲(chǔ)
3、結(jié)構(gòu)及相應(yīng)的算法。另一方面,通過(guò)團(tuán)隊(duì)合作、文檔編制、主頁(yè)設(shè)計(jì)等環(huán)節(jié)對(duì)學(xué)生進(jìn)行全方位的訓(xùn)練,最終達(dá)到培養(yǎng)學(xué)生的數(shù)據(jù)抽象能力和軟件設(shè)計(jì)的能力。通過(guò)全部過(guò)程培養(yǎng)和鍛煉學(xué)生的鉆研能力、動(dòng)手能力、分析問(wèn)題和解決問(wèn)題的實(shí)際能力。題目要求:(1)按照分析、設(shè)計(jì)、編碼、調(diào)試、測(cè)試的軟件過(guò)程完成這個(gè)應(yīng)用程序。(2)為各項(xiàng)操作功能設(shè)計(jì)一個(gè)菜單,應(yīng)用程序運(yùn)行后,先顯示這個(gè)菜單,然后用戶通過(guò)菜單項(xiàng)選擇希望進(jìn)行的操作項(xiàng)目。輸入要求: (1)應(yīng)用程序運(yùn)行后在屏幕上顯示一個(gè)菜單。用戶可以根據(jù)需求,選定相應(yīng)的操作項(xiàng)目。進(jìn)入每個(gè)操作后,根據(jù)應(yīng)用程序的提示信息,從鍵盤輸入相應(yīng)的信息。程序根據(jù)用戶輸入的信息完成相應(yīng)的處理,實(shí)現(xiàn)要求
4、的功能。(2)能對(duì)輸入的數(shù)據(jù)進(jìn)行簡(jiǎn)單的校驗(yàn)。輸出要求: (1)應(yīng)用程序運(yùn)行后,要在屏幕上顯示一個(gè)菜單。 (2)要求用戶輸入數(shù)據(jù)時(shí),給出清晰、明確的提示信息,包括輸入的數(shù)據(jù)內(nèi)容、格式以及結(jié)束方式等。(3)在程序完成處理后,要清楚地給出程序的處理結(jié)果:如:從鍵盤輸入一個(gè)表達(dá)式,屏幕要輸出正確結(jié)果。實(shí)現(xiàn)要求: 采用模塊化程序設(shè)計(jì)的方法,將程序中的各項(xiàng)功能用函數(shù)實(shí)現(xiàn)。2.需求分析2.1要求1) 遵循軟件開發(fā)過(guò)程的基本規(guī)范;能靈活應(yīng)用,具備運(yùn)用數(shù)據(jù)結(jié)構(gòu)知識(shí)和C語(yǔ)言編程解決實(shí)際問(wèn)題的能力。2) 運(yùn)用結(jié)構(gòu)化程序設(shè)計(jì)方法,按照課程設(shè)計(jì)題目要求,完成包括需求分析、數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)、概要設(shè)計(jì)、詳細(xì)設(shè)計(jì)、編寫代碼、調(diào)試
5、和測(cè)試C程序等過(guò)程。3) 學(xué)會(huì)利用數(shù)組、結(jié)構(gòu)體、鏈表進(jìn)行相關(guān)信息表示。4) 功能模塊劃分清晰,系統(tǒng)結(jié)構(gòu)圖符合功能操作要求,且有詳盡的功能描述5) 各主要功能模塊有詳盡的流程圖及描述,用函數(shù)的形式實(shí)現(xiàn),且調(diào)用入口、功能、出口等關(guān)系正確。6) 所設(shè)計(jì)的C程序較好的可讀性和可靠性;程序書寫風(fēng)格規(guī)范,注釋清晰。7) 界面友好(良好的人機(jī)互交),凡需要輸入信息時(shí),都有較詳盡的提示信息,并對(duì)輸入信息有較完善的值域分析。8) 程序經(jīng)上機(jī)調(diào)試通過(guò),不應(yīng)出現(xiàn)語(yǔ)法型、功能型錯(cuò)誤,并獲得滿意的結(jié)果。9) 學(xué)會(huì)通過(guò)各功能性測(cè)試用例測(cè)試程序的能力,盡可能避免原則性錯(cuò)誤的出現(xiàn)。10) 掌握編寫、調(diào)試和測(cè)試C語(yǔ)言程序的基本
6、技巧,充分理解結(jié)構(gòu)化程序設(shè)計(jì)的基本方法。11) C語(yǔ)言課程設(shè)計(jì)報(bào)告的內(nèi)容反應(yīng)實(shí)際設(shè)計(jì)過(guò)程,且符合格式要求,條理清晰,內(nèi)容充實(shí)。2.2任務(wù)描述(1)能從鍵盤輸入一個(gè)數(shù)學(xué)表達(dá)式。(2)能計(jì)算一個(gè)數(shù)學(xué)表達(dá)式。(3)能保存一個(gè)數(shù)學(xué)表達(dá)式。(4)能讀取保存的記錄。(5)能清空已保存的記錄。2.3運(yùn)行環(huán)境1) Windows XP/ 7系統(tǒng)2) VC+6.0編譯環(huán)境2.4開發(fā)工具C語(yǔ)言3.總體設(shè)計(jì)3.1設(shè)計(jì)任務(wù)與目標(biāo)編寫程序?qū)崿F(xiàn)表達(dá)式求值,即驗(yàn)證某算術(shù)表達(dá)式的正確性,若正確,則計(jì)算該算術(shù)表達(dá)式的值。主要功能描述如下:1、從鍵盤上輸入表達(dá)式,以“=” 號(hào)結(jié)束表達(dá)式。2、分析該表達(dá)式是否合法:(1)是數(shù)字,則
7、判斷該數(shù)字的合法性。若合法,則壓入數(shù)據(jù)到堆棧中。(2)是規(guī)定的運(yùn)算符,則根據(jù)規(guī)則進(jìn)行處理。在處理過(guò)程中,將計(jì)算該表達(dá)式的值。(3)若是其它字符,則返回錯(cuò)誤信息。3、若上述處理過(guò)程中沒(méi)有發(fā)現(xiàn)錯(cuò)誤,則認(rèn)為該表達(dá)式合法,并在屏幕上打印處理結(jié)果。附加功能:1. 規(guī)定表達(dá)式的合法性2. 小數(shù)計(jì)算3. 計(jì)算記錄的保存與查看4. 判斷表達(dá)式的合法性(1)規(guī)定表達(dá)式的合法性,括號(hào)配對(duì),不能出現(xiàn)“6+3”、“6+3”等符號(hào)重疊的情況。(2)表達(dá)式開頭只能是數(shù)字或“(”,表達(dá)式中只能有一個(gè)“=”。3.2程序中的功能函數(shù):void initstack():初始化堆棧int check():語(yǔ)法檢查并計(jì)算int Pu
8、sh (czs *nu, double da):將操作數(shù)壓入堆棧char procede(char top,char code):處理操作碼int change_opnd(char code):將字符型操作碼轉(zhuǎn)換成優(yōu)先級(jí)int push (czm *op,char co):將操作碼壓入堆棧char pop (czm *op):將操作碼彈出堆棧double caculate(czm *op,czs *nu):簡(jiǎn)單計(jì)算+,-,*,/double Pop (czs *nu):彈出操作數(shù)3.3方案設(shè)計(jì)與論證1. 定義一個(gè)expression全局表達(dá)式結(jié)構(gòu)體EXPRESS 1000存放計(jì)算過(guò)的表達(dá)式(e
9、xpress MAXSIZE)和計(jì)算結(jié)果(result)、一個(gè)計(jì)量器(i)、一個(gè)表達(dá)式字符串、一個(gè)操作碼棧和一個(gè)操作數(shù)棧;2. 把表達(dá)式字符串從頭到尾逐一掃描,將輸入的表達(dá)式進(jìn)行語(yǔ)法檢查;3. 第一個(gè)字符只能是數(shù)字或“(”,最重一個(gè)字符只能是“=”;4. 表達(dá)式括號(hào)必須配對(duì),中間不能出現(xiàn)“=”;5. 在“(”前面只能是“+、*、/、( ”,在“+、*、/、=、)”前面只能是數(shù)字或“)”;6. 把表達(dá)式字符串從頭到尾逐一掃描,直到表達(dá)式掃描完畢,操作碼棧為空;7. 把字符根據(jù)運(yùn)算優(yōu)先級(jí)別選擇操作;8. 把表達(dá)式中的數(shù)值部分字符串轉(zhuǎn)成數(shù)值壓入操作數(shù)棧;9. 是“(”直接壓入到操作碼棧,級(jí)別比操作碼
10、棧頂元素高的,把運(yùn)算符壓入操作碼棧;10. 級(jí)別比操作碼棧低的,彈出操作碼棧的棧頂元素和操作數(shù)棧的兩個(gè)棧頂元素,進(jìn)行運(yùn)算后再壓入操作數(shù)棧;11. 是“)”,若操作碼棧頂是“(”,把彈出操作碼棧頂元素,否則“)”視為級(jí)別最低的元素,重復(fù)7;12. 最后計(jì)算出結(jié)果并將其存放在EXPRESS i,計(jì)量器加1;13. 重復(fù)計(jì)算后,將結(jié)果保存在文件里,并統(tǒng)計(jì)計(jì)算次數(shù);14. 查看多次計(jì)算結(jié)果,以表形式輸出;15. 查看本次計(jì)算記錄,以表形式輸出;16. 清除計(jì)算記錄,重新計(jì)算。4算法說(shuō)明4.1程序所含函數(shù):主要函數(shù):void main()/主函數(shù)void stack1(czm *op,czs *nu)/
11、程序主菜單void stack2(czm *op,czs *nu)/第二層計(jì)算選擇,子菜單void load()/顯示所有計(jì)算記錄void save()/保存計(jì)算結(jié)果void shown()/顯示本次計(jì)算結(jié)果void result(czm *op,czs *nu)/計(jì)算結(jié)果double caculate(czm *op,czs *nu /簡(jiǎn)單計(jì)算+,-,*,/表達(dá)式處理函數(shù):int check()/語(yǔ)法檢查double change_num(char str)/數(shù)字字符串轉(zhuǎn)成double型數(shù)字char procede(char top,char code)/處理操作碼,判斷棧的操作int ch
12、ange_opnd(char code)/字符型操作碼轉(zhuǎn)換優(yōu)先級(jí),非表達(dá)式字符返回-2棧操作函數(shù):double Get (czs *nu)/查看操作數(shù)棧棧頂double pop (czs *nu)/操作數(shù)棧出棧int Push (czs *nu,double da)/壓入操作數(shù)棧int Empty (czs *nu)/判空void Initstack(czs *nu) /初始化棧char get(czm *op)/查看棧頂char pop(czm *op)/出棧int push(czm *op,char co)/壓棧int empty(czm *op)/判空void initstack(czm
13、 *op)/初始化棧4.2函數(shù)間的調(diào)用關(guān)系:l main():主函數(shù) stack1();load() stack1();l stack1()程序模式函數(shù)清空文件exit();check()result(op,nu) stack2()stack1(); load stack1();l stack2()子菜單 save() stack2(); shown() stack2();l result(op,nu)計(jì)算結(jié)果initstack(op) Initstack(nu) push (op,=) Push (nu,change_num(str2);change_opnd(*ps) push (op,*
14、ps);procede(get (op),*ps) pop (op); Push (nu,caculate(op,nu)l caculate(op,nu) b=Pop (nu) a= Pop (nu) pop (op)4.3函數(shù)調(diào)用詳細(xì)說(shuō)明 main()函數(shù):調(diào)用了一個(gè)函數(shù)stack1(),stack1()判斷執(zhí)行查看所有計(jì)算記錄函數(shù)load(),或是清空以往的所有計(jì)算記錄,或是退出程序,或是檢查輸入表達(dá)式語(yǔ)法check()并計(jì)算表達(dá)式result(op,nu)的操作。 result(op,nu)函數(shù):是計(jì)算表達(dá)式,調(diào)用了初始化棧函數(shù)和字符級(jí)別判斷change_opnd(*ps),若是數(shù)字,則
15、調(diào)用轉(zhuǎn)化數(shù)字change_num(str2)然后壓入操作數(shù)棧,若是運(yùn)算符,剛調(diào)用判斷操作procede(get (op),*ps),若是“”,則彈出操作碼棧的棧頂元素和操作數(shù)棧的兩個(gè)棧頂元素,進(jìn)行運(yùn)算caculate(op,nu)后再壓入操作數(shù)棧,計(jì)算完畢后按stack1()順序運(yùn)行。 stack2()函數(shù):在計(jì)算結(jié)果后調(diào)用跟隨的選擇菜單,進(jìn)行查看結(jié)果shown()、保存結(jié)果save()、查看計(jì)算記錄load()、回到主菜單的操作。4.4函數(shù)流程圖:load()main()Stack1()result()save()Check()Exit()Start2()shown()5詳細(xì)設(shè)計(jì)說(shuō)明5.1數(shù)
16、據(jù)結(jié)構(gòu)設(shè)計(jì)1)表達(dá)式可以用一個(gè)字符串表示,計(jì)算結(jié)果可以用一個(gè)雙精度浮點(diǎn)數(shù)即小數(shù)表示,結(jié)構(gòu)簡(jiǎn)單,可以使用一段連續(xù)的地址空間,故定義一個(gè)結(jié)構(gòu)體表示即可。定義如下: struct expression/表達(dá)式結(jié)構(gòu)double result;char expressMAXSIZE;EXPRESSN;2)使用棧計(jì)算表達(dá)式時(shí)可以定義兩個(gè)棧存放數(shù)字的操作數(shù)棧(czs)和存放計(jì)算字符(+、-、*、/、(、))的操作碼棧(czm)。它們的定義如下: typedef struct/操作碼棧定義char codeMAXSIZE;int top;czm;typedef struct/操作數(shù)棧定義double data
17、MAXSIZE;int top;czs;3)宏定義:在本程序的開頭定義了兩個(gè)宏定義變量,用來(lái)對(duì)后面出現(xiàn)的相同變量進(jìn)行替換。#define MAXSIZE 1000#define N 10004)全局變量:int i=05.2模塊接口設(shè)計(jì)系統(tǒng)以主函數(shù)void main()為入口,通過(guò)調(diào)用void warning()函數(shù),提示用戶使用該程序應(yīng)注意的問(wèn)題,通過(guò)調(diào)用void stack1()函數(shù),導(dǎo)入程序調(diào)用,系統(tǒng)接收用戶輸入的選擇,調(diào)用相應(yīng)的函數(shù),進(jìn)入到下一級(jí)菜單進(jìn)行相關(guān)工作。6.程序運(yùn)行6.1 函數(shù)主界面6.2 計(jì)算表達(dá)式6.3保存結(jié)果6.4查看記錄6.5清空記錄6.6幾種輸入錯(cuò)誤6.7程序退出7
18、編程心得及體會(huì)數(shù)據(jù)結(jié)構(gòu)、高級(jí)語(yǔ)言和算法設(shè)計(jì)與分析這三門課程是構(gòu)成程序設(shè)計(jì)理論底層的黃金三角形。數(shù)據(jù)結(jié)構(gòu)重點(diǎn)討論程序設(shè)計(jì)中如何分析、規(guī)劃和存儲(chǔ)實(shí)現(xiàn)相關(guān)的數(shù)據(jù)以及關(guān)系。數(shù)據(jù)結(jié)構(gòu)詳細(xì)介紹了程序設(shè)計(jì)中各種常見(jiàn)的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu),對(duì)于程序設(shè)計(jì)有著至關(guān)重要的作用。如果說(shuō)理論課是學(xué)習(xí)和掌握各種數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)關(guān)系及邏輯關(guān)系,那么課程設(shè)計(jì)就是對(duì)知識(shí)掌握程度的一種檢測(cè)?!皩W(xué)而不思則罔,思而不學(xué)則殆”,學(xué)習(xí)是為了掌握知識(shí),也為了應(yīng)用于實(shí)際。一周的課程設(shè)計(jì)實(shí)踐,在同學(xué)和老師的幫助下,我完成了既定的任務(wù),實(shí)現(xiàn)了要求的程序功能,這使我對(duì)數(shù)據(jù)結(jié)構(gòu)及編程有了更進(jìn)一步的認(rèn)識(shí)和了解,要想學(xué)好它要重在實(shí)踐,要通過(guò)不斷的實(shí)際操作才能更好
19、地學(xué)習(xí)它。通過(guò)課程設(shè)計(jì)這一實(shí)踐環(huán)節(jié),加深了我對(duì)本學(xué)期所學(xué)知識(shí)的理解,也提高了我運(yùn)用所學(xué)知識(shí)分析問(wèn)題和解決實(shí)際問(wèn)題的能力。在此過(guò)程中我 也發(fā)現(xiàn)自己好多不足之處,首先是自己對(duì)語(yǔ)言的一些標(biāo)準(zhǔn)庫(kù)函數(shù)不太了解,其次,對(duì)于數(shù)據(jù)結(jié)構(gòu)的把我也不夠深刻,如棧的常見(jiàn)操作,還有對(duì)函數(shù)調(diào)用的正確使用不夠熟悉,有時(shí)對(duì)語(yǔ)言中經(jīng)常出現(xiàn)的錯(cuò)誤也不了解,通過(guò)實(shí)踐,我在這幾個(gè)方面的認(rèn)識(shí)有所提高。通過(guò)這一周的實(shí)踐學(xué)習(xí),我不僅認(rèn)識(shí)和體驗(yàn)了按照分析、設(shè)計(jì)、調(diào)試和測(cè)試的軟件開發(fā)過(guò)程,更從中深刻認(rèn)識(shí)到了“世上無(wú)難事,只要肯攀登”的道理。雖然自己在此過(guò)程中曾花費(fèi)大量時(shí)間去修改一個(gè)小錯(cuò)誤,但是當(dāng)最后看自己的程序完成了既定的任務(wù)時(shí),當(dāng)看著程序一
20、步步實(shí)現(xiàn)自己的想法時(shí),心中成功的喜悅之情真是難于言表,憑此不懈的精神奮斗,還有什么困難能攔得住自己前進(jìn)的步伐呢?老師說(shuō)“我要的不是你們的程序,而是你們能有所收獲。”“課設(shè)是幫助你們掌握所學(xué)知識(shí)的良好途徑?!币苍S我們所學(xué)的數(shù)據(jù)結(jié)構(gòu)知識(shí)對(duì)于編程來(lái)說(shuō)至少冰山一角,想要達(dá)到一般程序員的水準(zhǔn)也需要一個(gè)漫長(zhǎng)的過(guò)程,只要你愿意學(xué),就一定能有所收獲和成就。這次的課程實(shí)踐雖然很苦,但快樂(lè)也有。多掌握一門知識(shí),對(duì)我們的學(xué)習(xí)和生活一定有重要的幫助。數(shù)據(jù)結(jié)構(gòu)這門課固然難學(xué)且枯燥,很多內(nèi)容太過(guò)抽象,很多數(shù)據(jù)結(jié)構(gòu)類型需要通過(guò)畫示意圖才能理解,如棧。前人為我們樹立了榜樣,我們也要努力前行。8.程序源代碼#include #
21、include #include #include #define MAXSIZE 100#define N 1000int i=0;/表達(dá)式數(shù)struct expression/表達(dá)式結(jié)構(gòu)double result;char expressMAXSIZE;EXPRESSN;/表達(dá)式的一個(gè)整體容器stypedef struct/操作碼棧定義char codeMAXSIZE;int top;czm;typedef struct/操作數(shù)棧定義double dataMAXSIZE;int top;czs;/-操作數(shù)棧棧操作-:void Initstack(czs *nu)nu-top=-1;int
22、Empty(czs *nu)/判空if(nu-top=-1)return 0;else return 1;int Push(czs *nu,double da)/壓棧if(nu-top=MAXSIZE-1)printf(提醒:操作數(shù)棧已滿.);return 0;nu-top+;nu-datanu-top=da;return 1;double Pop(czs *nu)/出棧double a=0;if(nu-top=-1)printf(提醒:操作數(shù)棧已滿.);return a;a=nu-datanu-top;nu-top-;return a;double Get(czs *nu)/查看棧頂if(n
23、u-top!=-1)return nu-datanu-top;return 0;/-操作碼棧棧操作-:void initstack(czm *op)/初始化棧op-top=-1;int empty(czm *op)/判空if(op-top=-1)return 0;else return 1;int push(czm *op,char co)/壓棧if(op-top=MAXSIZE-1)printf(操作碼棧已滿.);return 0;op-top+;op-codeop-top=co;return 1;char pop(czm *op)/出棧char a=0;if(op-top=-1)print
24、f(提醒:操作碼棧是空的.);return a;a=op-codeop-top;op-top-;return a;char get(czm *op)/查看棧頂char a=0;if(op-top=-1)printf(提醒:操作碼棧是空的.);return a;elsereturn op-codeop-top;/-結(jié)束棧定義操作-/-函數(shù)操作-:int change_opnd(char code)/將字符型操作碼轉(zhuǎn)換成優(yōu)先級(jí),非表達(dá)式字符反回-2switch(code)case =:return 1;break;case ):return 2;break;case +:return 3;brea
25、k;case -:return 3;break;case *:return 4;break;case /:return 4;break;case (:return 0;break;/操作碼級(jí)別=0;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 0:case .: return -1;/操作數(shù)級(jí)別=-1;default: return -2;/其它符號(hào)級(jí)別=-2char procede(char top,char code)/處理操作碼,判斷棧的操作if(change_opnd(code)=0)/(入棧re
26、turn ();elseif(change_opnd(code)=2 & change_opnd(top)=0)/(和)同時(shí)出現(xiàn),(出棧,)不入棧return (=);elseif(change_opnd(code);elsereturn ();/入棧double change_num(char str)/數(shù)字字符串轉(zhuǎn)成double型數(shù)字char *s=str;int i,j;int p=1,q=0;/p=小數(shù)點(diǎn)前位數(shù),q=小數(shù)點(diǎn)后位數(shù)char d=.,z=0;double da=0;if(strstr(str,d)=0)/判斷是否有小數(shù)點(diǎn)p=strlen(str);elseif(strstr
27、(str,d)=str)/沒(méi)有輸入小數(shù)點(diǎn)前的數(shù),如.032p=1;q=strlen(str)-1;strcpy(str,strcat(z,str);elsep=strstr(str,d)-str;q=strlen(str)-p-1;for(i=0;ip;i+)/小數(shù)點(diǎn)前的各位數(shù)乘以各自的階數(shù),然后疊加:123=1*100+2*10+3*1da=da+(int)stri-48)*pow(10,p-i-1);for(j=0;j0|*p=.)if(change_opnd(*p)!=3)printf(n表達(dá)式只能以數(shù)字或(開頭,請(qǐng)重新輸入:);gets(EXPRESSi.express);p=EXPR
28、ESSi.express;n=0;continue;elseif(change_opnd(*p)=-2)printf(n表達(dá)式%c為非法字符.請(qǐng)重新輸入:,*p);gets(EXPRESSi.express);p=EXPRESSi.express;n=0;continue;else/合法剛跳到下一個(gè)字符p=p+1;continue;if(change_opnd(*p)=0)/(前一個(gè)字符只能是+、-、*、/、(if(change_opnd(*(p-1)3&change_opnd(*(p-1)!=-2)if(change_opnd(*(p-1)!=0)printf(n表達(dá)式%c不符合語(yǔ)法.請(qǐng)重新
29、輸入:,*p);gets(EXPRESSi.express);p=EXPRESSi.express;n=0;continue;if(change_opnd(*p)=2) / )后面只能是+ - * / =if(change_opnd( *(p+1) )=0)printf(n表達(dá)式%c或%c不符合語(yǔ)法.請(qǐng)重新輸入:,*p,*(p+1);gets(EXPRESSi.express);p=EXPRESSi.express;n=0;continue;if(change_opnd(*p)=-1)/+、-、*、/、=、)前一個(gè)字符只能是數(shù)字和)if(change_opnd(*(p-1)=2)printf(
30、n表達(dá)式%c或%c不符合語(yǔ)法,請(qǐng)重新輸入:,*(p-1),*p);gets(EXPRESSi.express);p=EXPRESSi.express;n=0;continue;if(change_opnd(*p)=4)if(change_opnd(*(p-1)!=-1) if(change_opnd(*(p-1)!=2)printf(n表達(dá)式%c或%c不符合語(yǔ)法,請(qǐng)重新輸入:,*(p-1),*p);gets(EXPRESSi.express);p=EXPRESSi.express;n=0;continue;if(change_opnd(*p)=1)/判斷表達(dá)式中是否有=重復(fù)出現(xiàn),最后括號(hào)是否配
31、對(duì)if(*(p+1)!=0)printf(n表達(dá)式中=,只能出現(xiàn)在表達(dá)式結(jié)束處.請(qǐng)重新輸入:);gets(EXPRESSi.express);p=EXPRESSi.express;n=0;continue;if(n!=0)printf(n表達(dá)式括號(hào)不配.請(qǐng)重新輸入:);gets(EXPRESSi.express);p=EXPRESSi.express;n=0;continue;p=p+1;return 1;double caculate(czm *op,czs *nu)/簡(jiǎn)單計(jì)算+,-,*,/double b=Pop(nu),a=Pop(nu);switch(pop(op)case +:ret
32、urn(a+b);break;case -:return(a-b);break;case *:return(a*b);break;case /:return(a/b);break;return 0;void result(czm *op,czs *nu)/計(jì)算結(jié)果char str2MAXSIZE=,str32=0;char *ps=EXPRESSi.express;initstack(op);/初始化棧Initstack(nu);push(op,=);while(!(*ps=)&(get(op)=)/檢查是表達(dá)式和操作碼是否到尾if(change_opnd(*ps)=-1)/操作數(shù)處理whil
33、e(change_opnd(*ps)=-1)strncpy(str3,ps,1);/數(shù)字字符一個(gè)個(gè)取出放在str2strcat(str2,str3);ps+;Push(nu,change_num(str2);strcpy(str2,);else /操作碼處理switch(procede(get(op),*ps)case :Push(nu,caculate(op,nu);continue;break;if(*ps=)&get(op)=)ps+;continue;if(*ps=|get(op)=)continue;/表達(dá)式和操作碼有一個(gè)到尾,則跳出繼續(xù)循環(huán)ps+;EXPRESSi.result=G
34、et(nu);printf(nt 表達(dá)式:%st計(jì)算結(jié)果:%lfn,EXPRESSi.express,EXPRESSi.result);printf(t-n);i+;/表達(dá)式個(gè)數(shù)加1;void shown()/顯示計(jì)算結(jié)果int n;for(n=0;n0;n-)/記錄最后一個(gè)#號(hào)位置,即未保存的結(jié)果的開始位置,重復(fù)保存只會(huì)追加if(EXPRESSn-1.express0=#)break;strcpy(EXPRESSi.express,#表達(dá)式個(gè)數(shù):);/每次保存都統(tǒng)計(jì)計(jì)算次數(shù)EXPRESSi.result=i-n;i+;for(m=n;mi;m+)if(fwrite(&EXPRESSm,siz
35、eof(struct expression),1,fp)!=1)/將表達(dá)式和計(jì)算結(jié)果存到文件中printf(file write errorn);fclose(fp);printf(*提醒:計(jì)算記錄已經(jīng)保存n);void load()/顯示所有計(jì)算記錄int m;struct expression eN;FILE *fp;printf(n);if(fp=fopen(calculate.dat,rb)=NULL)/空文件printf(n-n);printf(*提醒:沒(méi)有記錄信息,請(qǐng)進(jìn)行計(jì)算并保存信息:n);return;for(m=0;fread(&em,sizeof(struct expression),1,fp);m+)/按照expression結(jié)構(gòu)一個(gè)個(gè)讀取printf(n%d -n,m+1);printf(t 表達(dá)式:%st計(jì)算結(jié)果:%.2lfn,em.express,ei.result);if(em.express0=#)/控制輸出不同次計(jì)算的記錄m=-1;printf(n);printf(n-n);fclose(fp);printf(n);void warning()printf(n-提示-n);printf(計(jì)算表達(dá)式時(shí),請(qǐng)用戶正確輸入表達(dá)式,不得出現(xiàn)非法字符及字符重復(fù)出現(xiàn)n);printf(表達(dá)式以
溫馨提示
- 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ù)網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版?zhèn)€人信用借款合同(附逾期罰息及信用修復(fù)條款)4篇
- 二零二五年度農(nóng)業(yè)機(jī)械租賃收益分成合同
- 二零二五年度臨時(shí)雇傭服務(wù)合同規(guī)范文本
- 二零二五版木材加工廢棄物資源化利用合同范本3篇
- 二零二五版通信設(shè)備租賃擔(dān)保服務(wù)協(xié)議2篇
- 個(gè)人攝影服務(wù)2024年度合同9篇
- 二零二五年度房地產(chǎn)買賣合同標(biāo)的及相關(guān)定義3篇
- 2025年度采石場(chǎng)礦山生態(tài)環(huán)境恢復(fù)合同范本3篇
- 2025年度智能交通信號(hào)燈安裝與維護(hù)合同3篇
- 2025版文化產(chǎn)業(yè)項(xiàng)目咨詢與投資合作委托協(xié)議3篇
- 2025年度公務(wù)車輛私人使用管理與責(zé)任協(xié)議書3篇
- 售后工程師述職報(bào)告
- 綠化養(yǎng)護(hù)難點(diǎn)要點(diǎn)分析及技術(shù)措施
- 2024年河北省高考?xì)v史試卷(含答案解析)
- 車位款抵扣工程款合同
- 小學(xué)六年級(jí)數(shù)學(xué)奧數(shù)題100題附答案(完整版)
- 高中綜評(píng)項(xiàng)目活動(dòng)設(shè)計(jì)范文
- 英漢互譯單詞練習(xí)打印紙
- 2023湖北武漢華中科技大學(xué)招聘實(shí)驗(yàn)技術(shù)人員24人筆試參考題庫(kù)(共500題)答案詳解版
- 一氯二氟甲烷安全技術(shù)說(shuō)明書MSDS
- 母嬰護(hù)理員題庫(kù)
評(píng)論
0/150
提交評(píng)論