- 目錄
【第1篇 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計總結(jié)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計總結(jié)篇一
本次課程設(shè)計,使我對《數(shù)據(jù)結(jié)構(gòu)》這門課程有了更深入的理解?!稊?shù)據(jù)結(jié)構(gòu)》是一門實踐性較強的課程,為了學(xué)好這門課程,必須在掌握理論知識的同時,加強上機實踐。
我的課程設(shè)計題目是線索二叉樹的運算。剛開始做這個程序的時候,感到完全無從下手,甚至讓我覺得完成這次程序設(shè)計根本就是不可能的,于是開始查閱各種資料以及參考文獻,之后便開始著手寫程序,寫完運行時有很多問題。特別是實現(xiàn)線索二叉樹的刪除運算時很多情況沒有考慮周全,經(jīng)常運行出現(xiàn)錯誤,但通過同學(xué)間的幫助最終基本解決問題。
在本課程設(shè)計中,我明白了理論與實際應(yīng)用相結(jié)合的重要性,并提高了自己組織數(shù)據(jù)及編寫大型程序的能力。培養(yǎng)了基本的、良好的程序設(shè)計技能以及合作能力。這次課程設(shè)計同樣提高了我的綜合運用所學(xué)知識的能力。并對vc有了更深入的了解。《數(shù)據(jù)結(jié)構(gòu)》是一門實踐性很強的課程,上機實習(xí)是對學(xué)生全面綜合素質(zhì)進行訓(xùn)練的一種最基本的方法,是與課堂聽講、自學(xué)和練習(xí)相輔相成的、必不可少的一個教學(xué)環(huán)節(jié)。上機實習(xí)一方面能使書本上的知識變“活”,起到深化理解和靈活掌握教學(xué)內(nèi)容的目的;另一方面,上機實習(xí)是對學(xué)生軟件設(shè)計的綜合能力的訓(xùn)練,包括問題分析,總體結(jié)構(gòu)設(shè)計,程序設(shè)計基本技能和技巧的訓(xùn)練。此外,還有更重要的一點是:機器是比任何教師更嚴厲的檢查者。因此,在“數(shù)據(jù)結(jié)構(gòu)”的學(xué)習(xí)過程中,必須嚴格按照老師的要求,主動地、積極地、認真地做好每一個實驗,以不斷提高自己的編程能力與專業(yè)素質(zhì)。
通過這段時間的課程設(shè)計,我認識到數(shù)據(jù)結(jié)構(gòu)是一門比較難的課程。需要多花時間上機練習(xí)。這次的程序訓(xùn)練培養(yǎng)了我實際分析問題、編程和動手能力,使我掌握了程序設(shè)計的基本技能,提高了我適應(yīng)實際,實踐編程的能力。
總的來說,這次課程設(shè)計讓我獲益匪淺,對數(shù)據(jù)結(jié)構(gòu)也有了進一步的理解和認識。
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計總結(jié)篇二
這學(xué)期開始兩周時間是我們自己選題上機的時間, 這學(xué)期開始兩周時間是我們自己選題上機的時間,雖然 上機時間只有短短兩個星期但從中確實學(xué)到了不少知識。 上機時間只有短短兩個星期但從中確實學(xué)到了不少知識。數(shù) 據(jù)結(jié)構(gòu)可以說是計算機里一門基礎(chǔ)課程, 據(jù)結(jié)構(gòu)可以說是計算機里一門基礎(chǔ)課程,但我覺得我們一低 計算機里一門基礎(chǔ)課程 定要把基礎(chǔ)學(xué)扎實, 定要把基礎(chǔ)學(xué)扎實,然而這次短短的上機幫我又重新鞏固了 c 語言知識,讓我的水平又一部的提高。數(shù)據(jù)結(jié)構(gòu)這是一門 語言知識 讓我的水平又一部的提高。數(shù)據(jù)結(jié)構(gòu)這是一門 知識, 純屬于設(shè)計的.科目,它需用把理論變?yōu)樯蠙C調(diào)試。
純屬于設(shè)計的科目,它需用把理論變?yōu)樯蠙C調(diào)試。它對我們 來說具有一定的難度。它是其它編程語言的一門基本學(xué)科。 來說具有一定的難度。它是其它編程語言的一門基本學(xué)科。 我選的上機題目是交叉合并兩個鏈表,對這個題目, 我選的上機題目是交叉合并兩個鏈表,對這個題目,我 覺得很基礎(chǔ)。剛開始調(diào)試代碼的時候有時就是一個很小的錯 覺得很基礎(chǔ)。剛開始調(diào)試代碼的時候有時就是一個很小的錯 調(diào)試代碼的時候 誤,導(dǎo)致整個程序不能運行,然而開始的我還沒從暑假的狀 導(dǎo)致整個程序不能運行, 態(tài)轉(zhuǎn)到學(xué)習(xí)上,每當(dāng)程序錯誤時我都非常焦躁, 態(tài)轉(zhuǎn)到學(xué)習(xí)上,每當(dāng)程序錯誤時我都非常焦躁,甚至想到了 放棄,但我最終找到了狀態(tài),一步一步慢慢來, 放棄,但我最終找到了狀態(tài),一步一步慢慢來,經(jīng)過無數(shù)次 的檢查程序錯誤的原因后慢慢懂得了耐心是一個人成功的 必然具備的條件! 同時,通過此次課程設(shè)計使我了解到, 必然具備的條件! 同時,通過此次課程設(shè)計使我了解到, 硬件語言必不可缺少,要想成為一個有能力的人,必須懂得 件語言必不可缺少,要想成為一個有能力的人, 硬件基礎(chǔ)語言。在這次課程設(shè)計中, 硬件基礎(chǔ)語言。
在這次課程設(shè)計中,雖然不會成功的編寫一 個完整的程序,但是在看程序的過程中, 個完整的程序,但是在看程序的過程中,不斷的上網(wǎng)查資料 以及翻閱相關(guān)書籍,通過不斷的模索,測試,發(fā)現(xiàn)問題, 以及翻閱相關(guān)書籍,通過不斷的模索,測試,發(fā)現(xiàn)問題,解決問題和在老師的幫助下一步一步慢慢的正確運行程序, 決問題和在老師的幫助下一步一步慢慢的正確運行程序,終 于完成了這次課程設(shè)計, 于完成了這次課程設(shè)計,雖然這次課程設(shè)計結(jié)束了但是總覺 得自已懂得的知識很是不足,學(xué)無止境, 得自已懂得的知識很是不足,學(xué)無止境,以后還會更加的努 力深入的學(xué)習(xí)。 力深入的學(xué)習(xí)。
【第2篇 2023年計算機二級《公共基礎(chǔ)》知識總結(jié):數(shù)據(jù)結(jié)構(gòu)的基本概念
1.2 數(shù)據(jù)結(jié)構(gòu)的基本概念
考點3 數(shù)據(jù)結(jié)構(gòu)的定義
考試鏈接:
考點3在筆試考試中,是一個經(jīng)??疾榈膬?nèi)容,在筆試考試中出現(xiàn)的幾率為70%,主要是以選擇的形式出現(xiàn),分值為2分,此考點為識記內(nèi)容,讀者還應(yīng)該識記數(shù)據(jù)的邏輯結(jié)構(gòu)和存儲結(jié)構(gòu)的概念。
數(shù)據(jù)結(jié)構(gòu)作為計算機的一門學(xué)科,主要研究和討論以下三個方面:
(1)數(shù)據(jù)集合中個數(shù)據(jù)元素之間所固有的邏輯關(guān)系,即數(shù)據(jù)的邏輯結(jié)構(gòu);
(2)在對數(shù)據(jù)元素進行處理時,各數(shù)據(jù)元素在計算機中的存儲關(guān)系,即數(shù)據(jù)的存儲結(jié)構(gòu);
(3)對各種數(shù)據(jù)結(jié)構(gòu)進行的運算。
數(shù)據(jù):是對客觀事物的符號表示,在計算機科學(xué)中是指所有能輸入到計算機中并被計算機程序處理的符號的總稱。
數(shù)據(jù)元素:是數(shù)據(jù)的基本單位,在計算機程序中通常作為一個整體進行考慮和處理。
數(shù)據(jù)對象:是性質(zhì)相同的數(shù)據(jù)元素的集合,是數(shù)據(jù)的一個子集。
數(shù)據(jù)的邏輯結(jié)構(gòu)是對數(shù)據(jù)元素之間的邏輯關(guān)系的描述,它可以用一個數(shù)據(jù)元素的集合和定義在此集合中的若干關(guān)系來表示。數(shù)據(jù)的邏輯結(jié)構(gòu)有兩個要素:一是數(shù)據(jù)元素的集合,通常記為d;二是d上的關(guān)系,它反映了數(shù)據(jù)元素之間的前后件關(guān)系,通常記為r。一個數(shù)據(jù)結(jié)構(gòu)可以表示成
b=(d,r)
其中b表示數(shù)據(jù)結(jié)構(gòu)。為了反映d中各數(shù)據(jù)元素之間的前后件關(guān)系,一般用二元組來表示。
數(shù)據(jù)的邏輯結(jié)構(gòu)在計算機存儲空間中的存放形式稱為數(shù)據(jù)的存儲結(jié)構(gòu)(也稱數(shù)據(jù)的物理結(jié)構(gòu))。
由于數(shù)據(jù)元素在計算機存儲空間中的位置關(guān)系可能與邏輯關(guān)系不同,因此,為了表示存放在計算機存儲空間中的各數(shù)據(jù)元素之間的邏輯關(guān)系(即前后件關(guān)系),在數(shù)據(jù)的存儲結(jié)構(gòu)中,不僅要存放各數(shù)據(jù)元素的信息,還需要存放各數(shù)據(jù)元素之間的前后件關(guān)系的信息。
一種數(shù)據(jù)的邏輯結(jié)構(gòu)根據(jù)需要可以表示成多種存儲結(jié)構(gòu),常用的存儲結(jié)構(gòu)有順序、鏈接、索引等存儲結(jié)構(gòu)。而采用不同的存儲結(jié)構(gòu),其數(shù)據(jù)處理的效率是不同的。因此,在進行數(shù)據(jù)處理時,選擇合適的存儲結(jié)構(gòu)是很重要的。
考點4 線性結(jié)構(gòu)與非線性結(jié)構(gòu)
考試鏈接:
考點4在筆試考試中,雖然說不是考試經(jīng)??疾榈膬?nèi)容,但讀者還是對此考點有所了解,在筆試考試中出現(xiàn)的幾率為30%,主要是以填空題出現(xiàn)的形式出現(xiàn),分值為2分,此考點為識記內(nèi)容。
根據(jù)數(shù)據(jù)結(jié)構(gòu)中各數(shù)據(jù)元素之間前后件關(guān)系的復(fù)雜程度,一般將數(shù)據(jù)結(jié)構(gòu)分為兩大類型:線性結(jié)構(gòu)與非線性結(jié)構(gòu)。如果一個非空的數(shù)據(jù)結(jié)構(gòu)滿足下列兩個條件:
(1)有且只有一個根結(jié)點;
(2)每一個結(jié)點最多有一個前件,也最多有一個后件。
則稱該數(shù)據(jù)結(jié)構(gòu)為線性結(jié)構(gòu)。線性結(jié)構(gòu)又稱線性表。在一個線性結(jié)構(gòu)中插入或刪除任何一個結(jié)點后還應(yīng)是線性結(jié)構(gòu)。如果一個數(shù)據(jù)結(jié)構(gòu)不是線性結(jié)構(gòu),則稱之為非線性結(jié)構(gòu)。
疑難解答:空的數(shù)據(jù)結(jié)構(gòu)是線性結(jié)構(gòu)還是非線性結(jié)構(gòu)?
一個空的數(shù)據(jù)結(jié)構(gòu)究竟是屬于線性結(jié)構(gòu)還是屬于非線性結(jié)構(gòu),這要根據(jù)具體情況來確定。如果對該數(shù)據(jù)結(jié)構(gòu)的算法是按線性結(jié)構(gòu)的規(guī)則來處理的,則屬于線性結(jié)構(gòu);否則屬于非線性結(jié)構(gòu)。
【第3篇 數(shù)據(jù)結(jié)構(gòu)實驗報告總結(jié)
數(shù)據(jù)結(jié)構(gòu)實驗報告總結(jié)
設(shè)計題目:模擬計算器程序
學(xué)生姓名:謝先斌
系 別:計算機與通信工程學(xué)院
專 業(yè):計算機科學(xué)與技術(shù)
班 級:1班
學(xué) 號:541007010144
指導(dǎo)教師:盧冰 李曄
2012 年 6 月 21 日
鄭州輕工業(yè)學(xué)院
課 程 設(shè) 計 任 務(wù) 書
題目 模擬計算器程序
專業(yè)、班級 計算機科學(xué)與技術(shù)10-01班 學(xué)號 541007010144 姓名 謝先斌
主要內(nèi)容:
設(shè)計一個模擬計算器的程序,要求能對包含加、減、乘、除、括號運算符及sqr和abs函數(shù)的任意整型表達式進行求解。
基本要求:
要檢查有關(guān)運算的條件,并對錯誤的條件產(chǎn)生報警。
主要參考資料:
嚴蔚敏 吳偉民 編著《數(shù)據(jù)結(jié)構(gòu)(c語言版)》 清華大學(xué)出版社 第44頁 3.1 棧、第52頁3.2.5表達式求值
完 成 期 限: 2012年6月21日
指導(dǎo)教師簽名:
課程負責(zé)人簽名:
2012年 6月 21 日
一、 設(shè)計題目
模擬計算器的程序
設(shè)計一個模擬計算器的程序,要求能對包含加、減、乘、除、括號運算符及sqr和abs函數(shù)的任意整型表達式進行求解。
設(shè)計要求:要檢查有關(guān)運算的條件,并對錯誤的條件產(chǎn)生報警。
二、 算法設(shè)計的思想
本程序設(shè)計主要是應(yīng)用了棧,利用棧的“先進后出”原理,建立了兩個棧,分別為運算符棧postack和運算數(shù)棧pdstack。算法的基本思想(參考課本p53頁)是:
(1) 首先置操作數(shù)棧為pdstack空棧,表達式起始符為“=”,位運算符棧的棧底元素;
(2) 依次讀入表達式中的每個字符,若是操作數(shù)則進入pdstack棧,若是運算符則和postack棧的棧定運算符比較優(yōu)先權(quán)后作相應(yīng)操作,直到整個表達式求值完畢(即postack棧的棧定元素和當(dāng)前讀入的字符均為“=” )。
三、 算法的流程圖
本程序的流程如下附圖1所示:
附圖1 程序流程圖
四、 算法設(shè)計分析
首先創(chuàng)建了兩個棧:
typedef struct opstack //定義運算符棧
{
char opstack[ma__operator_num];
int top;
}opstack, _popstack;
typedef struct datastack //定義運算數(shù)棧
{
double stack[ma__data_num];
int top;
}datastack, _pdatastack;
來分別存放運算符和運算數(shù)。在兩個結(jié)構(gòu)體中均有一個top數(shù)據(jù)域,當(dāng)top=-1時,表示該站為空棧。
定義一個evaluatee_pression_r函數(shù)來完成函數(shù)運算的主要功能:讀入表達式,并計算結(jié)果。以下是對該函數(shù)的分析:
當(dāng)一次運算開始時,分別調(diào)用initpopstack(popstack &postack)函數(shù)和initpdatastack(pdatastack &pdstack)函數(shù)分別對運算符棧和運算數(shù)棧進行初始化。調(diào)用pushopstack(postack, '=')函數(shù)來完成運算符棧棧低元素的設(shè)置。
通過pushopstack(popstack &postack, char ch)函數(shù)、
popopstack(popstack &postack, char &ch)函數(shù)、
pushdatastack(pdatastack &pdstack, double d)函數(shù)和popdatastack(pdatastack &pdstack, double &d)函數(shù)來分別完成運算符和運輸數(shù)的進出棧操作。gettoppopstack(popstack &postack)函數(shù)和gettoppdatastack(pdatastack &pdstack) 函數(shù)主要是進行得到棧定元素的作用,特別是在對運算符棧優(yōu)先級的比較中十分重要,其中還會調(diào)用isop(char &ch) 函數(shù)來區(qū)分讀入的是運算符還是運算數(shù)。
changechar(char &c)函數(shù)當(dāng)每次讀入一個字符是都會調(diào)用一次,主要的作用就是完成不用區(qū)分a、s的大小的功能。
precede(char op1, char op2)函數(shù)主要是通過一個二維字符串?dāng)?shù)組來存放9種運算符的優(yōu)先級比較的結(jié)果,每當(dāng)讀到一個運算符后就進行與運算符棧頂元素比較,通過返回的“<、>;、=”結(jié)果來進行下一步的操作:'<'表示棧頂元素優(yōu)先級低,運算符進棧;'='表示脫括號并接受下一個字符;'>;'表示運算符和運算數(shù)各退棧一次并調(diào)用operate(double a, char theta, double b)函數(shù)(主要是對出棧的.運算符和運算數(shù)進行計算),最后將運算結(jié)果壓入運算數(shù)棧pdstack。
當(dāng)操作結(jié)束時運算數(shù)棧的棧頂元素就是計算結(jié)果,分別調(diào)用clearpopstack(postack)函數(shù)清空運算符棧、clearpdatastack(pdstack)函數(shù)清空運算數(shù)棧以待下一次繼續(xù)進行相關(guān)操作。
print_user函數(shù)和e_it_e函數(shù)開始和結(jié)束時個調(diào)用一次,分別完成歡迎界面和退出界面的布置。main是本程序的主函數(shù),主要通過while語句和switch語句來完成本程序的運行,當(dāng)輸入y(y)時調(diào)用evaluatee_pression_r函數(shù)完成計算,當(dāng)輸入n(n)時,調(diào)用e_it_e函數(shù)退出本程序的運行。
本程序還考慮到各種異常的處理,如運算時除數(shù)為0、被開方數(shù)為0等情況的出現(xiàn),最終的處理是直接退出程序的運行。
五、 運行結(jié)果分析
1. 程序開始界面,如附圖2:
附圖2 開始界面
2.如下附圖3,附圖4分別是選擇進入和退出程序界面:
附圖3(在以下界面輸入計算式即可運行出計算結(jié)果如附圖5)
附圖4 退出界面
附圖5 運行界面
2. 對異常的處理
a) 對異常1除數(shù)為0,如輸入“1+2/0=”程序?qū)⒅苯油顺?,如附圖6:
附圖6 異常1除數(shù)為0
b) 對異常2被開方數(shù)為負數(shù),如輸入“3+s(-9)=”程序?qū)⒅苯油顺?,如附圖7:
附圖7 異常2被開方數(shù)為負數(shù)
3.以下是對各種簡單運算的運行結(jié)果,如附圖8:
附圖8 簡單運算
3. 綜合運算:如式子“1/2+a(7-8)-s(9_8)=”運行結(jié)果如附圖9
附圖9 綜合運算
六、 收獲及體會
本程序以c語言的棧的相關(guān)知識為基礎(chǔ),通過控制兩個棧(運算數(shù)棧和運算符棧)的進出的棧操作,來實現(xiàn)對包含加、減、乘、除、括號運算符及sqrt和abs函數(shù)的任意整型表達式的求解運算。
從程序的編寫來看,感覺這次自己真的學(xué)到了好多,特別是對程序的開發(fā)流程。從最初的選定程序,到最終的程序運行成功,讓我感到如果是僅僅掌握課本上的知識是遠遠不能夠很好的應(yīng)用到實際的編程中去的。在這個過程中還需要我們更多的去考慮到實際條件的種種限制和約束。
我在寫本程序的過程中也遇到了很多的問題,當(dāng)然本程序的核心問題就是對兩個棧的壓出棧操作,需要做優(yōu)先級判斷,并要考慮什么時候進棧,什么時候出棧等操作。我采用了課本上第52-54頁講的通過一個二維字符串?dāng)?shù)組來控制比較“+-_、as=”共9個運算符的優(yōu)先級控制。對異常,如除數(shù)為0、被開方數(shù)小于0等異常也進行了精心的處理。對操作過程中要用到的y、n、a、s等字符也進行了改進,最終本程序可以不區(qū)分大小寫就完成相關(guān)操作。
總之,經(jīng)過本次專業(yè)課程設(shè)計,讓我掌握了開發(fā)應(yīng)用軟件的基本流程,運用所學(xué)編程技能的基本技巧,也讓我初步了解了軟件設(shè)計的基本方法,提高進行工程設(shè)計的基本技能及分析、解決實際問題的能力,為以后畢業(yè)設(shè)計和工程實踐等打下良好的基礎(chǔ)。相信通過這次的課程設(shè)計,我對所學(xué)的《數(shù)據(jù)結(jié)構(gòu)(c語言版)》和各種編程語言都有了一個全新的認識。我也會積極吸取本次課程設(shè)計的經(jīng)驗,繼續(xù)研究數(shù)據(jù)結(jié)構(gòu)和所學(xué)的各種編程語言。
七、 源代碼
# include
# include
# include
# include
# define ma__operator_num 100 //運算符棧數(shù)組長度
# define ma__data_num 100 //運算數(shù)棧數(shù)組長度
typedef struct opstack //定義運算符棧
{
char opstack[ma__operator_num];
int top;
}opstack, _popstack;
typedef struct datastack //定義運算數(shù)棧
{
double stack[ma__data_num];
int top;
}datastack, _pdatastack;
void initpopstack(popstack &postack) //初始化運算符棧
{
if( !(postack = (popstack)malloc(sizeof(opstack)))) //為運算符棧分配空間
{
printf('分配內(nèi)存空間失敗! ');
e_it(-1);
}
postack->;top = -1;
}
void initpdatastack(pdatastack &pdstack) //初始化運算數(shù)棧
{
if( !(pdstack = (pdatastack)malloc(sizeof(datastack)))) //為運算數(shù)棧分配空間
{
printf('分配內(nèi)存空間失敗! ');
e_it(-1);
}
pdstack->;top = -1;
}
void pushopstack(popstack &postack, char ch) //運算符進棧
{
postack->;opstack[++(postack->;top)] = ch;
}
void popopstack(popstack &postack, char &ch) //運算符出棧
{
ch = postack->;opstack[postack->;top];
postack->;top--;
}
void pushdatastack(pdatastack &pdstack, double d) //運算數(shù)進棧
{
++(pdstack->;top);
pdstack->;stack[pdstack->;top] = d;
}
void popdatastack(pdatastack &pdstack, double &d) //運算數(shù)出棧
{
d = pdstack->;stack[pdstack->;top];
pdstack->;top--;
}
void clearpopstack(popstack &postack) //清空運算符棧
{
postack->;top = -1;
}
void clearpdatastack(pdatastack &pdstack) //清空運算數(shù)棧
{
pdstack->;top = -1;
}
char gettoppopstack(popstack &postack) //獲取運算符棧頂元素
{
return postack->;opstack[postack->;top];
}
double gettoppdatastack(pdatastack &pdstack) //獲取運算數(shù)棧頂元素
{
return pdstack->;stack[pdstack->;top];
}
bool isop(char &ch) //區(qū)分 運算符 和 運算數(shù) 的函數(shù),是運算符時返回true,否則返回false
{ //判斷是否為符號
if ( (ch == '+') || (ch == '-') || (ch == '_') || (ch == '/') || (ch == '=') || (ch == 'a') || (ch == 's') || (ch == 'a') || (ch == 's') || (ch == '(') || (ch == ')') )
return true;
else
return false;
}
char precede(char op1, char op2) //參考《數(shù)據(jù)結(jié)構(gòu)》(c語言版)第53頁 3.2.5表達式求值 表 3.1
{
char tab[9][10]; //定義字符串的二維數(shù)組來存放運算符優(yōu)先級的關(guān)系
strcpy( tab[0], '>;>;<<<>;<<>;' );
strcpy( tab, '>;>;<<<>;<<>;' );
strcpy( tab, '>;>;>;>;<>;<<>;' );
strcpy( tab[3], '>;>;>;>;<>;<<>;' );
strcpy( tab[4], '<<<<<=<
strcpy( tab[5], '>;>;>;>;e>;>;>;>;' );
strcpy( tab[6], '>;>;>;>;<>;>;>;>;' );
strcpy( tab[7], '>;>;>;>;<>;>;>;>;' );
strcpy( tab[8], '<<<<
printf(' | ___歡迎您的下次使用!謝謝!!!___ | '); //退出使用
printf(' |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| ');
}
double operate(double a, char theta, double b) //對出棧的運算符和運算數(shù)進行計算
{
double s;
switch(theta)
{
case '+':
s = a + b;
break;
case '-':
s = a - b;
break;
case '_':
s = a _ b;
break;
case '/':
if ( b != 0 ) //判斷除數(shù)是否為0,若為0,退出程序
{
s = a/b;
break;
}
else
{
printf(' #### 除數(shù)為0,非法運算。程序終止! #### ');
e_it_e; //打印結(jié)束菜單
e_it(-1);
}
case 'a':
s = fabs(b); //調(diào)用fabs函數(shù)
break;
case 's':
if( b >;= 0) //判斷被開方數(shù)是否為0,若為0,退出程序
{
s = sqrt(b); //調(diào)用sqrt函數(shù)
break;
}
else
{
printf(' #### 求負數(shù)的平方根是非法運算。程序終止! #### ');
e_it_e; //打印結(jié)束菜單
e_it(-1);
}
}
return s;
}
char changechar(char &c) //通過changechar函數(shù)來把a、s的小寫字母改為大寫的
{
if( c == 'a' )
c = 'a';
else if( c == 's' )
c = 's';
return c;
}
//參考《數(shù)據(jù)結(jié)構(gòu)》(c語言版)第53頁 3.2.5表達式求值算法3.4 evaluatee_pression_r函數(shù)
void evaluatee_pression_r //計算函數(shù):讀入表達式,并計算結(jié)果
{
popstack postack; //聲明運算符棧
pdatastack pdstack; //聲明運算數(shù)棧
double result; //存運算的結(jié)果
char _, theta, c; //c存放讀取的字符,_、theta存放運算符棧的棧頂元素
int flag, data; //標(biāo)識符,用來讀入連續(xù)的數(shù)字
double s;
double getd; //存放gettopx__的結(jié)果
double a, b, cc; //a,b存放數(shù)據(jù)棧出棧的棧頂元素, c存放運算結(jié)果
flag = 0; //初始化標(biāo)識符,用來判斷字符串中的連續(xù)數(shù)字
data = 0; //
initpopstack(postack); //初始化運算符棧
initpdatastack(pdstack); //初始化運算數(shù)棧
pushopstack(postack, '='); //在運算符棧底放入'='
printf(' &請輸入表達式以'='結(jié)束:');
c = get); //讀入字符
changechar(c); //通過調(diào)用函數(shù)來實現(xiàn)把小寫的a、s改為大寫的a、s
while( c != '=' || gettoppopstack(postack) != '=')
{
if( !isop(c) ) //不是運算符進棧
{
s = c - '0'; //把字符轉(zhuǎn)化為數(shù)字
if ( flag == 1 )
{
popdatastack(pdstack, getd);
s = getd_10 + s;
}
pushdatastack(pdstack, s);
flag = 1;
c = get);
changechar(c);
}
else
{
flag = 0;
switch( precede(gettoppopstack(postack), c) ) //輸入元素和運算符棧頂元素比較
{
case '<': //棧頂元素優(yōu)先級低
pushopstack(postack, c);
c = get);
changechar(c);
break;
case '=': //托括號并接受下一個字符
popopstack(postack, _);
c = get);
changechar(c);
break;
case '>;': //退棧并將運算結(jié)果進棧
popopstack(postack, theta);
popdatastack(pdstack, b);
popdatastack(pdstack, a);
cc = operate(a, theta, b);
pushdatastack(pdstack, cc);
break;
}//switch
}//else
}//while
result = gettoppdatastack(pdstack); //運算結(jié)束時,運算數(shù)棧的棧底元素就是計算結(jié)果
clearpopstack(postack); //清空運算符棧
clearpdatastack(pdstack); //清空運算數(shù)棧
printf(' ->;計算結(jié)果為:%.2f ', result); //輸出運算結(jié)果
return ;
}
void print_user //歡迎界面
{
printf(' 歡迎使用c語言版模擬計算器 ');
printf('________________________________________________________________________ ');
printf(' |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| ');
printf(' | 模擬計算器使用說明 | ');
printf(' | 作者:謝先斌 | ');
printf(' | 本程序包括對'+'、'-'、'_'、'/'、''的運算 | ');
printf(' | 本程序中abs算用a替代、sqrt運算用s代替 | ');
printf(' | 本程序中的一切字母均不區(qū)分大小寫 | ');
printf(' 正確的表達式如:1+a(7-8)+s(9_8)= ');
printf(' | 輸入'='表示表達式輸入結(jié)束!! | ');
printf(' | 歡迎使用!!!-->;-->; | ');
printf(' |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| ');
printf('________________________________________________________________________ ');
}
int main //主函數(shù)
{
char in;
bool b; //標(biāo)識符,用來標(biāo)識是否結(jié)束程序
b = true; //初始化,不結(jié)束
print_user; //打印歡迎界面
printf(' _請確認使用計算器y/n:');
while(1)
{
scanf('%c', &in); //確認是否繼續(xù)操作
get); //吃掉會車,避免干擾
switch(in)
{
case 'y':
case 'y':
{
evaluatee_pression_r; //進入計算函數(shù):讀入表達式,并計算結(jié)果
break;
}
case 'n':
case 'n':
{
e_it_e;
b = false;
break;
}
//default:
// printf(' __輸入錯誤,請重新輸入y/n:');
// break;
}
if(b==false) //如果 b==false ,退出整個程序
break;
printf(' _您確定要繼續(xù)使用計算機y/n:');
get); //用getchar吃掉回車,避免對后續(xù)輸入中in的干擾
}
return 0;
}