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