計算器程序編程實(shí)習(xí)報告范本_第1頁
計算器程序編程實(shí)習(xí)報告范本_第2頁
計算器程序編程實(shí)習(xí)報告范本_第3頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、程序?qū)嵙?xí)報告、需求分析: 編寫簡易計算器程序,主要實(shí)現(xiàn)四則運(yùn)算,運(yùn)算符號包括“一” “+”“/” “*”(” “)”按照“先乘除后加減,先算括號內(nèi)后算括號外,從左到右”的原則的原則進(jìn)行計算。考慮到程序的編寫困難度, 暫時不予考慮多位數(shù)的四則運(yùn)算,也不考慮平方、階乘、三角函數(shù)的 運(yùn)算。只進(jìn)行一位數(shù)的四則運(yùn)算,所需要的內(nèi)存空間不會很大,也就 放棄空間不足自動添加空間的情況。輸入:輸入一個只含一位數(shù)的四則運(yùn)算式,以 #結(jié)束,運(yùn)算符只包括“一”,“ +” “*” “/” “(” “)”輸出:直接輸出結(jié)果“結(jié)果是:”測試數(shù)據(jù):例如9 ( 3 2)*3 1#二、概要設(shè)計:開始從鍵盤上獲取鍵入字符 c獲取棧

2、丿元素戔頂1輸出結(jié)果C!=# 或Gettop!='#"棧頂元素比C的優(yōu)先級將字符壓入 OPTR結(jié)束出棧執(zhí)行將字符壓入operate,壓脫括號棧 OPTR棧三、詳細(xì)設(shè)計:1、主函數(shù) 首先定義兩個棧,分別取名是 OPTR,OPND其中OPTF存放 字符,OPN存放數(shù)字。將optr中壓入#作為棧底元素,然后從鍵盤上獲取表達(dá)式的字符 如果是數(shù)字,將該字符轉(zhuǎn)化為數(shù)字,壓入到棧opnd中。如果是字符,和optr的棧頂元素比較優(yōu)先級1, 、棧頂元素優(yōu)先級 <鍵入的元素,該調(diào)用 push()函數(shù),將字符 壓入到optr棧中2、 如果棧頂元素的優(yōu)先級等于鍵入元素,則得知此符號為括號, 調(diào)

3、用pop()函數(shù),將該字符棧中的棧頂元素退出,即為脫括號。3、 如果棧頂元素的優(yōu)先級高于鍵入元素,調(diào)用pop()函數(shù),分別將取兩次數(shù)字棧的棧頂元素 ,pop(op nd,b),pop(op nd,a),同時將optr中的棧頂元素去取出,pop(optr,theta), 調(diào)用operate()函數(shù), 進(jìn)行計算。將operate ( a,theta,b)壓入到op nd棧中,繼續(xù)進(jìn)行循 環(huán)。直到#結(jié)束。模塊1、定義2中棧,定義棧,區(qū)分兩種數(shù)據(jù)類型typedef struct int stackMAXSIZE;int top;SqStack;模塊2、定義兩種出棧入棧函數(shù),以便后來調(diào)用不同數(shù)據(jù)類型的p

4、op(*s,x),.push(*s,*x ) ; int Push1(SqStack *s,int x) if(s->top>=MAXSIZE)prin tf("ERROR,Overflow!n");elses->stack s->top =x;s->top+;return 1;函數(shù),利用switch ()語句來寫定義3個實(shí)參,int a,b char theta;代表運(yùn)算符,依次判斷運(yùn)算符的+ *,/,情況,進(jìn)行運(yùn)算, 令 a= a+c,a=a-c,a=a*c,a=a/c,返回a的值模塊3、Operate函數(shù)定義: operate opera

5、te©nt a,char b,int c) thetaswitch(b) case'+':a=a+c;break; case'-':a=a-c;break; case'*':a=a*c;break; case'/':a=a/c;break; return a;模4、優(yōu)先級判斷將+*/ ()#的優(yōu)先級做成如下的圖'>''>''<''<''<''>''>'J J J J J

6、 J J* '>''>''>''>''<''>''>'JJJJJJJ/ '>''>''>''>''<''>''>'*JJJJJJJ('v','v','v','v','v','=', 0 ,) &#

7、39;>','>','>','>',0,'>','>',# 'v','v','v','v','v',0 ,'=',尋找優(yōu)先級即將左表中的對應(yīng)坐標(biāo)用程序語言找到即可,設(shè)計一個二維數(shù)組,str7,7, 將字符進(jìn)行定位,i,j分別代表橫縱坐標(biāo),利用 switch,語句進(jìn)行選擇,對應(yīng)的strij即為優(yōu)先級符號,所以將strij, 作為函數(shù)的返回值調(diào)試中的問題:1、最初只定義了一種數(shù)據(jù)類

