逆波蘭式的產生與計算_第1頁
逆波蘭式的產生與計算_第2頁
逆波蘭式的產生與計算_第3頁
逆波蘭式的產生與計算_第4頁
逆波蘭式的產生與計算_第5頁
已閱讀5頁,還剩3頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、精選優質文檔-傾情為你奉上計算機科學與技術系 實 驗 報 告專業名稱 計算機科學與技術 課程名稱 編譯原理 項目名稱 逆波蘭式的產生與計算 班 級 學 號 姓 名 同組人員 無 實驗日期 2016.12.21 一、實驗目的與要求: (簡述本次實驗要求達到的目的,涉及到的相關知識點,實驗的具體要求。)目的:1、 將非后綴式用來表示的算術表達式轉換為用逆波蘭式來表示的算術表達式,并計算用逆波蘭式來表示的算術表達式的值;2、 掌握自底向上分析中算符優先分析法的基本原理; 3、 掌握優先關系表的構造方法。要求:根據介紹的算術表達式文法編制調試算符優先分析程序,以便對任意輸入的簡單算術表達式進

2、行分析。將用中綴式表示的算術表達式轉換為用逆波蘭式(后綴式)表示的算術表達式,并計算用逆波蘭式表示的算術表達式的值。 程序輸入一以#結束的符號串,如:2*(3+4)#。輸出過程如下: (1) 逆波蘭式(后綴式)為:2#3#4#+*;(2) (2)計算結果:14。二、實驗內容(根據本次實驗項目的具體任務和要求,完成相關內容,可包括:實驗目的、算法原理、實驗儀器、設備選型及連線圖、算法描述或流程圖、源代碼、實驗運行步驟、關鍵技術分析、測試數據與實驗結果、其他) 具體任務:輸出的格式如下:(1)逆波蘭式的生成及計算程序,編制人:姓名,學號,班級(2)輸入一以#結束的中綴表達式(包括+*/()數字#)

3、:在此位置輸入符號串如(28+68)*2# (3)逆波蘭式為:28&68+2* (4)逆波蘭式28&68+2*計算結果為192備注:(1)在生成的逆波蘭式中如果兩個數相連則用&分隔,如28和68,中間用&分隔;(2)在此位置輸入符號串為用戶自行輸入的符號串。原理:逆波蘭式是將平時我們正常寫入的表達式變成后綴式表達式,將符號后入,括號不入,逆波蘭式根據符號對應的幾目運算符,將輸出幾個操作數進行運算,因此將不需要括號來進行優先級。編寫逆波蘭式時,需要判別是數字還是符號,數字的話就將其入棧,符號的話就先入符號棧,再下一個符號來臨入棧之前,將上一個入棧的符號入進存放操作

4、數的數組,其中順序必須依次來,不能亂,在符號入棧結束之后,符號棧中將還會剩有兩個符號,開始和結束的,此時將這兩個符號按順序入棧即可,至此完成逆波蘭式。流程圖:代碼:#include<stdio.h>#include <stdlib.h>#include<math.h>#define max 100char exmax;/ex數組用來存放逆波蘭式void trans()char strmax;char stackmax; /存表達式的符號char ch;int sum,i,j,t,top=0;printf("*請輸入一個求值的表達式,以#結束:n&q

5、uot;);printf("*n");printf("您的算數表達式為:");i=0;/進行初始化,從鍵盤輸入表達式doi+;scanf("%c",&stri);/從鍵盤輸入的字符裝入字符數組str中while(stri!='#' && i!=max);/以#為結束sum=i;/i=輸入字符的個數,sum=it=1;i=1;/i歸1ch=stri;/將數組的第一個字符給chi+;while(ch!='#')/當字符不為#時進入循環switch(ch)case '('

6、;: /字符為(時,top+;/當字符為(時,將該字符入棧stacktop=ch;break;case ')': /字符為)時while(stacktop!='(')/當棧頂的元素不為左括號(時ext=stacktop;top-;t+;/當棧頂的元素不為左括號時,將現在棧頂中(以前的都進入數組top-; /遇到(的時候 直接跳過break;case '+': /字符為+時,case '-': /字符為-時,while(top!=0&&stacktop!='(')ext=stacktop;top-;t

7、+;top+;stacktop=ch;break;case '*': /字符為*時,case '/': /字符為/時,while(stacktop='*'|stacktop='/')ext=stacktop;top-;t+;top+;stacktop=ch;break;case ' ':break;/字符為空格時,default:while(ch>='0'&&ch<='9')ext=ch;t+;ch=stri;i+;/現在指針+為取讀下一個字符i-;/一開

8、始進行了+ext='#'t+;ch=stri;i+;while(top!=0)ext=stacktop;/在棧中元素中加上后面的符號t+;top-;ext='#'printf("*n");printf("原來表達式:");for(j=1;j<sum;j+) printf("%c",strj);printf("n*n");printf("逆波蘭式:");for(j=1;j<t;j+)printf("%c",exj);void comp

9、value()float stackmax,d;char ch;int t=1,top=0;ch=ext;t+;while(ch!='#')switch(ch)case '+': stacktop-1=stacktop-1+stacktop;top-;break;case '-':stacktop-1=stacktop-1-stacktop; top-; break;case '*':stacktop-1=stacktop-1*stacktop;top-; break;case '/':if(stacktop!=0

10、) stacktop-1=stacktop-1/stacktop;elseprintf("nt除零錯誤!n");exit(0);top-;break;default: d=0;while(ch>='0'&&ch<='9')d=ch-'0' /現在ch 存的是數字的ASCII碼 將ch轉換成要表達的數字ch=ext;t+;top+;stacktop=d;ch=ext;t+;printf("n*n");printf("計算結果為:%g n",stacktop);m

11、ain()trans();compvalue();實驗分析都已經在代碼后面進行了詳細注釋。截圖:實驗結果與手動計算結果一致。 三、實驗分析與小結:(實驗過程中的問題分析、產生的原因以及解決方法;實驗結果分析; 有待優化思路) 經過這個實驗的練習,通過對程序的分析,對逆波蘭式有了更詳細的了解,本來對逆波蘭式的符號和操作數的先后順序還有一些不清楚,但是在了解完這個程序就就對逆波蘭式很清楚了,了解了逆波蘭式的原理,程序分析的時候,在把輸入的符號串進行分析的時候,需要一個個進行判斷輸入的符號是否是操作數還是符號,將其進行分開存放,在下一個運算符進棧的時候,將前一個不是括號的符號入數組,碰見括號需要特別處理,因為在逆波蘭式中并不需要括號,所以括號不需要入數組,需要跳過,在識別的時候也需要特別處理。當其分析完畢后,將符號進

溫馨提示

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

評論

0/150

提交評論