第一篇:數(shù)據(jù)結(jié)構(gòu)實驗二報告
數(shù)據(jù)結(jié)構(gòu)實驗二報告
——簡單計算器
姓名:王稀賓 班 級:06111106 學(xué)號:1120111699 一實驗?zāi)康?/p>
按照四則運算加、減、乘、除、冪(^)和括號的優(yōu)先關(guān)系和慣例,編寫計算器程序。
二實驗內(nèi)容
要求:
從鍵盤輸入一個完整的表達(dá)式,以回車作為表達(dá)式輸入結(jié)束的標(biāo)志。輸入表達(dá)式中的數(shù)值均為大于等于零的整數(shù)。中間的計算過程如果出現(xiàn)小數(shù)也只取整。
三程序設(shè)計
程序模塊:
1輸入模塊,輸入多項式;
2計算模塊,根據(jù)輸入內(nèi)容,判斷分析,計算出結(jié)果; 3輸出模塊,輸出計算結(jié)果。
定義結(jié)構(gòu)創(chuàng)建結(jié)點: typedef struct { double data[50];int top;}OPND_Stack;//運算符結(jié)構(gòu)體 typedef struct { char data[50];int top;}OPTR_Stack;主函數(shù)部分: void main(){ char a[80];int m;char b[80];printf(“============簡易計算器============n”);printf(“[四則運算.如:-1+(2+3)*9/(-2)-6].n請輸入一個表達(dá)式:n”);while(1){
gets(a);
strcpy(b,a);
while(1)
{
int p;
m=strlen(a);
p=Can(a,m);
if(p==0)break;
printf(“輸入錯誤.請從新輸入表達(dá)式:n”);
gets(a);
strcpy(b,a);
}
printf(“=*=*=*=*=*=*表達(dá)式結(jié)果=*=*=*=*=*=*n”);
printf(“該表達(dá)式的結(jié)果為:n%s=%-10.3lfn”,b,EvaluateExpression(a));
printf(“=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*n”);
printf(“繼續(xù)使用[四則運算.如:-1+(2+3)*9/(-2)-6].<關(guān)閉退出>.n請再輸入 一個表達(dá)式:n”);} }
四程序調(diào)試分析
1在四則混合運算中,運算符號的優(yōu)先級比較難判斷。2心得體會: 我對編程是有很濃厚興趣的。在編程的過程中,我深深地體會到力不從心—有些知識沒能深入地理解和掌握以及VC++的許多功能沒能探索和了解使我編程時有好多的思想運用不上(如設(shè)計一個美觀的操作界面)。另外,我也感受到了數(shù)據(jù)結(jié)構(gòu)的重要性,有了結(jié)構(gòu)才能將好的思想付諸實踐。同時經(jīng)過查詢資料了解到棧由多種運用方法,其中包括棧的順序存儲結(jié)構(gòu)和鏈?zhǔn)酱鎯Y(jié)構(gòu),棧是計算表達(dá)式的經(jīng)典應(yīng)用。數(shù)據(jù)結(jié)構(gòu)中的許多結(jié)構(gòu)都是很經(jīng)典思想,只有把編程語言和數(shù)據(jù)結(jié)構(gòu)都熟練掌握的情況下,才能做出一些很好的作品。在編程過程中,雖然有時候是很發(fā)悶的,尤其是程序無錯但結(jié)果不對,但是在完成一個完整的程序時所帶來的喜悅是其它事情所不能替代的。我很喜歡編程,即使我的知識和能力有限,但我相信經(jīng)過努力,一切皆有可能。
五用戶使用說明
按要求正確輸入表達(dá)式即可得到結(jié)果。
六程序運行結(jié)果 附程序清單
#include
char OP[7]={'+','-','*','/','(',')','#'};//數(shù)據(jù)結(jié)構(gòu)體 typedef struct { double data[50];int top;}OPND_Stack;//運算符結(jié)構(gòu)體 typedef struct
{ char data[50];int top;}OPTR_Stack;//初始化運算符棧函數(shù)
void InitStack_R(OPTR_Stack *a){ a->top=-1;} //初始化數(shù)據(jù)站函數(shù)
void InitStack_D(OPND_Stack *a){ a->top=-1;} //運算符進(jìn)棧函數(shù)
void Push_R(OPTR_Stack *a,char b){ a->top++;a->data[a->top]=b;} //數(shù)據(jù)進(jìn)棧函數(shù)
void Push_D(OPND_Stack *a,double b){ a->top++;a->data[a->top]=b;} //取運算符棧頂符函數(shù)
void GetTop_R(OPTR_Stack *a,char *b){ *b=a->data[a->top];} //取數(shù)據(jù)棧頂數(shù)函數(shù)
void GetTop_D(OPND_Stack *a,double *b){ *b=a->data[a->top];} //判斷數(shù)據(jù)是否為運算符函數(shù) int In(char a,char *s){ for(int i=0;i<7;i++)
if(a==s[i])
return 1;return 0;} //算符優(yōu)先級判斷函數(shù)
char Precede(char a,char b){ int m,n;for(int i=0;i<7;i++){
if(a==OP[i])
m=i;
if(b==OP[i])
n=i;} return First[m][n];} //刪除運算符棧頂元素,并取新棧的棧頂元素 void Pop_R(OPTR_Stack *a,char *b){ a->top--;*b=a->data[a->top];} //取數(shù)據(jù)站的棧頂元素,并從棧中刪除此元素 void Pop_D(OPND_Stack *a,double *b){ *b=a->data[a->top];a->top--;} //算符優(yōu)先算法求值核心函數(shù)
double EvaluateExpression(char *s){ OPND_Stack OPND;OPTR_Stack OPTR;char ch,theta;double x,a,b;int k=0;strcat(s,“#”);InitStack_R(&OPTR);Push_R(&OPTR,'#');InitStack_D(&OPND);GetTop_R(&OPTR,&ch);while(s[k]!='#'||ch!='#'){
if(In(s[k],OP)==0)
{
x=Getdouble(s,&k);
Push_D(&OPND,x);
}
else
{
switch(Precede(ch,s[k]))
{
case'<':Push_R(&OPTR,s[k]);
k++;
break;
case'=':Pop_R(&OPTR,&ch);
k++;
break;
case'>':GetTop_R(&OPTR,&theta);Pop_R(&OPTR,&ch);
Pop_D(&OPND,&b);Pop_D(&OPND,&a);
Push_D(&OPND,Operate(a,theta,b));
break;
}
}
GetTop_R(&OPTR,&ch);} GetTop_D(&OPND,&x);return x;InitStack_R(&OPTR);Push_R(&OPTR,'#');InitStack_D(&OPND);} //判斷表達(dá)式是否輸入正確.int Can(char a[],int n){ int p=0,s=0,t=0;for(int i=0;i if(a[i]=='('||a[i]==')') p++; if((a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/')&&((a[i+1]<'0'&&a[i+1]!='(')||a[i+1]>'9')) s++; if(a[i]=='/'&&a[i+1]=='0') s++; if((a[i]=='('&&(a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/'))||(a[i]==')'&&a[i+1]=='(')) s++; if(a[i]==')'&&a[i+1]!='