长整数的加减运算系统说明文档11003601_第1页
长整数的加减运算系统说明文档11003601_第2页
长整数的加减运算系统说明文档11003601_第3页
长整数的加减运算系统说明文档11003601_第4页
长整数的加减运算系统说明文档11003601_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、桂林电子科技大学综合设计说明书用纸 数据结构与算法课程设计说明书题 目: 长整数的加减运算 学 院: 计算机科学与工程学院 专 业: 信 息 安 全 姓 名: xxxxxxxx 学 号: 11003601xx 指导教师: 张 瑞 霞 老 师 2013年 9 月 13 日桂林电子科技大学综合设计说明书用纸 第 21 页 成绩评定标准及成绩1、 能按照格式进行写作,无抄袭现象(10分)2、 报告内容行文通畅,有条理性,无错别字,结构严谨。(10分)3、 能够按照数据结构课设的格式要求、排版要求和字数要求等,有需求分析,系统分析,详细设计,关键技术的介绍和参考文献。(10分)4、 在验收过程中,能合

2、理的回答问题(20分)5、 软件能正常运行,实现所提出的功能(40分)6、 软件代码规范性较好(5分)7、 具有自己的创新或特色(5分) 总成绩: 目 录1、前言22、需求分析32.1.问题描述:32.2.基本要求:42.3.更高要求:42.4.测试数据:42.5.开发环境 Visual C+6.0(完整绿色版)43、系统概述53.1.关键技术。53.2.相关的函数接口63.3.功能设计64、系统分析75、系统的调试与结果165.1.调试过程出现的问题以及解决方法165.2.成功的测试数据截图176、课设小结197、参考文献:201、前言本系统主要内容是为数据结构长整数加法的实现,所以整个程序

3、是为了实现长整数的加减法运算。设计一个实现任意长的整数间进行四则运算的程序,要求完成长整数的加运算和减运算。长整数的长度没有限制,可以是任意长,正确处理好运算之后的进位和借位。每个结点中可以存放的最大整数为215-1=32767,才能保证两数相加不会溢出。但若这样存,即相当于按32768进制数存,在十进制数与32768进制数之间的转换十分不方便。故可以在每个结点中仅存十进 制数4位,即不超过9999的非负整数,整个链表视为万进制数。可以利用头结点数据域的符号代表长整数的符号。用其绝对值表示元素结点数目。相加过程中不要破坏两个操作数链表。两操作数的头指针存于指针数组中是简化程序结构的一种方法。不

4、能给长整数位数规定上限。由于在某些工程上进行加减运算时,有时候需要对很大的长整数进行计算,但是计算机本身提供的数据类型无法保证存在几百位甚至几千位的数字,所以需要设计专门的算法系统对数据进行相应的计算。因此本系统的设计主要任务是:设计一个程序能够实现任意长整数的加减运算的程序,而且能够对一些错误异常进行辨别调整,从而迅速计算出正确无误的结果。程序输入格式是字符串,包含元素的范围是数字,都好,负号以及分号,保存时需要用到双链表将字符串每四位保存在循环链表中的一个结点中,然后在计算出运行结果。虽然程序有些复杂,但使用方法十分简单,只需按照相关提示进行操作即可,能够为用户的学习和工作带来快捷与方便。

5、2、需求分析 本系统主要内容是为数据结构长整数加法的实现,所以整个程序是为了实现长整数的加减法运算。设计一个实现任意长的整数间进行四则运算的程序,要求完成长整数的加运算和减运算。长整数的长度没有限制,可以是任意长,正确处理好运算之后的进位和借位。2.1.问题描述:首先最初的目的是设计一个实现任意长的整数进行加法运算的演示程序。2.2.基本要求:利用双向循环链表实现长整数的存储,每个结点含一个整型变量。任何整型变量的范围是(2151)(2151)。输入输出形式:按照中国对于长整数的表示习惯,每四位是一组,组间用逗号隔开。2.3.更高要求:(1) 仅仅是能运行长整数的加法,还是不能达到我们运算的需

