淮海工学院数据结构课程设计表达式求值可浮点型指数运算文档格式.docx

上传人:b****6 文档编号:20968163 上传时间:2023-01-26 格式:DOCX 页数:37 大小:146.66KB
下载 相关 举报
淮海工学院数据结构课程设计表达式求值可浮点型指数运算文档格式.docx_第1页
第1页 / 共37页
淮海工学院数据结构课程设计表达式求值可浮点型指数运算文档格式.docx_第2页
第2页 / 共37页
淮海工学院数据结构课程设计表达式求值可浮点型指数运算文档格式.docx_第3页
第3页 / 共37页
淮海工学院数据结构课程设计表达式求值可浮点型指数运算文档格式.docx_第4页
第4页 / 共37页
淮海工学院数据结构课程设计表达式求值可浮点型指数运算文档格式.docx_第5页
第5页 / 共37页
点击查看更多>>
下载资源
资源描述

淮海工学院数据结构课程设计表达式求值可浮点型指数运算文档格式.docx

《淮海工学院数据结构课程设计表达式求值可浮点型指数运算文档格式.docx》由会员分享,可在线阅读,更多相关《淮海工学院数据结构课程设计表达式求值可浮点型指数运算文档格式.docx(37页珍藏版)》请在冰豆网上搜索。

淮海工学院数据结构课程设计表达式求值可浮点型指数运算文档格式.docx

要求:

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={<

ai-1,ai>

|ai-1,ai∈D,i=2、……n};

约定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;

//有序存储字符型的顺序表类型/*定义整型栈*/

/*定义运算数字类型栈*/

float*base;

//存储实型数据元素的一维数组

float*top;

}Stack_f;

//有序存储实型的顺序表类型2

//构造一个存储实型的空栈,预设空间为100,分配失败就退出

//return1:

初始化成功return0:

初始化失败

intInitStack_f(Stack_f*s);

{

分配指定的空间;

if(分配成功)

{

初始化栈顶元素;

初始化栈的容量;

return1;

}

else

return0;

//构造一个存储字符型的空栈,预设空间为100,分配失败就退出

intInitStack_c(Stack_c*s)

//若栈s不空,则以e带值返栈顶元素,否则显示错误"

ERROR"

并退出程序

获取成功return0:

获取失败

//inStack_f*s

//outfloat*e

intGetTop_f(Stack_f*s,float*e)

if(栈不为空)

*e=栈顶元素;

return1;

}else

报错;

}

//取栈顶,若栈s不空,则删除栈s的栈顶元素,用e带值返回,否则退出程序

//inStack_c*s

//outchar*e

intGetTop_f(Stack_f*s,char*e)

//在s的栈顶插入新的栈顶元素e,若栈的当前空间已满,则追加存储空间

//infloate

压入成功return0:

压入失败

intPush_f(Stack_f*s,floate)

if(栈满)

增加数字栈的储存空间;

if(增加失败)

{

printf("

栈满,溢出\n"

);

return0;

}

重置栈顶指针;

重置栈的容量;

压入元素;

//inchare

intPush_c(Stack_c*s,chare)

增加运算符栈的储存空间;

//若栈s不空,则删除栈s的栈顶元素,用e带值返回,否则退出程序

弹出成功return0:

弹出失败

intPop_f(Stack_f*s,float*e)

{

if(栈为空)

*e=栈顶元素;

intPop_c(Stack_c*s,char*e)

//incharTop_char,chars1_char

栈顶运算符优先级大于刚读入的运算符;

//return0:

栈顶运算符优先级小于刚读入的运算符

intprecede(charTop_char,chars1_char)

inti=0,j=0;

//储存各个运算符优先级的比较结果

staticchararray[8][8]={

'

'

'

'

='

!

};

//确定运算符的优先级

switch(Top_char)

{

//i为下面array的横标

case'

+'

:

i=0;

break;

-'

i=1;

case'

*'

i=2;

/'

i=3;

^'

i=4;

('

i=5;

)'

i=6;

i=7;

switch(s1_char)

//j为下面array的纵标

j=0;

j=1;

j=2;

j=3;

j=4;

j=5;

j=6;

j=7;

返回优先级比较结果

//中缀表达式转换为后缀表达式

//in中缀表达式

//out后缀表达式

//return1转换成功return0转换失败

intTranslate(char*s1)

{

chars2[80];

Stack_cOptr;

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]压入运算符站;

case'

弹出运算符栈栈顶元素,将该元素赋值给t;

break;

while(t!

{

s2[j++]=t;

弹出运算符栈栈顶元素,将该元素赋值给t;

}

break;

default:

while(取字符站栈顶元素,若优先级大于读入的运算符)

{

弹出栈顶元素并赋值给t;

s2[j++]=t;

}

将t压入运算符栈;

i++;

弹出栈顶元素并赋值给t;

表达式串已结束,栈中的运算符全部输出到s2[i],并删除栈顶元素

s2[j++]=t;

弹出栈顶元素并赋值给t;

将s2[]重新赋值给s1[];

s1[i]='

;

s1[i+1]='

\0'

//计算出最终结果

//in后缀表达式

//out运算结果

//return1计算成功return0计算失败

intCalculate(Stack_f*s,char*s2)

floatm,x,y,z;

while(s2[i]!

//

if(若为数值和小数点)

则将其联合转换为浮点型后进栈;

else

弹出数字栈栈顶元素

switch(s2[i])

{

//让栈顶和次顶元素与次运算符进行相应的运算,运算结果打印并进栈

case'

z=y+x;

输出y+x=z;

z=y-x;

输出y-x=z;

z=y*x;

输出y*x=z;

if(若除数为零)

printf("

ERROR!

\n"

return0;

else

z=y/x;

输出y*x=z;

z=pow(y,x);

输出y^x=z;

输出符号不合法!

}

}

将运算结果压入数字栈栈顶;

i++;

//写出最终结果

//in中缀表达式,数字栈

//out中缀表达式=最终结果

voidresult(Stack_f*s,char*str)

取数字栈栈顶;

输出最终结果;

//判断表达式的等号是否合法

intJudge(char*s)

If(等号存在且位置无误)

return1;

四、程序设计与调试分析

1、本程序的编写和调试环境为VC++6.0;

2、使用到的头文件有

#include<

stdio.h>

stdlib.h>

malloc.h>

string.h>

math.h>

3、程序所使用的数据结构为栈;

在该程序中分为浮点型的数字栈和字符型的运算符栈;

4、测试用例

①输入的表达式为6*((4.3-0.7)/1.2+3.1^(3-1))=:

输出结果应为75.66

②输入表达式15/0=输出结果应为:

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<

#defineINIT_SIZE100//初始分配最大空间量

#defineSTACKINCREMENT10//(默认)增补空间量

//数字栈

//操作符栈

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);

intmain()

Stack_fstack;

charstr[200];

charstrk[200];

charc='

while(c=='

||c=='

printf("

|------------------------------------------------|\n"

|表达式求值|\n"

|---------程序支持实数的加减乘除乘方运算---------|\n"

printf("

|请输入算术表达式,以'

结束|\n"

gets(str);

strcpy(strk,str);

if(!

Judge(str))

elseif(InitStack_f(&

stack))

if(Translate(str))

printf("

转化后的后缀表达式为:

puts(str);

if(Calculate(&

stack,str))

result(&

stack,strk);

}else

}else

ERROR

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 学科竞赛

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1