簡單的LISP算術(shù)表達式計算器_第1頁
簡單的LISP算術(shù)表達式計算器_第2頁
簡單的LISP算術(shù)表達式計算器_第3頁
簡單的LISP算術(shù)表達式計算器_第4頁
簡單的LISP算術(shù)表達式計算器_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、沈陽航空工業(yè)學(xué)院課 程 設(shè) 計(說明書)簡單LISP 算術(shù)表達式計算器 班級 / 學(xué)號 7402101-024 學(xué) 生 姓 名 田青林 指 導(dǎo) 教 師 賈亮 一、 題目分析 本題目是設(shè)計一個簡單的LISP算術(shù)表達式計算器。 簡單LISP算術(shù)表達式(以下簡稱表達式)定義如下: (1) 一個0.9的整數(shù);或者 (2) (運算符 表達式 表達式) 例如,6,(+45),(+(+25)8)都是表達式,其值分別為6,9和15。算術(shù)表達式不同于普通的普通的表達式,不是簡單的從左向右(或是從右向左)的計算, 它包含了算術(shù)運算符和算術(shù)量,計算的過程就是要根據(jù)算術(shù)運算符的優(yōu)先關(guān)系將其所對應(yīng)得量的每一位

2、進行計算,最后得到結(jié)果。初步思想是建立一個棧列,將變量存儲進去,通過每步中對頭兩個算術(shù)量的求和,最后將結(jié)果存儲到棧頭,輸出。運算的要點如下:從左到右地掃描表達式(1) 掃描到操作數(shù)時,直接輸出。(2) 第二次掃描到(時進行遞歸調(diào)用,從頭進行掃描。(3) 掃描到算術(shù)量時將其壓入棧,并與前一個壓入棧的算術(shù)量求和。(4) 最后的棧頭元素即為所求。二、 設(shè)計過程(程序流程圖) 根據(jù)本課設(shè)題目的要求,本設(shè)計程序依據(jù)利用棧依次從里向外計算括號內(nèi)數(shù)的思想設(shè)計成一個簡單的LISP算術(shù)表達式計算器。該程序首先建立一個棧,通過PUSH函數(shù)和POP函數(shù)的入棧,出棧功能實現(xiàn)棧中元素“先進后出,后進先出”的特性。然后動

3、態(tài)建立一大小為K的整型數(shù)組,把開辟的數(shù)組指針賦給a,從而實現(xiàn)棧函數(shù)的構(gòu)造過程。然后再建立棧的對象,再建立一個字符型數(shù)組ch,然后向該數(shù)組輸入表達式,最后進入表達式判斷階段。若LISP表達式為一操作數(shù),則直接輸出;若該表達式為運算符,則經(jīng)過主函數(shù)的掃描計算,最終輸出結(jié)果。2.1棧的建立這是一個子函數(shù)stack(int k=100),首先建立一個足夠大的棧,動態(tài)定義其大小為100,然后對其置空初始化,再根據(jù)判斷其是否為空返回不同的值。其設(shè)計流程圖如圖1。 開始 定義棧a 初始化棧a N是否為空?Y Top=big Top=-1返回top 圖1:棧的建立 2.2入棧這是一個子函數(shù)PUSH,首先賦給輸

4、入值k,再判斷棧是否為非空,若為非空則將k壓入棧中;若為滿棧,則輸出錯誤。其流程圖如圖2所示。 開始 輸入k值 N !full( )?Ywrong pushatop=k top+ 返回 圖2:PUSH函數(shù)2.3出棧這是一個子函數(shù)POP,首先判斷是否非空,若是則輸出棧頭元素atop,若不是,則返回0并參與運算。其設(shè)計流程圖如圖3所示。 開始!empty( )?返回0 返回atop top- 結(jié)束圖3:POP函數(shù)2.4構(gòu)建函數(shù)首先動態(tài)開辟一個大小為K的數(shù)組,然后把開辟數(shù)組的指針賦給a,然后將K-1賦給Big,將-1賦給Top,從而實現(xiàn)函數(shù)的構(gòu)造過程,函數(shù)構(gòu)造完畢,退出此進程,此段程序結(jié)束。其設(shè)計流

5、程圖如圖4所示。 開始動態(tài)開辟一個大小為k的數(shù)組把開辟數(shù)組的指針賦給a big=k-1 top=-1 結(jié)束 圖4:構(gòu)建函數(shù)2.5主函數(shù)這是整個程序的核心所在。首先要建立一個棧V1,將所求表達式賦值給字符變量ch。接下來就是從頭掃描字符,這也是一個循環(huán)的過程。若chi不是(,則直接入棧,若是則跳向下下個字符,;再判斷是不是(,若不是,則將chi入棧,跳向下一個字符;再判斷是不是(,若還不是則入棧。這其中若是,若是則都要進行從頭掃描。接下來進行一個總的判斷“!=(&&!=)?”, 若成立,跳向下一字符,若不成立跳過本步;接下來判斷是否為),若是則把入棧的兩個元素出棧后相加再入棧,跳

6、向下一字符。最后對此循環(huán)作一個判斷,若chi是0則接著進行循環(huán),若不是則跳出循環(huán)輸出棧頂元素,即為所求。其設(shè)計流程如圖5所示。三、調(diào)試過程及實驗結(jié)果 3.1調(diào)試過程:本程序在調(diào)試的過程中遇到了很多問題,首先程序中有不少的綴余成分,尤其是總循環(huán)的部分本來就是一個很復(fù)雜的邏輯問題,有綴余更是會使理解難上加難,這一部分是通過一步一步調(diào)試更正的。最后得到的程序能完成題目中所給的要求。主要的主函數(shù)的修改如下圖所示。 修改前 修改后3.2實驗結(jié)果:(1)運行程序之后,會看到一個如 圖6所示的LISP計算器的界面,還可以看到題目要求、姓名、學(xué)號、指導(dǎo)老師等。這也是一個待輸入界面。 開始建立棧V1 i=0輸入

7、chN輸出v1.pop()chi!=0?YN 結(jié)束chi='('?Ychi!=')'? i=i+2chi='c'?YN將chi入棧i=i+1Nchi='c'?Y將chi入棧Nchi!=')'&&chi!='('?Y i=i+1chi=')'?YNv1.push(v1.pop()+v1.pop();i+ 圖5:主函數(shù)圖6:計算器界面 (2)每一次輸入數(shù)據(jù)以后,都要回車再輸入ctrl+z,然后再回車,就能得到所需結(jié)果。這其中ctrl+z是結(jié)束流。首先計算6。如圖7所示。圖

8、7:計算“6” (3)計算(+45),如圖8所示。圖8:計算(+45) (4)計算(+(+(+12)(+34)(+(+56)(+78),計算過程如圖10所示。圖10:計算(+(+(+12)(+34)(+(+56)(+78)四、結(jié)論 本程序十分簡潔,且理解上也比較容易,完成了簡單的算術(shù)表達式的計算問題,但是沒能夠?qū)崿F(xiàn)其四則運算的問題,還有按照原思路應(yīng)該是建立兩個棧,一個存放數(shù)值,一個存放運算符,比較運算符的優(yōu)先級然后對其控制的值作相應(yīng)的運算。由于本人軟件知識有限,所以得出的程序只是實現(xiàn)了片面的功能,對運算符采取了跳過的處理方式,只對表達式中的值作和,再輸出。經(jīng)過了將近兩周的軟件課設(shè),根據(jù)題目要求

9、對源程序作了相當大的改動,這其中包括對綴余程序的刪除,對錯誤程序的修正。另外程序參考了網(wǎng)上的模版,但其中不明白的地方有很多,問了很多人,也查閱了以前學(xué)過的關(guān)于棧的知識,最后也不是徹底的能弄明白。我對于我的程序不是很滿意,因為這并不是一個簡單的LISP計算器,計算器最起碼能進行四則運算,但此計算器只能完成類似題目中所給的運算。雖然程序有些欠缺的地方,但畢竟是花了十多天的時間在程序上,收獲還是很多的,算是對一學(xué)期的軟件課作了一個總結(jié),也從搜索資料中學(xué)會了運用圖書館和網(wǎng)絡(luò),總之軟件課設(shè)使我受益匪淺,對以后的工作和學(xué)習都有很大的幫助。五、程序清單#include<iostream.h>in

10、t y=0;class stackpublic:stack(int k=100)a=new intk; big=k-1; top=-1;bool empty()return top=-1;bool full()return top=big; /入棧void push(int k) if(!full() a+top=k; else cout<<"wrong push"<<endl; return;/出棧int pop()if(!empty() return atop-; else return 0;/使其參與運算private:int big;int

11、top;int*a;void main()stack v1;char ch100;cout<<"本程序為簡單的LISP算術(shù)表達式計算器,可以實現(xiàn)LISP加法表達式求值"<<endl<<endl;cout<<" "<<endl;cout<<" 正確格式的測試數(shù)據(jù):6,(+45),(+(+25)8),(+2(+58), "<<endl;cout<<" (+(+(+12)(+34)(+(+56)(+78)"<<en

12、dl;cout<<" 結(jié)果:6,9,15,15,36 "<<endl;cout<<" "<<endl;cout<<" 設(shè)計者: 張強 學(xué)號:2008040201122 "<<endl;cout<<"="<<endl;cout<<" 請輸入表達式數(shù)據(jù): "<<endl;while(cin>>ch);int i=0;while(chi!=0) if(chi='(

13、') i=i+2; if(chi='(') continue; v1.push(chi-48); i+; if(chi='(') continue; v1.push(chi-48); else if(chi!=')')v1.push(chi-48); if(chi!=')'&&chi!='(') i+; if(chi=')')v1.push(v1.pop()+v1.pop(); i+; cout<<"結(jié)果: "<<endl;cout<<v1.pop()<<endl; else if(ch

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論