6、求,因此,对于长整数的减法运算的设计将是对我们系统更高的一次挑战。(2)多个长整数的连续加减法,并带括号等。具体方式可以参见表达式的求值部分,利用栈。2.4.测试数据:(1)0;0;应输出“0”。(2)2345,6789;7654,3211;应输出“1,0000,0000”。(3)9999,9999;1,0000,0000,0000;应输出“9999,0000,0001”。(4)1,0001,0001;1,0001,0001;应输出“0”。(5)1,0001,0001;1,0001,0000;应输出“1”。(6)9999,9999,9999;9999,9999,9999;应输出“1,9999,

7、9999,9998”。(7)1,0000,9999,9999;1;应输出“1,0001,0000,0000”。注:实现提示:(1)每个结点中可以存放的最大整数为215132767,才能保证两数相加不会溢出。但若这样存,即相当于按32768进制数存,在十进制数与32768进制数之间的转换十分不方便。故可以在每个结点中仅存十进制数的4位,即不超过9999的非负整数。整个链表是为万进制数。(2) 可以利用头结点数据域的符号代表长整数的符号。用其绝对值表示元素结点数目。相加过程中不要破坏两个操作数链表。两操作数的头指针存于指针数组中是简化程序结构的一种方法。不能给长整数位数规定上限。2.5.开发环境

8、Visual C+6.0(完整绿色版) Visual C+ 6.0 (完整绿色版)使用说明: 1、软件安装后,在桌面和开始菜单里分别建立快捷方式。2、此版本适用于计算机等级考试上机环境及一般的C+应用。3、此版本为默认安装后对安装文件夹完整打包,并安装windowssystem32下的相应文件。4、系统默认安装在:C:Program FilesMicrosoft Visual Studio 。5、VC6.0通用补丁:特别适合于解决错误信息:“Compiling. , Error spawning cl.exe” 使用方法:退出VC,运行此文件,单击"是",再启动VC,可解决

9、大部分问题。6、 系统安装后,如果考试系统提示没有安装VC,不影响使用,自行从桌面的快捷方式启动vc, 然后打开需要调试的程序,调试即可,不影响考试系统评分。3、系统概述3.1.关键技术。3.1.1存储结构:循环双向链表。 循环链表是将单链表的形式稍作改变,不让最后一个结点的指针指为NULL,而让它指向头一个结点;双链表给运算带来的最大好处是可以很容易地找到结点的前驱和后继。将双链表的头一个结点和最后一个结点连接起来,这样不增加额外存储却给某些运算带来方便。 图3.1.1.加入头结点的循环双链表3.1.2.主要算法的基本思想: 每个结点中可以存放的最大整数为215-1=32767,才能保证两数

10、相加不会溢出。但若这样存,即相当于按32768进制数存,在十进制数与32768进制数之间的转换十分不方便。故可以在每个结点中仅存十进 制数4位,即不超过9999的非负整数,整个链表视为万进制数。 可以利用头结点数据域的符号代表长整数的符号。用其绝对值表示元素结点数目。相加过程中不要破坏两个操作数链表。两操作数的头指针存于指针数组中是简化程序结构的一种方法。不能给长整数位数规定上限。3.1.3.数据结构设计: 因为计算的事一个连续的数字,需要按顺序一次计算,所以采用的数据结构的逻辑结构是线性表。根据用户需求每一个结点只存储四位数字,为了将数字连接起来,采用的数据结构的存储结构是链式。3.2.相关

11、的函数接口3.2.1.结构体:struct dl_nodeint x;dl_node *pre;dl_node *next;3.2.2.初始化:void list_init(dl_node * h) 3.2.3.插入元素:void list_insert(dl_node *h,int x)3.2.4.输出链表:void prin(dl_node *h)3.2.5.实现相加:void list_add(dl_node *h1,dl_node *h2)3.2.6.实现相减:void list_sub(dl_node *h1,dl_node *h2)3.3.功能设计3.3.1.输入两个数,用链表来存

