第一篇:C++ 數(shù)據(jù)結(jié)構(gòu) 課程設(shè)計(jì)報(bào)告 計(jì)算表達(dá)式
題目:計(jì)算表達(dá)式的值
1、問題描述
對(duì)于給定的一個(gè)表達(dá)式,表達(dá)式中可以包括常數(shù)、算術(shù)運(yùn)行符(“+”、“-”、“*”、“/”)和括號(hào),編寫程序計(jì)算表達(dá)式的值。
基本要求:從鍵盤輸入一個(gè)正確的中綴表達(dá)式,將中綴表達(dá)式轉(zhuǎn)換為對(duì)應(yīng)的后綴表達(dá)式,計(jì)算后綴表達(dá)式的值。
提高要求:(1)對(duì)于表達(dá)式中的簡單錯(cuò)誤,能夠給出提示;
(2)不僅提示錯(cuò)誤,也能給出錯(cuò)誤信息(3)表達(dá)式中可以包括單個(gè)字母表示的變量(4)能夠處理多種操作符(5)實(shí)現(xiàn)包含簡單運(yùn)算的計(jì)算器
(6)實(shí)現(xiàn)一個(gè)包含簡單運(yùn)算和函數(shù)運(yùn)算的計(jì)算器。
2.需求分析
軟件的基本功能:由鍵盤輸入中綴表達(dá)式,程序可以將輸入的中綴表達(dá)式轉(zhuǎn)換成對(duì)應(yīng)的后綴表達(dá)式,并計(jì)算后綴表達(dá)式的值。對(duì)于在輸入時(shí)發(fā)生的簡單錯(cuò)誤,程序可以給出提示。本程序支持整數(shù)、小數(shù)、多種操作數(shù)的處理,可以計(jì)算含加、減、乘、除、運(yùn)算符的表達(dá)式,并能判斷表達(dá)式括號(hào)是否匹配。輸入/輸出形式:用戶可以通過控制臺(tái),根據(jù)輸入提示。輸入形式:
①正確的不含字母變量的中綴表達(dá)式; ②含有簡單錯(cuò)誤的中綴表達(dá)式。
輸出形式:
①對(duì)于正確的中綴表達(dá)式,可以輸出其轉(zhuǎn)化后的后綴表達(dá)式及表達(dá)式的計(jì)算結(jié)果;
②對(duì)于含有簡單錯(cuò)誤的中綴表達(dá)式,程序?qū)⒆詣?dòng)輸出錯(cuò)誤提示,并給出錯(cuò)誤信息。
測試數(shù)據(jù)要求:用戶可以輸入一個(gè)符合要求的中綴表達(dá)式,也可以輸入一個(gè)包含簡單錯(cuò)誤的表達(dá)式。表達(dá)式中可以包括各種類型的常數(shù)以及小數(shù)等,操作符包括(+、-、*、/),同時(shí)表達(dá)式還可以包括各種括號(hào)。
3.概要設(shè)計(jì)
(1)抽象數(shù)據(jù)類型:
根據(jù)題目的要求,考慮用棧類型比較適合。ADT SeqStack Data 棧中元素具有相同類型及后進(jìn)先出特性,相鄰元素具有前驅(qū)和后繼關(guān)系 Operation SeqStack 前置條件:棧不存在
輸入:無
功能:棧的初始化
輸出:無
后置條件:構(gòu)造一個(gè)空棧 ~ SeqStack 前置條件:棧已存在輸入:無
功能:銷毀棧 輸出:無
后置條件:釋放棧所占用的存儲(chǔ)空間
Push 前置條件:棧已存在
輸入:元素值x 功能:在棧頂插入一個(gè)元素x 輸出:如果插入不成功,拋出異常
后置條件:如果插入成功,棧頂增加了一個(gè)元素 Pop 前置條件:棧已存在輸入:無
功能:刪除棧頂元素
輸出:如果刪除成功,返回被刪元素值,否則,拋出異常
后置條件:如果刪除成功,棧頂減少了一個(gè)元素 GetTop 前置條件:棧已存在
輸入:無
功能:讀取當(dāng)前的棧頂元素
輸出:若棧不空,返回當(dāng)前的棧頂元素值 后置條件:棧不變
Empty 前置條件:棧已存在輸入:無
功能:判斷棧是否為空
輸出:如果棧為空,返回1;否則,返回0 后置條件:棧不變
End ADT 4.詳細(xì)設(shè)計(jì)
(1)實(shí)現(xiàn)概要設(shè)計(jì)的數(shù)據(jù)類型:
采用順序棧
const int StackSize = 50;template
~SeqStack();//析構(gòu)函數(shù)
void Push(T x);//將元素x入棧
DataType Pop();
//將棧頂元素彈出
DataType GetTop();//取棧頂元素(并不刪除)
int Empty();//判斷棧是否為空
private:
DataType data[StackSize];//存放棧元素的數(shù)組
int top;//棧頂元素 };(2)主程序以及其它模塊的算法描述:
這個(gè)函數(shù)主要調(diào)用了實(shí)現(xiàn)功能的各個(gè)函數(shù)。其步驟為:在用戶沒有選擇退出時(shí),先調(diào)用輸入函數(shù),輸入中綴表達(dá)式;然后調(diào)用判斷表達(dá)式,如果中綴表達(dá)式錯(cuò)誤,則根據(jù)返回的值來輸出錯(cuò)誤提示,不再往下運(yùn)算;如果中綴表達(dá)式正確,則將中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式,然后輸出中綴表達(dá)式和轉(zhuǎn)換后的后綴表達(dá)式;接著,再調(diào)用計(jì)算函數(shù),計(jì)算后綴表達(dá)式的結(jié)果輸出。最后是清屏函數(shù)。直至用戶選擇退出。
5、編碼與調(diào)試分析
編碼與調(diào)試過程中遇到的問題及解決辦法:
【問題1】程序在判斷表達(dá)式輸入形式有誤時(shí),考慮情況不周全。解決辦法:盡可能多的將表達(dá)式有誤的情況考慮在內(nèi)。以下為現(xiàn)已考慮到并解決的問題:①表達(dá)式中出現(xiàn)非數(shù)字或非運(yùn)算符的其他字符; ②表達(dá)式中括號(hào)不匹配。
【問題2】給變量賦值時(shí)出現(xiàn)重定義問題。
解決辦法:在定義暫存棧頂元素的變量t時(shí),應(yīng)該在函數(shù)外面定義,在函數(shù)里面給變量賦值時(shí)不能定義。【問題3】無法處理多位數(shù)和小數(shù)。
解決辦法:在連續(xù)的操作數(shù)結(jié)束之后插入空格到后綴表達(dá)式中,以分隔操作數(shù)。
解決此問題的核心代碼: int i,t=0;float sum=0;for(i=0;i if(a[i]=='.'){ } } t=i;break;if(t!=0){ } else { } return sum; 2.待解決問題: for(i=0;i } i++;for(;i } sum=(a[i]-'0')*pow(0.1,i-t)+sum;if(a[i]=='.')break;sum=(a[i]-'0')*pow(10,n-(n-t)-1-i)+sum;for(i=0;i 6、使用說明 進(jìn)入菜單,根據(jù)提示進(jìn)行選擇。 7、測試結(jié)果 (1)含小數(shù)、多位數(shù)及括號(hào)的表達(dá)式顯示結(jié)果: 8、自學(xué)知識(shí) 在課程設(shè)計(jì)過程中,特別是在代碼編寫和調(diào)試的過程中,自學(xué)了很多新的知識(shí)。例如atof()函數(shù),包含于表頭文件 #include