8、型的棧,出棧入棧函數(shù)也只有一種int數(shù)據(jù)類型,導(dǎo)致之后的函數(shù)調(diào)用數(shù)據(jù)類型不匹配,無法識別。2、在定義入棧函數(shù)時,未能將 push(*s,*x)中的x定義成指針 類型,在pop(*s,x)中誤將x定義成指針類型。3、在調(diào)用函數(shù)時對棧的調(diào)用中數(shù)據(jù)類型不一致。4、對主函數(shù),從鍵盤鍵入的 C為字符型,沒有能夠?qū)⒆址娃D(zhuǎn) 化成整型進(jìn)行計算,使得在計算中是用的09的ASCII碼值進(jìn)行 的計算,在 ASCII碼表中09的ASCII碼表依次為4857,intm,m=c 48,即 c'-48,得到真實(shí)的數(shù)值。5、 取棧頂元素的函數(shù)定義錯誤, 使得程序無法進(jìn)行,由于gettop 函數(shù)定義錯誤,在optr中

9、一直重復(fù)取#的循環(huán)運(yùn)算,導(dǎo)致“ error Underflow ”刷屏出現(xiàn)。源代碼;#include<stdio.h>#in cludevstri ng.h>#in clude<ctype.h>#defi ne MAXSIZE 100#defi ne true 1#defi ne false 0typedef struct /定義堆棧數(shù)據(jù)類型int stackMAXSIZE;int top;SqStack;定義堆棧數(shù)據(jù)類型typedef struct /char stackMAXSIZE;int top;sqstack;void In itStack(SqStac

10、k *s)/初始化棧,棧頂指針為s->top =0;void In itStack2(sqstack *s)/初始化棧,棧頂指針為s->top =0;int Push1(SqStack *s,i nt x)/ 入棧if(s->top>=MAXSIZE)prin tf("ERROR,Overflow!n"); elses->stack s->top =x;s->top+;return 1;int Gettop1(SqStack *s,i nt *x)/ 取棧頂元素if(s->top=0)prin tf("error,g

11、ettop1");return 0;else*x=s->stacks->top;return 1;出棧int Pop1(SqStack *s,i nt *x)/if(s->top =0)prin tf("ERROR,pop1!n");elses->top -;*x=s->stacks->top;return 1;char Push2(sqstack *s,char x)/ 入棧if(s->top =MAXSIZE+1)prin tf("ERROR,push2!n");elses->stack s-

12、>top =x;s->top+;return 1;取棧頂元素char Gettop2(sqstack *s,char *ch)/if(s->top>0) *ch=s->stacks->top-1;retur n *ch;elsereturn 0;char Pop2(sqstack *s,char *x)/出棧if(s->top =0)prin tf("ERR0R,pop2!n"); elses->top -;*x=s->stacks->top;char procede(char c1,char c2)int i=O

13、,j=O;char str7='>''>''<''<''<''>''>'J J J J J J J'>''>''<''<''<''>''>'J J J J J J J'>''>''>''>''&l

14、t;''>''>'JJJJJJJ'>''>''>''>''<''>''>'JJJJJJJ'<''<''<''<''<''='0'>''>''>''>'0 '>'

15、;'>''<''<''<''<''<'0 '=' ;switch(cl)case'+':i=O;break;case'-':i=1;break;case'*':i=2;break;case'/':i=3;break;case'(':i=4;break;case')':i=5;break;case'#':i=6;break;switch(c

16、2)case'+':j=O;break;case'-':j=1;break;case'*':j=2;break;case'/':j=3;break;case'(':j=4;break;case')':j=5;break; case'#':j=6;break;return(strij);/返回優(yōu)先級判斷結(jié)果intoperate(i nt a,char b,i nt c)switch(b) case'+':a=a+c;break;case'-':a=a-c

17、;break;case'*':a=a*c;break;case'/':a=a/c;break; return a;mai n()sqstack OPTR;SqStack OPND;char theta,c,x;int a,b,m ;In itStack2(&OPTR);Push2(&OPTR, '#');In itStack(&OPND);printf(”請輸入一個計算式,以#結(jié)束n");c=getchar(); while (c!='#'| OPTR.stackOPTR.top-1!='#') if(c>='0'&&c<='9')m=c-48;Push1(&OPND,m);c=getchar();elseswitch(procede(OPTR.stackOPTR.top-1,c)case'v':Push2(&

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論