12、储。链表的头结点的数据的值为1时,表示的是输入的数非负;为-1时表示输入的数是负数。3.3.2.在创建链表时,让高位在链表的尾部,低位在链表的头部。3.3.3.在做加法时,先判断两个数的符号是否相同,如果相同,在根据加数的符号,决定和数的符号,取两个数的绝对值做加法,但是的处理进位。3.3.4.如果异号,用一函数来判断和的符号,判断异号的两个数相加和的符号,当两个数的长度不相等时,取较长数的符号作为和的符号,否则比两个数的大小,再决定和的符号。3.3.5.异号的两个数想加时,先去两个数的绝对值,用较大的数减去较小的数,差作为和的绝对值。如果相应的位够减时,直接做减法,否则借位,但是要注意被借位

13、的值是否为零,如果为零,则继续借位。3.3.6.输出最终结果,输出数时,要去掉大数最前面的零,直到数的首位不是零时为止。在输出地位的数时,有可能某些单元的数低于四位,必须要在四位数的高位补零,即四位一个单元输出。空缺处用零补齐。4、系统分析 对于本系统而言: 如果是两个长整数相加,每个加数都需要一个循环链表存储,则必须定义两个循环链表h1、h2,即:循环双链表;while(p!=h) 循环双向链表一直往右找,直到找到头结点为止printf(",%04d",p->x);%04d为对齐方式,当一个结点值不足4位则补齐p=p->next;puts("&quo

14、t;);元素值相加,已处理好h1比h2的长度大于等于h1的长度最后结果保存在h1(即长串中)void list_add(dl_node *h1,dl_node *h2)dl_node *p=h1->pre,*q=h2->pre;int e=0;while(q!=h2)每次相加,如果有进位则保存到e变量中int tmp=p->x+q->x+e;if(tmp>9999)p->x=tmp%10000;e=tmp/10000;elsep->x=tmp; p=p->pre; q=q->pre;当h1长度大于h2的时候,还要对未相加的部分进行操作whi

