迷你计算器数据结构课程设计报告.docx
《迷你计算器数据结构课程设计报告.docx》由会员分享,可在线阅读,更多相关《迷你计算器数据结构课程设计报告.docx(29页珍藏版)》请在冰豆网上搜索。
迷你计算器数据结构课程设计报告
数据结构课程设计报告
题目:
迷你计算器
一、课程设计题目:
迷你计算器
二、问题定义:
(由教师指定)
功能要求:
(1)计算任意一个算术表达式的加法、减法、除法以及乘法。
(2)运算数为整数和小数
(3)人机界面自定义,要友好。
如用户输入错误在计算之前可以修改。
三、需求分析
以明确的无歧义的陈述说明课程设计的任务,强调的是程序要做什么?
并明确规定:
1、输入值的范围;
选择运算类型时的输入值范围为:
0~8(选项);
实际运算的输入值范围为:
实数范围。
2、输出的形式;
Int、double、long、void,bool。
3、程序所能达到的功能;
界面友好,输错时可重新输入,可不断选择并运行程序,可自行选择并退出。
(1)四则运算
(2)复合算法
(3)简单取余
(4)n的m次方
(5)开根号
(6)进制转换
(7)阶乘运算
(8)倒数运算
4、算法涉及的基本理论分析:
迷你计算器所用到的是:
1)、栈的顺序存储结构的算法(结构类型定义),包括:
(1)初始化栈
(2)元素进栈(进栈)
(3)删除元素(出栈)
(4)读取栈顶元素
(5)判断栈是否为空
(6)清楚站内元素,释放动态存储空间
(7)遍历栈元素
2)、括号配对检查,分析:
在此算法中需要扫描待检查程序中的每一个字符,当扫描到每个大、中、圆左括号时,令其进栈,当扫描到每个大、中、圆右括号时,则检查栈顶是否为相应的左括号,若是则作退栈处理,若不是则表明出现了语法错误,应返回0。
当扫描到程序文件结尾后,若栈为空则表明没有发现括号配对的错误,应返回1,反则表明栈中还有未配对的括号,应返回0。
3)、后缀表达式的求值算法,其基本思路是:
把包含后缀算术表达式的一个字符串由一个字符指针参数所指向,每次从该字符串中读入一个字符,若它是空格则不作任何处理,若它是运算符则表明它的两个操作数已经在栈中,其中栈顶元素为运算符的后一个操作数,栈顶元素的前一个元素为运算符的前一个操作数,把它们弹出后进行相应运算并保存到一个变量中,否则,扫描的字符必为数字或小数点,应把从此开始的浮点数字符串转换为一个浮点数并存入变量中,然后把计算或转换得到的浮点数压入到栈中,依次向下扫描每一个字符并进行上述处理;
4)、中辍表达式转换为后辍表达式,其定义是把运算符放到运算对象的后面,其基本思路是:
从头到尾扫描中缀表达式中的每一个字符,对于不同类型的字符进行不同情况的处理;
5)、自编的算法包括:
(1)四则运算
(2)复合算法
(3)简单取余
(4)n的m次方
(5)开根号
(6)进制转换
(7)阶乘运算
(8)倒数运算
(0)退出
6)、开始界面,退出界面。
5、题目研究和实现的价值。
实现了一般计算器的简单运算功能。
界面友好,多样化。
通过完成这样的程序我们可以学到更多的知识。
学习一定要有实践,我们可以了解并塑造软件开发师的基本素质。
我们发现实现什么功能算法是核心。
知道了算法思想就可以借助c语言,c++,java等语言来编程序。
四、算法设计
1、概要设计
阐述说明本算法中用到的所有数据结构的定义及其含义、主程序的流程以及各程序模块之间的层次(调用)关系。
迷你计算器
(1).cpp文件分析:
程序头函数
↓
数据结构结构体定义
↓
自编头文件调用
↓
main主函数
↓
minicalculation调用
↓
运行程序
↓
(2)main函数功能分析
main开始
功能主界面
选选项(0-8)
N
判断是否符合
Y
1
四则运算
2
复合运算
3
取余运算
4n的
m
次方
5
开根号
6
进制转换
7
阶乘运算
1
倒数运算
0
退出
结束界面()
main结束
(3)迷你calculation函数
开始
主界面
while
(1)
while
(1)
cin>>x(0-8)
if(x>=0&&x<=8)N
Y
break
0
8
7
6
5
4
3
2
1
B
程序
C
程序
D
程序
E
程序
F
程序
G
程序
H
程序
A
程序
结束界面()
结束
(4)A程序
1
界面
while
(1)
cin>>n>>ch>>m
N
判断是否符合
Y
break
switch
Case’/’
倒数运算
Case’*’
开根号
Case’-’
Case’+’
取余运算
Case’+’
四则运算
Chu()
Cheng()
Jian()
Add()
(4)B,C,D,E,F,G,H程序类似程序
3.详细设计
(1)实现概要设计中定义的所有数据类型;
本次试验中我们主要用到了顺书
typedefdoubleElemType;
structStack
{
ElemType*stack;
inttop;
intMaxSize;
};
(2)所有函数的接口描述;
1初始化栈为空
voidInitStack(Stack&S)
(1)返回值类型:
空
(2)算法用途:
栈的初始化
(3)参数意义:
栈
2进栈
voidPush(Stack&S,ElemTypeitem)
(1)返回值类型:
空
(2)算法用途:
进栈
(3)参数意义:
栈中的所有元素
3桥3出栈
ElemTypePop(Stack&S)
(1)返回值类型:
空
(2)算法用途:
出栈
(3)参数意义:
栈中的所有元素
4读取栈顶元素
ElemTypePeek(Stack&S)
(1)返回值类型:
空
(2)算法用途:
读取栈顶元素
(3)参数意义:
栈中的所有元素
5检查栈是否为空
boolEmptyStack(Stack&S)
(1)返回值类型:
空
(2)算法用途:
检查栈是否为空
(3)参数意义:
栈中的所有元素
6清除线性表的所有元素
voidClearStack(Stack&S)
(1)返回值类型:
空值;
(2)算法用途:
清除线性表的所有元素;
(3)参数S的意义:
栈中的所有元素;
7遍历
voidTraverseStack(Stack&S)
(1)返回值类型:
空值;
(2)算法用途:
栈的遍历;
(3)参数S的意义:
栈中的所有元素;
8括号配对检查
boolBracketsCheck(char*a)
(1)返回值类型:
逻辑类型;
(2)算法用途:
对由a所指字符串为文件名的文件进行括号配对检查;
(3)参数的意义:
文件中的括号;
9后缀表达式的求值算法
doubleCompute(char*str)
(1)返回值类型:
浮点类型;
(2)算法用途:
计算由str所指字符串的后缀表达式的值;
(3)参数的意义:
字符串中的运算符与空格;
10中辍表达式转换为后辍表达式
intPrecedence(charop)
(1)返回值类型:
整型;
(2)算法用途:
返回运算符op所对应的优先级数值;
(3)参数的意义:
运算符;
11、voidChange(char*s1,char*s2)
1、返回类型值:
空
2、change的算法含义:
中辍表达式转换为后辍表达式
3、参数s1、s2的意义:
可以储存数据的栈
12、voidTransform(longnum,intr)
1、返回类型值是:
空
2、Transform算法作用:
转换进制
3、参数:
num的意义:
需要进行转换进制的数;r的意义:
所需转换的进制数
13、doubleadd(doublen,doublem)
1、返回类型:
双精度
2、add的算法作用:
简单加法
3、参数n,m的意义:
输入的数据
14、doublejian(doublen,doublem)
1、返回类型:
双精度
2、jia的算法作用:
简单加法
3、参数n,m的意义:
输入的数据
15、doublecheng(doublen,doublem)
1、返回类型:
双精度
2、cheng的算法作用:
简单乘法
3、参数n,m意义:
输入的数据
16简单取余
intquyu(intn,intm)
1、返回类型:
int
2、cheng的算法作用:
简单取余
3、参数n,m意义:
输入的数据
17n的m次方
doublef(doublen,intm)
1、返回类型:
double
2、cheng的算法作用:
成方运算
3、参数n,m意义:
输入的数据
18简单开根号
doublesqroot(doublen)
1、返回类型:
double
2、cheng的算法作用:
开根号
3、参数n,m意义:
输入的数据
19、阶乘运算
longjiecheng(intn)
1、返回类型:
int
2、cheng的算法作用:
阶乘运算
3、参数n,m意义:
输入的数据
20倒数
doubledaoshu(doublen)
1、返回类型:
double
2、cheng的算法作用:
倒数
3、参数n,m意义:
输入的数据
(3)所有函数的算法描述(只需要写出伪码算法);
1.栈的初始化
voidInitStack(Stack&S)
{
S.MaxSize=50;
开辟新的栈,产生了继续,失败退出。
S.top=-1;
}
2.元素进栈
voidPush(Stack&S,ElemTypeitem)
{
判断栈是否满,满了扩大一倍,不满继续;
S.top++;
S.stack[S.top]=item;
}
3.出栈
ElemTypePop(Stack&S)
{
判断站是否为空,是给提示,否继续。
S.top--;
returnS.stack[S.top+1];
}
4读取栈顶元素
ElemTypePeek(Stack&S)
{
判断站是否为空,是给提示,否继续。
returnS.stack[S.top];
}
5检查栈是否为空
boolEmptyStack(Stack&S)
{
returnS.top==-1;
}
6删除线性表的所有元素
voidClearStack(Stack&S)
{
逐一删除栈元素。
S.top=-1;
S.MaxSize=0;
}
7遍历
voidTraverseStack(Stack&S)
{
判断是否空,是退出,控制下标逐一输出。
}
8括号配对检查,复合运算错误判断
boolBracketsCheck(char*a)
{
建栈并初始化。
while(a[i])
{
switch(a[i])
{
case'{':
case'[':
case'(':
进栈;
case'}':
case']':
case')':
分别读取栈顶元素判断,是出栈。
判断错误输入并给出提示。
}
判断栈是否空,是返回真,否返回假
}
9后缀表达式的求值算法
doubleCompute(char*str)
{
建栈并初始化
Str存在用switch分别讨论+-*/运算,并求值
ClearStack(S);
}
10中辍表达式转换为后辍表达式
intPrecedence(charop)
{
+-优先级低;
*/优先级高
}
voidChange(char*s1,char*s2)
{
建栈,并用出栈。
入栈实现7+8变为78+形式。
}
12简单加法
doubleadd(doublen,doublem)
{
doublesum=n+m;
returnsum;
}
13简单减法
doublejian(doublen,doublem)
{
doublea=n-m;
returna;
}
14简单乘法
doublecheng(doublen,doublem)
{
doublea=n*m;
returna;
}
15简单除法
doublechu(doublen,doublem)
{
doublea=n/m;
returna;
}
16简单取余
intchu(intn,intm)
{
inta=n%m;
returna;
}
17n的m次方
doublef(doublen,intm)
{
m=0时直接返回1;
m>0时用递归实现
m<0时控制循环用递归实现
}
18简单开根号
doublesqroot(doublen)
{
doublea=sqrt(n);
returna;
}
19、阶乘运算
longjiecheng(intn)
{
n=0时1
n>0时用递归实现
}
20倒数
doubledaoshu(doublen)
{
doublea=1/n;
returna;
}
21迷你计算器
voidminicalculation()
{
主界面
while
(1)
{
选选项(0-8)并判断。
if(x==1)四则运算界面
if(x==2)复合运算界面
if(x==3)简单取余界面
if(x==4)n的m次方界面
if(x==5)开根号界面
if(x==6)进制转换界面
if(x==7)阶乘运算界面
if(x==8)倒数运算界面
if(x==0)退出
}
退出界面
}
(3)对主程序和其他模块也都需要写出伪码算法(伪码算法达到的详细程度建议为:
按照伪码算法可以在计算机键盘直接输入高级程序设计语言程序),可采用流程图、N–S图或PAD图进行描述
main开始
功能主界面
选选项(0-8)
N
判断是否符合
Y
1
四则运算
2
复合运算
3
取余运算
4n的
m
次方
5
开根号
6
进制转换
7
阶乘运算
1
倒数运算
0
退出
结束界面()
main结束
五、算法实现
迷你计算器
六、软件测试
这里的测试主要是基于功能的黑盒测试,所以首先提出测试的功能点,然后给出测试数据(包括正确的输入及其输出结果和含有错误的输入及其输出结果。
)
要求在附件里给出软件的基本数据和测试数据。
具体情况见截屏或运行程序。
minicalculation.h
minicalculation.cpp
日志日志.doc
七、技术讨论(可选)
八、收获与体会
1.学会了一定的c++知识。
2.自己编写了很多小程序。
3.学会了界面美化和程序健壮性。
九、软件运行的部分截图及说明
(1)主界面(有选择0-8,截图时少了一个),输入选项可运行相关内容。
(2)输入1时:
简单四则运算,输入格式已给出。
输错可提示并重新输入。
输入对时运算(只给出了加法,减法、乘法、除法类似,运行正常)
(3)输入2时:
复合四则运算,输入格式已给出,可有括号、加法、减法、乘法、除法混和运算。
输错可提示并重新输入。
输入对时运算
(4)输入3时:
简单取余算法。
输入0时:
输入常数时:
(5)输入4时:
n的m次方运算
输入错误时,给出提示并可重新输入,直到输入正确为止:
正数的正数次方:
负数的正数次方:
正数的负数次方(也可以运算,负数的负数次方)
(6)输入5时:
开根号运算
考虑到了负数不能开根号:
正确的程序如下:
(7)输入6时:
十进制转换成2,4,6,8进制(可选择),输入错时给出提示,并可重新输入,也可安全退出。
二进制:
四进制
六进制
八进制
(8)输入7时:
n的阶乘运算
输入负数时给出提示,并重新输入:
0的阶乘是1:
输入正确时运行:
(9)输入8时:
n的倒数运算
(10)输入0时:
退出界面