完整版数据结构毕业课程设计示例文档.docx
《完整版数据结构毕业课程设计示例文档.docx》由会员分享,可在线阅读,更多相关《完整版数据结构毕业课程设计示例文档.docx(34页珍藏版)》请在冰豆网上搜索。
完整版数据结构毕业课程设计示例文档
韶关学院计算机科学学院
数据结构课程设计
题目:
课堂经验值查询系统
学生姓名:
吕功名
专业:
计算机科学与技术
班级:
11级
(1)班
指导教师姓名及职称:
陈正铭讲师
起止时间:
2013年2月——2013年4月
1需求分析
1.1课题背景及意义
随着计算机网络技术的发展和因特网的广泛普及,网络安全事故逐年增加,黑客的攻击已经和病毒并列成为对信息安全影响最严重的两大危害。
其很大程度上是被黑客破解了用户的计算机名及登陆密码及资料的加密较差,而使得黑客来对网民的资料如同自己般的随意更改和破坏。
而安全的密码和账号成为了网民的安全之本,怎么才能提高安全问题成为的人们和社会关注的问题。
而加密大部又是以大素数的计算为基础的,如非对称密码体制RSA的安全性依赖于对大数进行因数分解的耗时性。
大数运算不仅仅运用在密码学中,还运用在一些物理学研究、生物学,化学等科目中。
大数运算,意味着参加的值和计算结果通常是上百位数,上千位数以及更大长度之间的整数运算。
例如大家所熟知圆周率π的值,在一般的数值计算中用到圆周率的不须要多大的精度,但在计算一些星球或是星系上的体积面积时便显的误差很大了,这就要求π值计算的精度达到几百万位甚至更高,才能缩小误差。
人工计算是远远不行了,而且本身误差也无法估计。
只有在计算机中用大数运算求π值了。
又如,考古学家计算石头内的碳元素衰变来考证地球形成的时间,更是将计算的结果精确到了百年以内。
所以说大数的运算是涉及领域多,应用范广,与我们生活息息相关。
《数据结构课程设计》是一门实践性的计算机课程,为了学好这门课程,必须在掌握理论知识的同时,加强上机实践。
通过这次课程设计,要求掌握较大程序的设计方法,相应数据结构的选择应用、算法的设计及其实现和性能分析等方面中加深对课程基本内容的理解。
同时,在设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
1.2课题要求
A.支持大数精确运算的计算器
B.实现一个大数(要求允许绝对值>10128)的计算器图形化程序软件。
C.要求程序读入大数A和B,选择相应的加、减、乘或除法运算符,然后计算精确结果(不能用科学计数法,不四舍五入)并输出到屏幕上,在普通计算机上运算时间不超过1分钟。
D.选做内容:
实现大数的其他运算(如三角函数),求出运算时间。
1.3软件格式规定
A.输入的形式:
正数的不用输入符号位,数值的第一位可以为零。
位数在0~1000之间
B.程序所能达到的功能:
能进行位数在0~1000(可在源程序里设置位数大小)之间的所有整型数和浮点型数的四则运算。
C.输出的形式:
是整型或浮点型数据
D.测试的数据:
1)、正确的输入:
以下是对两个大数进行加减乘除四则运算所得的正确结果:
正确的运算结果:
2)、windows版本应用程序错误的输入:
数A:
112
数B:
0
1.4设计目标
A.软件名称:
大数运算器
B.软件组成:
DosBigMath.exe(dos系统应用程序);WinBigMath.exe(windows系统图形化窗口操作界面应用程序)
C.制作平台及相关调试工具:
Win32;MicrosoftVisuslC++2005Express
D.运行环境:
doswinxpwin7
E.性能特点:
(1)软件由两个可执行文件组成,各具特点:
DosBigMath.exe为dos系统应用程序,体积小,高效快捷,适用范围广,兼容性好。
WinBigMath.exe为windows应用程序,界面友好,使用方便。
(2)输入的大数可为整型,也可以是浮点型。
(3)DosBigMath.exe(dos系统应用程序)的输入和输出形式:
运算符选择→按回车键→输入A的值→按回车键→再输入B的值→按回车键→输出运算结果并显示运算所花时间(ms级)。
(4)WinBigMath.exe(windows应用程序)可支持鼠标点击输入与键盘输入,可支持黏贴的数字。
(5)运行时间较短,精确到毫秒级。
(6)个别其他功能可进行再扩展。
2概要设计
2.1问题解决的思路概述
首先是确定结构化程序设计的流程图,利用已存在的数据结构来构造一个存储大数的结构,接着把四则运算分成四个主要的模块:
实现加法的模块、实现减法的模块、实现乘法的模块、实现除法的模块,然后各个模块里面还要分成若干种情况来考虑并通过函数的嵌套调用来实现其功能。
最后,编写main主函数以实现大整数的正确输入与正确输出,调试程序并将不足的地方加以修改。
总而言之,就是先用自顶向下、逐步细化的设计方法来分析并画出程序设计流程图;然后用自下而上、逐步积累的设计方法来写出程序。
2.2相关函数介绍说明
在dos版本程序和windows版本程序下都定义了一个用于存储大数的结构体类型变量:
typedefstructtagBigNumBigNum;
(1)dos版本程序下定义的相关函数
voidStartCount();计时开始
voidEndCount();计时结束
doubleTime();返回时差
voidInitBigNumToZero(BigNum*pNum);初始化BigNum为0
intCharLenByBigNum(CONSTBigNum*pNum);
判断需要多少个字符空间存储BigNum转换的字符串.
voidCharToBigNum(CONSTchar*arr,BigNum*pNum);
从字符串转换到BigNum.
voidBigNumToChar(char*szBuf,CONSTBigNum*pNum);
从BigNum转换到字符串.
voidAdjustBits(BigNum*pNum);
调节数位,删除最高整数位是的和最低小数位是的数位.
voidMoveFloatPoint(BigNum*pNum,intdeta);
移动小数点,deta=0不移动,deta<0往左移动,deta>0往右移动.
voidMakeInfinite(BigNum*pNum);使无穷大
char*Result(CONSTchar*val1,CONSTchar*val2,PFNCALCpfnCalc);
根据算术函数返回结果
intCompare(CONSTBigNum*pn1,CONSTBigNum*pn2);比较个数大小
intIsZero(CONSTBigNum*pNum);判断是否为
voidAdd(CONSTBigNum*pn1,CONSTBigNum*pn2,BigNum*pRes);
加法
voidMul(CONSTBigNum*pn1,CONSTBigNum*pn2,BigNum*pRes);
乘法
voidSub(CONSTBigNum*pn1,CONSTBigNum*pn2,BigNum*pRes);
减法
voidDiv(CONSTBigNum*pn1,CONSTBigNum*pn2,BigNum*pRes);
除法
voidshowmenu();显示菜单信息
voidmenu();选择运算符的菜单
voidGetNum(CHARARRnuma,CHARARRnumb);从dos界面获取输入字符串
(2)windows版本程序下定义的相关函数
windows版本程序下定义的相关函数中除了没有“voidshowmenu();”、“voidmenu();”、“voidGetNum(CHARARRnuma,CHARARRnumb);”三个dos输入显示函数,其他的函数都和dos版本程序下定义的一样。
2.3主程序的流程基函数调用说明
在这里,主程序的流程以dos版本程序进行说明。
(1)主程序的简要流程图
图1主程序流程图
(2)各程序模块之间的层次(调用)关系
调用“Result()”函数,以调用“CharToBigNum()”将输入的字符型大数转换成可用于运算的结构体类型大数,然后调用四则运算的各运算模块进行相应的运算,再调用“BigNumToChar()”将各运算模块返回的运算结果转换成字符类型用于输出显示,期间还要调用“CharLenByBigNum()”来判断数据所需的存取空间。
在每一个运算模块都涉及到大数的存取,所以都要调用“InitBigNumToZero()”对结构体变量初始化。
加法运算程序模块“Add()”,首先要判断两个大数的符号位,如果是一号相加则调用减法运算程序“Sub()”;如果是同号相加则直接运行程序。
减法运算程序模块“Sub()”,首先要判断两个大数的符号位,如果是异号相减则调用加法程序“Add()”;如果是同号相减则直接运行,然后调用“Compare()”以实现大数减小数。
乘法运算程序模块“Mul()”,首先调用“MoveFloatPoint()”以实现浮点型数以整型数的形式相乘,采用“模拟笔算”的方法,每乘一次都要调用加法程序“Add()”将结果累加起来,然后在调用“MoveFloatPoint()”将所得的整型结果转化成正确的浮点型类型相乘结果。
除法运算模块“Div()”,首先调用“MoveFloatPoint()”以实现浮点型数以整型数的形式相除,采用“模拟笔算”的方法,以除数的位数长度为基准,多次循环调用“Compare()”、“MoveFloatPoint()”、“Mul()”和“Sub()”,一直到规定的小数位数为止,最终还要要调用“MoveFloatPoint()”将所得的整型结果转化成对应的浮点型类型相除结果。
3详细设计
3.1数字存储的实现
大数计算的因数和结果精度一般是少则数十位,多则几万位。
在C语言中定义的类型中精度最多只有二十多位,由于涉及到浮点型大数和负数的运算,因而程序采取定义一个结构体类型存贮的方式来存放大数符号、小数点、整数部分、整数数位、小数部分、小数有效位数。
在计算中会用到从高位开始计算,和从低位开始计算数值的两种情况。
其结构为:
typedefstructtagBigNum{
intintbits;整数数位
intfloatbits;小数有效数位
charinfinite;无穷大
charsign;符号
charintpart[INT_BIT_MAX];整数部分
charfloatpart[FLOAT_BIT_MAX];小数部分
}BigNum;
3.2四则运算算法
在大数四则运算的程序设计中,每一部分都会调用一些其他其它函数来辅助完成运算(例如:
对结构体变量的初始化,比较两个数的大小,将字符型数据转换成结构体类型数据和将结构体类型数据转换成字符型数据等),在这里主要说明四则运算的程序设计,其它函数的程序设计和具体调用关系请查看程序清单。
3.2.1加法运算的实现
加法计算还是比较容易实现的,对于整数部分的计算,以整数部分位数长的作为循环变量,先从低位算起,因为只须要对应的位相加(相加结果小于20),再加上前一位的进位,再判断本位是否有进位,把进位值改为本位除以它的权(也就是10)取整(既有进位时,给进位赋值1,如果没有进位,则给进位赋值0),然后把本位数字改为本位除以它的权(也就是10)取余。
图2加法运算原理图
对于加法运算中小数部分的计算,也是从低位算起,以小数部分位数长作为循环变量,相加的原理跟整数部分一样。
在程序中设计时应注意:
以上加法运算的原理只