数据结构表达式求值课程设计.docx
- 文档编号:26078410
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:15
- 大小:40.72KB
数据结构表达式求值课程设计.docx
《数据结构表达式求值课程设计.docx》由会员分享,可在线阅读,更多相关《数据结构表达式求值课程设计.docx(15页珍藏版)》请在冰豆网上搜索。
数据结构表达式求值课程设计
课程设计报告
课程名称:
数据结构课程设计
课程设计题目:
表达式求值问题
姓名:
系:
计算机科学与技术
专业:
计算机科学与技术
年级:
2011级
学号:
指导教师:
职称:
讲师
2020年12月31日
表达式求值问题
1.设计目的:
《数据结构课程设计》是运算机专业集中实践性环节之一,是学习完《数据结构》课程后进行的一次全面的综合练习。
其目的是:
(1)要达到理论与实际应用相结合,使学生能够依照数据对象的特性,学会数据组织的方式,能把现实世界中的实际问题在运算机内部表示出来,并培育良好的程序设计技术。
(2)在实践中熟悉什么缘故要学习数据结构,把握数据结构、程序设计语言、程序设计技术之间的关系,是前面所学知识的综合和回忆。
2.设计要求:
以字符序列的形式从键盘输入语法正确的、不含变量的整数(或实数)表达式,实现对算术四那么混合运算表达式的求值。
当用户输入一个合法的算术表达式后,能够返回正确的结果。
能够计算的运算符包括:
加、减、乘、除、括号,关于异样表达式能给犯错误提示。
3.设计方案:
任何一个表达式都是由操作符,运算符组成的。
咱们别离用顺序栈来寄放表达式的操作数和运算符。
栈是限定于紧仅在表尾进行插入或删除操作的线性表。
顺序栈的存储结构是利用一组持续的存储单元依次寄存自栈底到栈顶的数据元素。
为了实现算符优先算法。
能够利用两个栈。
一个称为OPF,用以寄放运算符,另一个称做OPS,用以寄放操作数或运算结果。
1.第一置操作数栈为空栈,表达式起始符”#”为运算符栈的栈底元素;
2.依次读入表达式,假设是操作符即进OPS栈,假设是运算符那么和OPF栈的栈顶运算符比较优先权后作相应的操作,直至整个表达式求值完毕(即OPF栈的栈顶元素和当前读入的字符均为”#”)。
4.设计内容:
.需求分析
本程序所做的工作为:
能直接求出四那么表达式的值,并输出;本程序可用于小学教师对学生作业的快速批改和对数值位数要求较大的科学运算。
.概要设计
1.统中子程序及功能要求:
Comop(charch):
判定输入的字符是不是为运算符
charPrecede(charch,charc):
比较两个运算符的优先级,ch是栈顶字符,c是表达式字符。
ElementTypeOperate(ElementTypea,charch,ElementTypeb):
解析表达式中的双目运算,其返回的结果即为双目运算表达式的值。
interror(char*str):
错误提示函数,实现对多种非法四那么表达式的判定,并给出提示,让用户更正自己的输入错误。
voidMenuPrint():
主菜单打印函数。
voidClear():
清屏函数。
ElementTypeEvaluateExpression(char*exp):
这是此程序的核心函数,能够综合其它子函数,实现最终的表达式求解。
各程序模块之间的挪用关系(子程序编号见上):
主函数可挪用子程序5,6,7。
子程序7可挪用子程序1,2,3,4。
.详细设计
此算法的大体思想:
第一置操作数栈OPS为空栈,表达式起始符“#”为运算符的栈底元素;依次读入表达式中每一个字符,假设是操作数那么进栈,假设是运算符那么和OPF栈的栈顶运算符比较优先权作相应操作,直至整个表达式求值完毕(即OPF栈的栈顶元素和当前读入的字符均为“#”)
此算法的伪代码:
ElementTypeEvaluateExpression(char*exp)
{概念两个字符变量c和ch,c代表输入表达式中的字符,ch代表栈顶运算符;
概念字符指针*p,*q,*temp;temp指向运算符后面的一个字符
doublei=0,a=0,b=0;
将传入的实参赋给p,q;
概念一个运算符栈OPF;
概念一个操作数栈OPS;
挪用函数InitStack()初始化栈OPS;
挪用函数CInitCharStack()初始化栈OPF;
挪用函数CPush(OPF,'#')将#压入运算符栈;
c=*p;temp=p;p++;
if(第一个字符就为‘-’)
{
c=*p;temp=p;p++;
}
while(栈不为空或表达式没有终止)
{
{
将p指向的字符转为小数n
p--;
}
p=q;
p++;
}
if(运算符为‘-’而且运算符前一个为‘(’或为表达式的开始)
挪用Push(OPS,-(m+n))将m+n的相反数入栈;
else
挪用Push(OPS,m+n)将m+n入栈;
}数字进栈终止
else
3’
7’
2’
7’2’
3’5’
试分析与结果
附录一:
测试数据
组别
表达式
正确值
1
12+(9-8)*7-(-6*5)
49
2
*()+
3
3+{2*[2*(3+4)]}
31
4
{*[+]}
5
12-(3-6*7)8-4
错误表达式
表二
依照附录中的测试数据,得出如下测试、分析结果:
当咱们输入表格中两个正确的四那么表达式时程序能准确地求得其值:
完全支持浮点数,正负数的运算;
而当咱们输入第五组错误的表达式时,程序能做出正确判定,提示用户输入的表达式错误。
其数据测试的情形见截图:
表达式一运算结果
表达式二运行结果
表达式三运行结果
表达式四运行结果
由表二可知以上四组表达式运行结果皆正确。
表达式五运行结果
由表二可知第五组表达式错误。
附录二:
部份错误表达式
组别
第一个字符
前一个运算符符
当前运算符
后一个字符
1
+\-\*\/\.
)\]\}
2
(\[\{
+\-\*\/\.
3
)\]\}
.
4
.
(\[\{
5
(
)
6
)
(
7
[
]
8
]
[
9
{
}
10
}
{
11
)\]\}
0~9
12
0~9
(\[\{
13
+\*\/\)\}\]
14
+\-\*\/\.
+\-\*\/\.
15
/
0
表三
:
利用说明
运行程序,第一显现主菜单。
主菜单包括三个选项:
选项a:
表达式求解,选择该项可进行四那么表达式的求解;选项b:
清屏;选项c:
退出程序,选择该项将退出程序。
5.总结:
这次课程设计让我加倍了解了学到的C语言和数据结构。
课程设计不仅要求对讲义知识有较深刻的了解,同时要求程序设计者有较强的思维和动手能力同时这也使我加倍了解编程思想和编程技术。
这次课程设计让我有一个深刻的体会,那确实是细节决定成败,编程最需要的是严谨,如何的严谨都只是分,往往检查了半天发觉错误发生在某个括号,分号,引号,或数据类型上。
就像我在写EvaluateExpression()函数时,忘了指针的地址符值不用加*,这一点小小的错误也延误了我几十分钟,因此说细节很重要。
程序设计时,也不要怕碰到错误,在实际操作进程中犯的一些错误还会成心外的收成,感觉课程设计很成心思。
在具体操作中这学期所学的数据结构的理论知识取得巩固,达到课程设计的大体目的,也发觉自己的不足之出,在以后的上机中应加倍注意。
6.附录三:
源代码
&&
&&
(str[i-1]=='('||str[i-1]=='['||str[i-1]=='{')
)
||(
(str[i]==')'||str[i]==']'||str[i]=='}')&&str[i+1]=='.'
)
||(
str[i]=='.'&&(str[i+1]=='('||str[i+1]=='['||str[i+1]=='{')
)
||(str[i]==')'&&str[i+1]=='(')
||(str[i]=='('&&str[i+1]==')')
||(str[i]=='['&&str[i+1]==']')
||(str[i]==']'&&str[i+1]=='[')
||(str[i]=='{'&&str[i+1]=='}')
||(str[i]=='}'&&str[i+1]=='{')
||(
(str[i]==')'||str[i]==']'||str[i]=='}')&&str[i+1]>='0'&&str[i+1]<='9'
)
||(
(str[i]>='0'&&str[i]<='9'&&(str[i+1]=='('||str[i+1]=='['||str[i+1]=='{')
)
||(str[0]=='+'||str[0]=='*'||str[0]=='/'||str[0]==')'||str[0]==']'||str[0]=='}')
||(
(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/'||str[i]=='.')
&&
(str[i+1]=='+'||str[i+1]=='-'||str[i+1]=='*'||str[i+1]=='/'||str[i+1]=='.')
)
||(int(str[i])>57&&(int(str[i])!
=91&&int(str[i])!
=93&&int(str[i])!
=123&&int(str[i])!
=125))
||(str[i]=='/'&&str[i+1]=='0')
||(int(str[i])>31&&int(str[i])<38)
)
)
return1;
elseif(str[i]=='#')return0;
i++;
}&&c>='0'&&c<='9')
{
{
{
n=n/10+(*p-48)/;
p--;
}
p=q;
p++;
}
if(*(temp-2)=='('&&*(temp-1)=='-'||temp-1==exp)
Push(OPS,-(m+n));
else
Push(OPS,m+n);
}//*****数字进栈终止******
else//是运算符时那么进栈OPF
{
if(c=='-'&&*(p-2)=='(')
{
c=*p;
temp=p;
p++;
}
else//else1
{
CGetTop(OPF,ch);
switch(Precede(ch,c))
{
case'<':
//栈顶运算符优先权低
CPush(OPF,c);c=*p;temp=p;p++;break;
case'>':
//栈顶运算符优先权高
CPop(OPF,ch);
Pop(OPS,b);Pop(OPS,a);
Push(OPS,Operate(a,ch,b));break;
case'=':
//脱括号并接收下一个字符
CPop(OPF,ch);c=*p;temp=p;p++;break;
default:
c=*p;temp=p;p++;
}//switch
}//else1
}//else2
}//退出最外层循环
GetTop(OPS,i);
DestroyStack(OPS);
CDestroyStack(OPF);
returni;
}//EvaluateExpression函数终止
//菜单函数
voidMenuPrint()
{
printf("\t\t┌─────────┐\n");
printf("\t\t│多功能计算器│\n");
printf("\t\t├(a)表达式求解│\n");
printf("\t\t├(b)清屏│\n");
printf("\t\t├(c)退出│\n");
printf("\t\t└─────────┘\n");
}//菜单函数
//清屏函数
voidClear()
{system("cls");
MenuPrint();
}//清屏函数
//main主函数
voidmain()
{
doubleresult=0;
charexp[NUMBER],c;
freopen("","r",stdin);
freopen("","w",stdout);
Clear();
printf("\t\t请输入你要进行的操作:
\n");
while
(1)
{
scanf("%c",&c);
switch(c)
{case'a':
Clear();
sr:
printf("输入要计算的表达式,以##终止\n");
scanf("%s",exp);
if(!
error(exp))
{result=EvaluateExpression(exp);
printf("计算结果为:
%lf\n",result);
printf("请依照屏幕提示选择要进行的操作:
\n");
scanf("%d",&c);
break;
}
elseif(error(exp))
{printf("您输入的表达式有误!
");
gotosr;
}
case'b':
Clear();
printf("\t\t请输入你要进行的操作:
");
scanf("%d",&c);break;
break;
case'c':
system("cls");exit
(1);
default:
printf("输入有误!
");
}//switch
}//while
}//main
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 表达式 求值 课程设计
![提示](https://static.bdocx.com/images/bang_tan.gif)