田甜数据结构课程设计报告.docx
《田甜数据结构课程设计报告.docx》由会员分享,可在线阅读,更多相关《田甜数据结构课程设计报告.docx(16页珍藏版)》请在冰豆网上搜索。
田甜数据结构课程设计报告
《数据结构》
课程设计报告
课程设计题目:
(计算机运算符的优先级比较)
学生姓名:
田甜
专业:
信息管理与信息系统
班级:
0930602
指导老师:
徐青
2011年6月19
一、课程设计目的:
课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。
提高学生适应实际,实践编程的能力。
二:
题目简介:
设计一个简单的计算机运算界面,实现计算机的简单的”+”,”-“,”*”,”/”运算,以及运算符(+,-,*,/,())的优先级比较。
三:
流程图或者模块图:
入栈模块流程图:
栈以满
栈
未
满
出栈模块流程图:
栈已满
栈
未
满
判断优先模块图:
取得元素优先级低
取的元素优先级高
四则运算模块流程图:
符号为“*”符号为“+”
符号为“/”符号为“-”
四:
程序清单和运行结果:
#include
#include
#include
typedefstruct//建立一个栈
{
chara[100];
inttop;
}sequence_stack;
voidShowsystem()//显示系统主界面
{
printf("\n\n\n\n\n\n");
printf("\t\t#************************************************#\n");
printf("\t\t#^0^^0^^0^^#\n");
printf("\t\t#计算器的简单运算!
#\n");
printf("\t\t#------------------------------------------------#\n");
printf("\t\t#加减乘除#\n");
printf("\t\t#************************************************#\n");
printf("\t\t##\n");
printf("\t\t##\n");
printf("\t\t##\n");
printf("\t\t#************************************************#\n");
printf("\t\t#请按回车键进入菜单");
getchar();
}
voidinit(sequence_stack*st)//初始化栈
{
st->top=0;
}
intis_operation(charop)//判断是否为运算符号
{
switch(op)
{
case'+':
case'-':
case'*':
case'/':
return1;
default:
return0;
}
}
intpriority(charop)//要压入栈的优先级
{
switch(op)
{
case'#':
return-1;
case'(':
return0;
case'+':
case'-':
return1;
case'*':
case'/':
return2;
default:
return-1;
}
}
voidpostfix(chare[],charf[])//将字符串变为后缀表达式
{
charopst[100];
intt,i=0,j=0,top=0;
opst[top]='#';top++;
while(e[i]!
='#')
{
if((e[i]>='0'&&e[i]<='9')||e[i]=='.')
f[j++]=e[i];//遇到数字和小数点直接写入后缀表达式//
else
if(e[i]=='(')//遇到左括号进入操作符栈//
{opst[top]=e[i];top++;}
else
if(e[i]==')')//遇到右括号将其对应的左括号的操作符全部写入后缀表达式//
{
t=top-1;
while(opst[t]!
='(')
{
f[j++]=opst[--top];
t=top-1;
}
top--;
}
else
if(is_operation(e[i]))
{
f[j++]='';//用空格分开两个操作符//
while(priority(e[i])<=priority(opst[top-1]))
f[j++]=opst[--top];
opst[top]=e[i];top++;//当前元素进栈//
}
i++;//处理下一个元素//
}
while(top)f[j++]=opst[--top];
}
doublereadnumber(charf[],int*i)//将字符后缀表达式转化为数值
{
doublex=0.0;
intk=0;
while(f[*i]>='0'&&f[*i]<='9')
{
x=x*10+(f[*i]-'0');
(*i)++;
}
if(f[*i]=='.')
{
(*i)++;
while(f[*i]>='0'&&f[*i]<='9')
{
x=x*10+(f[*i]-'0');
(*i)++;
k++;
}
}
while(k!
=0)
{
x=x/10.0;
k=k-1;
}
return(x);
}
doubleevalpost(charf[])//后缀表达式求值
{
doubleobst[100],x1,x2;
inttop=0,i=0;
while(f[i]!
='#')
{
if(f[i]>='0'&&f[i]<='9')
{
obst[top]=readnumber(f,&i);top++;
}
else
if(f[i]=='')i++;
else
if(f[i]=='+')
{
x2=obst[--top];
x1=obst[--top];
obst[top]=x1+x2;
top++;
i++;
}
else
if(f[i]=='-')
{
x2=obst[--top];
x1=obst[--top];
obst[top]=x1-x2;
top++;
i++;
}
else
if(f[i]=='*')
{
x2=obst[--top];
x1=obst[--top];
obst[top]=x1*x2;
top++;
i++;
}
else
if(f[i]=='/')
{
x2=obst[--top];
x1=obst[--top];
obst[top]=x1/x2;
top++;
i++;
}
}
returnobst[0];
}
voidmenu(chare[],charf[])
{
system("cls");//输入一组字符串
e[strlen(e)]='#';
postfix(e,f);//将字符串转化为后缀表达式
printf("\n\n\n");
printf("\t\t|-------------计算器-------------|\n");
printf("\t\t#********************************#\n");
printf("\t\t##\n");
printf("\t\t#您要求的的结果:
%.2f\n",evalpost(f));
printf("\t\t##\n");
printf("\t\t#********************************#\n");
printf("\t\t|-------|--------|-------|-------|\n");
printf("\t\t|1|2|3|+|\n");
printf("\t\t|-------|--------|-------|-------|\n");
printf("\t\t|4|5|6|-|\n");
printf("\t\t|-------|--------|-------|-------|\n");
printf("\t\t|7|8|9|*|\n");
printf("\t\t|-------|--------|-------|-------|\n");
printf("\t\t|.|0|=|/|\n");
printf("\t\t|-------|--------|-------|-------|\n");
printf("\t\t");
}
voidfinish()//打印系统主界面
{system("cls");
printf("\n\n\n\n\n\n");
printf("\t\t#**************************************************#\n");
printf("\t\t#==================================================#\n");
printf("\t\t#^0^谢使用计算器!
^0^#\n");
printf("\t\t#-------------------------------------------------#\n");
printf("\t\t#………结束…………#\n");
printf("\t\t#**************************************************#\n\t\t");
}
voidmain()
{
inti=0,n=1;
charf[100],e[100];
Showsystem();
while(n)
{
switch(n)
{
case0:
break;
case1:
{
system("cls");
printf("\n\n\n");
printf("\t\t请输入你要计算的算式:
");
gets(e);
menu(e,f);
}
}
printf("0->结束1->继续\n");
printf("\t\t请输入<0-1>:
");
scanf("%d",&n);
getchar();
}
finish();
}
运行结果:
Enter键进入:
计算结果:
按1继续:
按0结束:
五:
小结(收获和体会);
在这次的课程设计当中遇到了很多的麻烦,刚开始的时候是什么都不会,在寻求同学的帮助下了解了一些代码的意思,但是有些还是不太明白,指导老师问的问题第一次也回答不上来,觉得自己把数据结构的相关知识都忘记了,后来查看书才了解了一些运算符的优先级比较,以及一些算法的计算,课程设计当中指导老师把相关的知识点都会问及我们,只有回答出来了才可以过,在自己以及同学的帮助下,认真仔细的查看源代码的意思,以及源代码的相关知识终于了解了通过栈来表达运算符的优先级,以及四则基本运算符的运算方法,在指导老师的询问当中自己会很紧张,看到同学们都回答的那么好觉得自己有那么点不如人家,在最后指导老师的帮助下最后通过了这次课程设计,还是很开心的最起码自己已经看懂了这些代码,还有指导了之前自己不会的知识,还是很愉快的。