淮海工学院数据结构课程设计表达式求值可浮点型指数运算.docx
- 文档编号:7839209
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:37
- 大小:146.66KB
淮海工学院数据结构课程设计表达式求值可浮点型指数运算.docx
《淮海工学院数据结构课程设计表达式求值可浮点型指数运算.docx》由会员分享,可在线阅读,更多相关《淮海工学院数据结构课程设计表达式求值可浮点型指数运算.docx(37页珍藏版)》请在冰豆网上搜索。
淮海工学院数据结构课程设计表达式求值可浮点型指数运算
淮海工学院计算机工程学院
课程设计报告
设计名称:
数据结构课程设计
选题名称:
表达式求值
姓名:
********学号:
201412****
专业班级:
软件工程软件142
系(院):
计算机工程学院
设计时间:
2015.12.21~2016.1.4
设计地点:
计算机实验室、教室
成绩:
指导教师评语:
签名:
年月日
1.课程设计目的
1、训练学生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题。
2、初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;
3、提高综合运用所学的理论知识和方法独立分析和解决问题的能力;
4、训练用系统的观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编程水平,并在此过程中培养他们严谨的科学态度和良好的工作作风。
2.课程设计任务与要求:
任务
根据教材《数据结构-C语言描述》(耿国华主编)和参考书《数据结构题集(C语言版)》(严蔚敏、吴伟民主编)选择课程设计题目,要求通过设计,在数据结构的逻辑特性和物理表示、数据结构的选择应用、算法的设计及其实现等方面加深对课程基本内容的理解和综合运用。
所选课题:
表达式求值
问题描述:
一个算术表达式是由操作数(operand)、运算符(operator)和界限符(delimiter)组成的。
假设操作数是正整数,运算符只含加减乘除等四种运算符,界限符有左右括号和表达式结束符“=”,如:
(7+15)*(23-28/4)=。
引入表达式结束符是为了方便。
编程利用“算符优先法”求算术表达式的值。
基本要求:
(1)从键盘读入一个合法的算术表达式,输出正确的结果。
(2)显示输入序列和栈的变化过程。
要求:
1、在处理每个题目时,要求从分析题目的需求入手,按设计抽象数据类型、构思算法、通过设计实现抽象数据类型、编制上机程序和上机调试等若干步骤完成题目,最终写出完整的分析报告。
前期准备工作完备与否直接影响到后序上机调试工作的效率。
在程序设计阶段应尽量利用已有的标准函数,加大代码的重用率。
2、设计的题目要求达到一定工作量(300行以上代码),并具有一定的深度和难度。
3、程序设计语言推荐使用C/C++,程序书写规范,源程序需加必要的注释;
4、每位同学需提交可独立运行的程序;
5、每位同学需独立提交设计报告书(每人一份),要求编排格式统一、规范、内容充实,不少于10页(代码不算);
6、课程设计实践作为培养学生动手能力的一种手段,单独考核。
3.课程设计说明书
1、需求分析
①功能需求
1.根据合法的表达式求出最终结果。
2.显示输入序列和栈的变化过程。
②数据需求
1、输入的形式:
表达式=(“=”是表达式结束符);
2、输入值的范围:
实数;
3、输出的形式:
表达式=结果;
4、运算符+、-、*、/,^;
5、界限符:
()、=;
③性能需求
在完成题目要求的基础上,扩充操作数的范围到实数。
二、概要设计
1、数据元素
由于某些运算符可能具有比别的运算符更高的优先级,因此表达式不可能严格按照从左到右的顺序进行运算,这就要求使用栈来执行正确的指令。
ADTStack{
数据对象:
D={ai|ai∈Element,i=1,2,3,……,n,n>1且n属于整数}
数据关系:
R1={
约定an端为栈顶,ai端为栈底
}
2、基本操作及作用
(1)初始化栈
intInitStack_f(Stack_f*s)//初始化数字栈
intInitStack_c(Stack_c*s)//初始化运算符栈
(2)入栈
intPush_f(Stack_f*s,floate)//数字入栈
intPush_c(Stack_c*s,chare)//运算符入栈
(3)出栈
intPop(S,x)//数字出栈
intcharPop(K,x)//运算符出栈
(4)取栈顶元素
intGetTop_f(Stack_f*s,float*e)//数字取栈顶元素
intGetTop_c(Stack_c*s,char*e)//运算符取栈顶元素
(5)弹出栈顶元素
intPop_f(Stack_f*s,float*e)//弹出栈顶数字元素,e带值返回
intPop_c(Stack_c*s,char*e)//弹出栈顶运算符元素,e带值返回
3、系统中的子程序和功能说明:
//比较运算符的优先级
intprecede(charTop_char,chars1_char);
//将中缀表达式转化为后缀表达式
intTranslate(char*s1);
//计算过程
intCalculate(Stack_f*s,char*s2);
//输出计算结果
voidresult(Stack_f*s,char*str);
//判断等号是否存在或有误
intJudge(char*s);
运算符的优先级
θ1
θ2
+
-
*
/
^
(
)
=
+
>
>
<
<
<
<
>
>
-
>
>
<
<
<
<
>
>
*
>
>
>
>
<
<
>
>
/
>
>
>
>
<
<
>
>
^
>
>
>
>
>
<
>
>
(
<
<
<
<
<
<
=
)
>
>
>
>
<
>
>
=
<
<
<
<
<
<
=
后缀表达式
表达式运算符数字
运算符数字
数字
运算符
运算符
运算符
计算结果
SC图
三、详细设计
1、基本参数类型的设计
(1)/*定义运算符类型栈*/
typedefstruct{
char*base;//存储字符数据元素的一维数组
char*top;//栈顶指针
intstacksize;//栈数组容量
}Stack_c;//有序存储字符型的顺序表类型/*定义整型栈*/
/*定义运算数字类型栈*/
typedefstruct{
float*base;//存储实型数据元素的一维数组
float*top;//栈顶指针
intstacksize;//栈数组容量
}Stack_f;//有序存储实型的顺序表类型2
//构造一个存储实型的空栈,预设空间为100,分配失败就退出
//return1:
初始化成功return0:
初始化失败
intInitStack_f(Stack_f*s);
{
分配指定的空间;
if(分配成功)
{
初始化栈顶元素;
初始化栈的容量;
return1;
}
else
return0;
}
//构造一个存储字符型的空栈,预设空间为100,分配失败就退出
//return1:
初始化成功return0:
初始化失败
intInitStack_c(Stack_c*s)
{
分配指定的空间;
if(分配成功)
{
初始化栈顶元素;
初始化栈的容量;
return1;
}
else
return0;
}
//若栈s不空,则以e带值返栈顶元素,否则显示错误"ERROR",并退出程序
//return1:
获取成功return0:
获取失败
//inStack_f*s
//outfloat*e
intGetTop_f(Stack_f*s,float*e)
{
if(栈不为空)
{
*e=栈顶元素;
return1;
}else
{
报错;
return0;
}
}
//取栈顶,若栈s不空,则删除栈s的栈顶元素,用e带值返回,否则退出程序
//inStack_c*s
//outchar*e
//return1:
获取成功return0:
获取失败
intGetTop_f(Stack_f*s,char*e)
{
if(栈不为空)
{
*e=栈顶元素;
return1;
}else
{
报错;
return0;
}
}
//在s的栈顶插入新的栈顶元素e,若栈的当前空间已满,则追加存储空间
//infloate
//return1:
压入成功return0:
压入失败
intPush_f(Stack_f*s,floate)
{
if(栈满)
{
增加数字栈的储存空间;
if(增加失败)
{
printf("栈满,溢出\n");
return0;
}
重置栈顶指针;
重置栈的容量;
}
压入元素;
return1;
}
//在s的栈顶插入新的栈顶元素e,若栈的当前空间已满,则追加存储空间
//inchare
//return1:
压入成功return0:
压入失败
intPush_c(Stack_c*s,chare)
{
if(栈满)
{
增加运算符栈的储存空间;
if(增加失败)
{
printf("栈满,溢出\n");
return0;
}
重置栈顶指针;
重置栈的容量;
}
压入元素;
return1;
}
//若栈s不空,则删除栈s的栈顶元素,用e带值返回,否则退出程序
//inStack_f*s
//outfloat*e
//return1:
弹出成功return0:
弹出失败
intPop_f(Stack_f*s,float*e)
{
if(栈为空)
return0;
*e=栈顶元素;
return1;
}
//若栈s不空,则删除栈s的栈顶元素,用e带值返回,否则退出程序
//inStack_c*s
//outchar*e
//return1:
弹出成功return0:
弹出失败
intPop_c(Stack_c*s,char*e)
{
if(栈为空)
return0;
*e=栈顶元素;
return1;
}
//比较运算符的优先级
//incharTop_char,chars1_char
//return1:
栈顶运算符优先级大于刚读入的运算符;
//return0:
栈顶运算符优先级小于刚读入的运算符
intprecede(charTop_char,chars1_char)
{
inti=0,j=0;
//储存各个运算符优先级的比较结果
staticchararray[8][8]={
'>','>','<','<','<','<','>','>',
'>','>','<','<','<','<','>','>',
'>','>','>','>','<','<','>','>',
'>','>','>','>','<','<','>','>',
'>','>','>','>','<','<','>','>',
'<','<','<','<','<','<','=','!
',
'>','>','>','>','<','!
','>','>',
'<','<','<','<','<','<','!
','='
};
//确定运算符的优先级
switch(Top_char)
{
//i为下面array的横标
case'+':
i=0;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;
case'=':
i=7;break;
}
switch(s1_char)
{
//j为下面array的纵标
case'+':
j=0;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;
case'=':
j=7;break;
}
返回优先级比较结果
}
//中缀表达式转换为后缀表达式
//in中缀表达式
//out后缀表达式
//return1转换成功return0转换失败
intTranslate(char*s1)
{
chars2[80];
Stack_cOptr;
inti=0,j=0;
chart;
初始化运算符栈Optr;
Push_c(&Optr,'(');
while(s1[i]!
='=')
{
if(s1[i]是数字或小数点的字符)
{
s2[j++]=s1[i];
if(s1[i]不是数字或小数点的字符)
s2[j++]=空格;
}
else
switch(s1[i])
{
case'(':
将s1[i]压入运算符站;break;
case')':
弹出运算符栈栈顶元素,将该元素赋值给t;break;
while(t!
='(')
{
s2[j++]=t;
弹出运算符栈栈顶元素,将该元素赋值给t;
}
break;
default:
while(取字符站栈顶元素,若优先级大于读入的运算符)
{
弹出栈顶元素并赋值给t;
s2[j++]=t;
}
将t压入运算符栈;
}
i++;
}
弹出栈顶元素并赋值给t;
表达式串已结束,栈中的运算符全部输出到s2[i],并删除栈顶元素
while(t!
='(')
{
s2[j++]=t;
弹出栈顶元素并赋值给t;
}
将s2[]重新赋值给s1[];
s1[i]='=';
s1[i+1]='\0';
return1;
}
//计算出最终结果
//in后缀表达式
//out运算结果
//return1计算成功return0计算失败
intCalculate(Stack_f*s,char*s2)
{
floatm,x,y,z;
inti=0,j=0;
while(s2[i]!
='=')
{
//
if(若为数值和小数点)
{
则将其联合转换为浮点型后进栈;
}
else
{
弹出数字栈栈顶元素
弹出数字栈栈顶元素
switch(s2[i])
{
//让栈顶和次顶元素与次运算符进行相应的运算,运算结果打印并进栈
case'+':
z=y+x;输出y+x=z;break;
case'-':
z=y-x;输出y-x=z;break;
case'*':
z=y*x;输出y*x=z;break;
case'/':
if(若除数为零)
{
printf("ERROR!
\n");
return0;
}
else
{
z=y/x;
输出y*x=z;
break;
}
case'^':
z=pow(y,x);输出y^x=z;;break;
default:
{
输出符号不合法!
;
return0;
}
}
将运算结果压入数字栈栈顶;
i++;
}
}
return1;
}
//写出最终结果
//in中缀表达式,数字栈
//out中缀表达式=最终结果
voidresult(Stack_f*s,char*str)
{
取数字栈栈顶;
输出最终结果;
}
//判断表达式的等号是否合法
//in中缀表达式
intJudge(char*s)
{
If(等号存在且位置无误)
return1;
else
return0;
}
四、程序设计与调试分析
1、本程序的编写和调试环境为VC++6.0;
2、使用到的头文件有
#include
#include
#include
#include
#include
3、程序所使用的数据结构为栈;在该程序中分为浮点型的数字栈和字符型的运算符栈;
4、测试用例
①输入的表达式为6*((4.3-0.7)/1.2+3.1^(3-1))=:
输出结果应为75.66
②输入表达式15/0=输出结果应为:
ERROR!
ERROR!
③输入表达式3-2输出结果应为:
表达式无结束符“=”或结束符位置不合法!
④输入表达式3=2/输出结果应为:
表达式无结束符“=”或结束符位置不合法!
5、用户手册
1、进入程序后即显示提示信息:
“请输入算术表达式,以’=’结束”以等待用户输入待求表达式,直到输入“=”为止,如”5*(7.1-8)^(4.3+1)/3.1=”该程序仅仅能够满足加减乘除和乘方运算,若用户输入的表达是不合法,或表达式包括程序不满足的运算时,程序报错或无法运行,程序结束;
2、在用户正确输入表达式后,程序会自动将中缀表达式转换为后缀表达式并输出“转化后的后缀表达式为:
xxxxxxxx”,然后自动转换为后缀表达式,计算表达式的值并输出中间结果“表达式=结果”和最终结果“Thefinalresultis:
原表达式=结果”;
3、最终结果输出后,又有提示信息:
“你想继续吗?
'Y'或'y'为继续,其余为退出程序”,以等待用户输入是否继续运行本程序的命令符,若输入“y”或“Y”,则程序自动再次运行,重复2,3步,若输入其它,程序结束。
4、本程序只对实数的加减乘除乘方运算进行求值,且只对“()”这种形式的括号进行识别,“{}”或“[]”都不予以识别,但是”()”是可以嵌套的,表达式输入完后一定要加“=”表示输入结束,否则程序出错。
6、测试成果
1、操作提示
2、表达式计算
输入的表达式为6*((4.3-0.7)/1.2+3.1^(3-1))=
3、表达式错误时
输入表达式15/0=
4.表达式包含不合法字符:
5.输入表达式无结束符“=”或结束符位置不合法
(1)表达式无结束符“=”
(2)结束符位置不合法
七、源程序清单
#include
#include
#include
#include
#include
#defineINIT_SIZE100//初始分配最大空间量
#defineSTACKINCREMENT10//(默认)增补空间量
//数字栈
typedefstruct{
float*base;
float*top;
intstacksize;
}Stack_f;
//操作符栈
typedefstruct{
char*base;
char*top;
intstacksize;
}Stack_c;
intJudge(char*s);
intInitStack_f(Stack_f*s);
intInitStack_c(Stack_c*s);
intGetTop_f(Stack_f*s,float*e);
intGetTop_c(Stack_c*s,char*e);
intPush_f(Stack_f*s,floate);
intPush_c(Stack_c*s,chare);
intPop_f(Stack_f*s,float*e);
intPop_c(Stack_c*s,char*e);
intprecede(charTop_char,chars1_char);
intTranslate(char*s1);
intCalculate(Stack_f*s,char*s2);
voidresult(Stack_f*s,char*str);
intmain()
{
Stack_fstack;
charstr[200];
charstrk[200];
charc='Y';
while(c=='y'||c=='Y')
{
printf("|------------------------------------------------|\n");
printf("|表达式求值|\n");
printf("|---------程序支持实数的加减乘除乘方运算---------|\n");
printf("|请输入算术表达式,以'='结束|\n");
printf("|------------------------------------------------|\n");
gets(str);
strcpy(strk,str);
if(!
Judge(str))
printf("表达式无结束符“=”或结束符位置不合法!
\n");
elseif(InitStack_f(&stack))
{
if(Translate(str))
{
printf("转化后的后缀表达式为:
\n");
puts(str);
if(Calculate(&stack,str))
{
result(&stack,strk);
}else
printf("ERROR!
\n");
}else
printf("ERROR
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 淮海 工学院 数据结构 课程设计 表达式 求值 浮点 指数 运算