15、le(p!=h1)int tmp=p->x+e;if(tmp>9999)p->x=tmp%10000;e=tmp/10000;else p->x=tmp; p=p->pre;p=h1->next;如果最高位得到的结果还有进位,那么就要再创建一个结点if(e!=0)dl_node *s;s=(dl_node *)malloc(sizeof(dl_node);s->x=e;s->pre=p->pre;p->pre->next=s;s->next=p;p->pre=s;元素值相减 方法同相加类似最后结果保存在h1(即长串中

16、)void list_sub(dl_node *h1,dl_node *h2)dl_node *p=h1->pre,*q=h2->pre;此处flag的值即位借位的值,借位的值为0或者为1,因为减0无关紧要int flag=0;while(q!=h2)if(p->x-flag>=q->x)p->x-=q->x+flag;flag=0;elsep->x=p->x+10000-q->x-flag;flag=1;p=p->pre;q=q->pre;同样的,如果h1的长度大于h2的长度,那么对剩下的操作while(p!=h1)if

17、(p->x-flag<0)p->x=p->x+10000-flag;flag=1;elsep->x=p->x-flag;flag=0;p=p->pre;如果最高位为0的话,那么就要删除最高位的结点了p=h1->next;while(p->x=0)p->pre->next=p->next;p->next->pre=p->pre;p=h1->next;打印输入提示int main()cout<<"-"<<endl;cout<<"桂林电子科

18、技大学 计算机科学与工程学院 信息安全 "<<endl;cout<<""<<endl;cout<<""<<endl;cout<<" 11003601班 罗宗聪 "<<endl;cout<<""<<endl;cout<<"-"<<endl;cout<<" 欢迎使用-长整数的加减运算-系统 "<<endl<&l

19、t;endl;cout<<"请输入两个任意长整数,并以 ; 隔开,然后Enter"<<endl;cout<<""<<endl; cout<<"如:1314,5210 + 5210,1314"<<endl;cout<<" 1314,5210;"<<endl;cout<<" 5210,1314;"<<endl;cout<<" 6524,6524"&l

20、t;<endl;cout<<"-"<<endl; / freopen("大数求和.txt","r",stdin);while(1)puts("");char c;int a;dl_node *h1,*h2;list_init(&h1);输入元素,直到读入 " ; "则停止输入第一个链表值while(1) /cout<<"asdfa"scanf("%d%c",&a,&c);/cout<&

21、lt;c<<endl;list_insert(h1,a);if(c='') break;如果第一个元素小于0,则取负值,并在头结点当中保存信息if(h1->next->x<0)h1->x=-h1->x;h1->next->x=-h1->next->x;/prin(h1);list_init(&h2);int r=0;相同方法输入第二个链表,碰到 " ; "则停止,并且读到文件结束while(1)if(scanf("%d%c",&a,&c)=EOF)

22、r=1;break;list_insert(h2,a);if(c='')break;/cout<<r<<endl;如果第一个元素小于0,则取正值,并在头结点当中保存信息if(h2->next->x<0)h2->x=-h2->x;h2->next->x=-h2->next->x;/h1_num和h2_num分别表示长度int h1_num=h1->x,h2_num=h2->x;把长的放到h1里面,是为了后面的加减操作更顺利if(abs(h1_num)<abs(h2_num)dl_nod

23、e *tmp=h1;h1=h2;h2=tmp;h1_num=h1->x,h2_num=h2->x;/cout<<h1_num<<" "<<h2_num<<endl;此处为重点部分,分为两个部分,如果h1大于h2四种情况如果h1等于h2也有四种情况如果他们的长度不相等,即h1大于 h2了if(abs(h1_num)!=abs(h2_num)如果都为正数if(h1_num>0&&h2_num>0)/prin(h1);list_add(h1,h2);prin(h1);continue;如果都为

24、负数elseif(h1_num<0&&h2_num<0)list_add(h1,h2);cout<<"-"prin(h1);continue;如果h1为正而h2为负else if(h1_num>0&&h2_num<0)list_sub(h1,h2);prin(h1);continue;如果h1为负而h2为正elseif(h1_num<0&&h2_num>0)cout<<"-"list_sub(h1,h2);prin(h1);否则,如果他们长度都相等

25、的话:else如果都为正数if(h1_num>0&&h2_num>0)list_add(h1,h2);prin(h1);continue;如果都为负数else if(h1_num<0&&h2_num<0)list_add(h1,h2);cout<<"-"prin(h1);continue;如果h1为正而h2为负else if(h1_num>0&&h2_num<0)这种情况,如果h1最高结点元素大于h2的最高元素,那么交换链表if(h1->next->x<h2-&

26、gt;next->x)dl_node *tmp=h1;h1=h2;h2=tmp;/h1_num=h1->x,h2_num=h2->x;/prin(h1);/prin(h2);这种情况得先输出一个负号cout<<"-"交换之后加法还是一样list_sub(h1,h2);prin(h1);continue;如果h1为负而h2为正elseif(h1_num<0&&h2_num>0)if(h1->next->x<h2->next->x)dl_node *tmp=h1;h1=h2;h2=tmp;/

27、cout<<"-"否则为负值,要输出负号else cout<<"-"list_sub(h1,h2);prin(h1); 5、系统的调试与结果5.1.调试过程出现的问题以及解决方法 由于对编程的熟练度不是很高,所以在编程的过程中往往很容易出现错误。比如说,本系统同时应用了多个函数接口,有些接口可能尝试了很多次也不一定能够成功;调试中由于使用了数据结构的循环双链表,在插入时缺乏考虑,刚开始写程序是忘记,导致输入、输出结果错误。这是最好的解决方法好了尝试还是尝试,是在不行的话,就请教老师和同学。 5.2.成功的测试数据截图5.2.1以下

28、是用户界面: 图5.2.15.2.2测试数据(1)0;0;应输出“0”。(2)2345,6789;7654,3211;应输出“1,0000,0000”。(3)9999,9999;1,0000,0000,0000;应输出“9999,0000,0001”。(4)1,0001,0001;1,0001,0001;应输出“0”。(5)1,0001,0001;1,0001,0000;应输出“1”。(6)9999,9999,9999;9999,9999,9999;应输出“1,9999,9999,9998”。(7)1,0000,9999,9999;1;应输出“1,0001,0000,0000”。 图5.2.26、课设小结通过这次学习,让我认识到自己在学习上的诸多不足。从刚拿到题目到完成整个编程,从理论到实践,虽然学到很多的的东西,但是也因为自己知识的不足,不能考虑周全,完全成功的完成此次课程设计。在认识自己的不足后,我便开始认真复习书本知识,同时与动手能力强的同学互相交流,让自己

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论