数据结构实验二报告由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“数据结构实验报告二”。
数据结构实验二报告
——简单计算器
姓名:王稀宾 班 级:06111106 学号:1120111699 一实验目的 按照四则运算加、减、乘、除、幂(^)和括号的优先关系和惯例,编写计算器程序。
二实验内容
要求:
从键盘输入一个完整的表达式,以回车作为表达式输入结束的标志。输入表达式中的数值均为大于等于零的整数。中间的计算过程如果出现小数也只取整。
三程序设计
程序模块:
1输入模块,输入多项式;
2计算模块,根据输入内容,判断分析,计算出结果; 3输出模块,输出计算结果。
定义结构创建结点: typedef struct { double data[50];int top;}OPND_Stack;//运算符结构体 typedef struct { char data[50];int top;}OPTR_Stack;主函数部分: void main(){ char a[80];int m;char b[80];printf(“============简易计算器============n”);printf(“[四则运算.如:-1+(2+3)*9/(-2)-6].n请输入一个表达式:n”);while(1){
gets(a);
strcpy(b,a);
while(1)
{
int p;
m=strlen(a);
p=Can(a,m);
if(p==0)break;
printf(“输入错误.请从新输入表达式:n”);
gets(a);
strcpy(b,a);
}
printf(“=*=*=*=*=*=*表达式结果=*=*=*=*=*=*n”);
printf(“该表达式的结果为:n%s=%-10.3lfn”,b,EvaluateExpreion(a));
printf(“=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*n”);
printf(“继续使用[四则运算.如:-1+(2+3)*9/(-2)-6]..n请再输入 一个表达式:n”);} }
四程序调试分析
1在四则混合运算中,运算符号的优先级比较难判断。2心得体会: 我对编程是有很浓厚兴趣的。在编程的过程中,我深深地体会到力不从心—有些知识没能深入地理解和掌握以及VC++的许多功能没能探索和了解使我编程时有好多的思想运用不上(如设计一个美观的操作界面)。另外,我也感受到了数据结构的重要性,有了结构才能将好的思想付诸实践。同时经过查询资料了解到栈由多种运用方法,其中包括栈的顺序存储结构和链式存储结构,栈是计算表达式的经典应用。数据结构中的许多结构都是很经典思想,只有把编程语言和数据结构都熟练掌握的情况下,才能做出一些很好的作品。在编程过程中,虽然有时候是很发闷的,尤其是程序无错但结果不对,但是在完成一个完整的程序时所带来的喜悦是其它事情所不能替代的。我很喜欢编程,即使我的知识和能力有限,但我相信经过努力,一切皆有可能。
五用户使用说明
按要求正确输入表达式即可得到结果。
六程序运行结果 附程序清单
#include #include #include //算符优先级表 char First[7][7]= { //'+','-','*','/','(',')','^' /*'+'*/ '>','>','','','>','','','>','>','>','','','>','>','>','','','>','>','>','>','>',' >', /*')'*/ '','','>','>','>',' ','
char OP[7]={'+','-','*','/','(',')','#'};//数据结构体 typedef struct { double data[50];int top;}OPND_Stack;//运算符结构体 typedef struct
{ char data[50];int top;}OPTR_Stack;//初始化运算符栈函数
void InitStack_R(OPTR_Stack *a){ a->top=-1;} //初始化数据站函数
void InitStack_D(OPND_Stack *a){ a->top=-1;} //运算符进栈函数
void Push_R(OPTR_Stack *a,char b){ a->top++;a->data[a->top]=b;} //数据进栈函数
void Push_D(OPND_Stack *a,double b){ a->top++;a->data[a->top]=b;} //取运算符栈顶符函数
void GetTop_R(OPTR_Stack *a,char *b){ *b=a->data[a->top];} //取数据栈顶数函数
void GetTop_D(OPND_Stack *a,double *b){ *b=a->data[a->top];} //判断数据是否为运算符函数 int In(char a,char *s){ for(int i=0;i
if(a==s[i])
return 1;return 0;} //算符优先级判断函数
char Precede(char a,char b){ int m,n;for(int i=0;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];} //取数据站的栈顶元素,并从栈中删除此元素 void Pop_D(OPND_Stack *a,double *b){ *b=a->data[a->top];a->top--;} //算符优先算法求值核心函数
double EvaluateExpreion(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'
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);} //判断表达式是否输入正确.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]'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]!=' '&&(a[i+1]!='+'&&a[i+1]!='-'&&a[i+1]!='*'&&a[i+1]!='/'))
s++;
if(a[i]=='.'&&a[i+1]=='.')
s++;} if(p%2==0&&s==0)
return 0;return 1;} //主函数 void main(){ char a[80];int m;char b[80];printf(“============简易计算器============n”);printf(“[四则运算.如:-1+(2+3)*9/(-2)-6].n请输入一个表达式:n”);while(1){
gets(a);
strcpy(b,a);
while(1)
{
int p;
m=strlen(a);
p=Can(a,m);
if(p==0)break;
printf(“输入错误.请从新输入表达式:n”);
gets(a);
strcpy(b,a);
}
printf(“=*=*=*=*=*=*表达式结果=*=*=*=*=*=*n”);
printf(“该表达式的结果为:n%s=%-10.3lfn”,b,EvaluateExpreion(a));
printf(“=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*n”);
printf(“继续使用[四则运算.如:-1+(2+3)*9/(-2)-6]..n请再输入一个表达式:n”);} }
实验五报告课程名称: 数据结构 实验名称:二叉树的创建与遍历实验日期2011/11/16 一、实验目的:通过上机实验进一步掌握栈、队列、二叉树的存储结构及基本操作的实现方法。 二、......
实验六报告课程名称: 数据结构 实验名称:二叉树的应用实验日期2011/11/23 一、实验目的:掌握赫夫曼二叉树的建立及赫夫曼编码的生成。 二、实验内容与要求:根据给定的n个权值生......
数据结构实验二求解约瑟夫问题问题描述:使用代表头节点的循环单链表解决此问题。设有n个人围坐在一张圆桌周围,现从某个人开始从1报数,数到m的人离开。接着从出列的下一个人开......
目 录 实验一线性表、栈和队列的基本操作............................................................1 实验二二叉树的基本操作............................................
目 录 实验规则················································2 实验环境····················......