长整数的加减运算系统说明文档11003601.docx
- 文档编号:28004959
- 上传时间:2023-07-07
- 格式:DOCX
- 页数:22
- 大小:130.36KB
长整数的加减运算系统说明文档11003601.docx
《长整数的加减运算系统说明文档11003601.docx》由会员分享,可在线阅读,更多相关《长整数的加减运算系统说明文档11003601.docx(22页珍藏版)》请在冰豆网上搜索。
长整数的加减运算系统说明文档11003601
《数据结构与算法》
课程设计说明书
题目:
长整数的加减运算
学院:
计算机科学与工程学院
专业:
信息安全
姓名:
xxxxxxxx
学号:
11003601xx
指导教师:
张瑞霞老师
2013年9月13日
成绩评定标准及成绩
1、能按照格式进行写作,无抄袭现象(10分)
2、报告内容行文通畅,有条理性,无错别字,结构严谨。
(10分)
3、能够按照数据结构课设的格式要求、排版要求和字数要求等,有需求分析,系统分析,详细设计,关键技术的介绍和参考文献。
(10分)
4、在验收过程中,能合理的回答问题(20分)
5、软件能正常运行,实现所提出的功能(40分)
6、软件代码规范性较好(5分)
7、具有自己的创新或特色(5分)
总成绩:
1、前言
本系统主要内容是为数据结构长整数加法的实现,所以整个程序是为了实现长整数的加减法运算。
设计一个实现任意长的整数间进行四则运算的程序,要求完成长整数的加运算和减运算。
长整数的长度没有限制,可以是任意长,正确处理好运算之后的进位和借位。
每个结点中可以存放的最大整数为215-1=32767,才能保证两数相加不会溢出。
但若这样存,即相当于按32768进制数存,在十进制数与32768进制数之间的转换十分不方便。
故可以在每个结点中仅存十进制数4位,即不超过9999的非负整数,整个链表视为万进制数。
可以利用头结点数据域的符号代表长整数的符号。
用其绝对值表示元素结点数目。
相加过程中不要破坏两个操作数链表。
两操作数的头指针存于指针数组中是简化程序结构的一种方法。
不能给长整数位数规定上限。
由于在某些工程上进行加减运算时,有时候需要对很大的长整数进行计算,但是计算机本身提供的数据类型无法保证存在几百位甚至几千位的数字,所以需要设计专门的算法系统对数据进行相应的计算。
因此本系统的设计主要任务是:
设计一个程序能够实现任意长整数的加减运算的程序,而且能够对一些错误异常进行辨别调整,从而迅速计算出正确无误的结果。
程序输入格式是字符串,包含元素的范围是数字,都好,负号以及分号,保存时需要用到双链表将字符串每四位保存在循环链表中的一个结点中,然后在计算出运行结果。
虽然程序有些复杂,但使用方法十分简单,只需按照相关提示进行操作即可,能够为用户的学习和工作带来快捷与方便。
2、需求分析
本系统主要内容是为数据结构长整数加法的实现,所以整个程序是为了实现长整数的加减法运算。
设计一个实现任意长的整数间进行四则运算的程序,要求完成长整数的加运算和减运算。
长整数的长度没有限制,可以是任意长,正确处理好运算之后的进位和借位。
2.1.问题描述:
首先最初的目的是设计一个实现任意长的整数进行加法运算的演示程序。
2.2.基本要求:
利用双向循环链表实现长整数的存储,每个结点含一个整型变量。
任何整型变量的范围是-(215-1)~(215-1)。
输入输出形式:
按照中国对于长整数的表示习惯,每四位是一组,组间用逗号隔开。
2.3.更高要求:
(1)仅仅是能运行长整数的加法,还是不能达到我们运算的需求,因此,对于长整数的减法运算的设计将是对我们系统更高的一次挑战。
(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,9999,9998”。
(7)1,0000,9999,9999;1;应输出“1,0001,0000,0000”。
注:
实现提示:
(1)每个结点中可以存放的最大整数为215-1=32767,才能保证两数相加不会溢出。
但若这样存,即相当于按32768进制数存,在十进制数与32768进制数之间的转换十分不方便。
故可以在每个结点中仅存十进制数的4位,即不超过9999的非负整数。
整个链表是为万进制数。
(2)可以利用头结点数据域的符号代表长整数的符号。
用其绝对值表示元素结点数目。
相加过程中不要破坏两个操作数链表。
两操作数的头指针存于指针数组中是简化程序结构的一种方法。
不能给长整数位数规定上限。
2.5.开发环境VisualC++6.0(完整绿色版)
VisualC++6.0(完整绿色版)使用说明:
1、软件安装后,在桌面和开始菜单里分别建立快捷方式。
2、此版本适用于计算机等级考试上机环境及一般的C++应用。
3、此版本为默认安装后对安装文件夹完整打包,并安装windows\system32下的相应文件。
4、系统默认安装在:
C:
\ProgramFiles\MicrosoftVisualStudio。
5、VC6.0通用补丁:
特别适合于解决错误信息:
“Compiling...,Errorspawningcl.exe”
使用方法:
退出VC,运行此文件,单击"是",再启动VC,可解决大部分问题。
6、系统安装后,如果考试系统提示没有安装VC,不影响使用,自行从桌面的快捷方式启动vc,
然后打开需要调试的程序,调试即可,不影响考试系统评分。
3、系统概述
3.1.关键技术。
3.1.1存储结构:
循环双向链表。
循环链表是将单链表的形式稍作改变,不让最后一个结点的指针指为NULL,而让它指向头一个结点;双链表给运算带来的最大好处是可以很容易地找到结点的前驱和后继。
将双链表的头一个结点和最后一个结点连接起来,这样不增加额外存储却给某些运算带来方便。
图3.1.1.加入头结点的循环双链表
3.1.2.主要算法的基本思想:
每个结点中可以存放的最大整数为215-1=32767,才能保证两数相加不会溢出。
但若这样存,即相当于按32768进制数存,在十进制数与32768进制数之间的转换十分不方便。
故可以在每个结点中仅存十进制数4位,即不超过9999的非负整数,整个链表视为万进制数。
可以利用头结点数据域的符号代表长整数的符号。
用其绝对值表示元素结点数目。
相加过程中不要破坏两个操作数链表。
两操作数的头指针存于指针数组中是简化程序结构的一种方法。
不能给长整数位数规定上限。
3.1.3.数据结构设计:
因为计算的事一个连续的数字,需要按顺序一次计算,所以采用的数据结构的逻辑结构是线性表。
根据用户需求每一个结点只存储四位数字,为了将数字连接起来,采用的数据结构的存储结构是链式。
3.2.相关的函数接口
3.2.1.结构体:
structdl_node
{
intx;
dl_node*pre;
dl_node*next;
};
3.2.2.初始化:
voidlist_init(dl_node**h)
3.2.3.插入元素:
voidlist_insert(dl_node*h,intx)
3.2.4.输出链表:
voidprin(dl_node*h)
3.2.5.实现相加:
voidlist_add(dl_node*h1,dl_node*h2)
3.2.6.实现相减:
voidlist_sub(dl_node*h1,dl_node*h2)
3.3.功能设计
3.3.1.输入两个数,用链表来存储。
链表的头结点的数据的值为1时,表示的是输入的数非负;为-1时表示输入的数是负数。
3.3.2.在创建链表时,让高位在链表的尾部,低位在链表的头部。
3.3.3.在做加法时,先判断两个数的符号是否相同,如果相同,在根据加数的符号,决定和数的符号,取两个数的绝对值做加法,但是的处理进位。
3.3.4.如果异号,用一函数来判断和的符号,判断异号的两个数相加和的符号,当两个数的长度不相等时,取较长数的符号作为和的符号,否则比两个数的大小,再决定和的符号。
3.3.5.异号的两个数想加时,先去两个数的绝对值,用较大的数减去较小的数,差作为和的绝对值。
如果相应的位够减时,直接做减法,否则借位,但是要注意被借位的值是否为零,如果为零,则继续借位。
3.3.6.输出最终结果,输出数时,要去掉大数最前面的零,直到数的首位不是零时为止。
在输出地位的数时,有可能某些单元的数低于四位,必须要在四位数的高位补零,即四位一个单元输出。
空缺处用零补齐。
4、系统分析
对于本系统而言:
如果是两个长整数相加,每个加数都需要一个循环链表存储,则必须定义两个循环链表h1、h2,即:
循环双链表;
while(p!
=h)
循环双向链表一直往右找,直到找到头结点为止
{
printf(",%04d",p->x);
%04d为对齐方式,当一个结点值不足4位则补齐
p=p->next;
}
puts("");
}
元素值相加,已处理好h1比h2的长度大于等于h1的长度
最后结果保存在h1(即长串中)
voidlist_add(dl_node*h1,dl_node*h2)
{
dl_node*p=h1->pre,*q=h2->pre;
inte=0;
while(q!
=h2)
每次相加,如果有进位则保存到e变量中
{
inttmp=p->x+q->x+e;
if(tmp>9999)
{
p->x=tmp%10000;
e=tmp/10000;
}
else
p->x=tmp;
p=p->pre;
q=q->pre;
}
当h1长度大于h2的时候,还要对未相加的部分进行操作
while(p!
=h1)
{
inttmp=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(即长串中)
voidlist_sub(dl_node*h1,dl_node*h2)
{
dl_node*p=h1->pre,*q=h2->pre;
此处flag的值即位借位的值,借位的值为0或者为1,因为减0无关紧要
intflag=0;
while(q!
=h2)
{
if(p->x-flag>=q->x)
{
p->x-=q->x+flag;
flag=0;
}
else
{
p->x=p->x+10000-q->x-flag;
flag=1;
}
p=p->pre;
q=q->pre;
}
同样的,如果h1的长度大于h2的长度,那么对剩下的操作
while(p!
=h1)
{
if(p->x-flag<0)
{
p->x=p->x+10000-flag;
flag=1;
}
else
{
p->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;
}
}
打印输入提示
intmain()
{
cout<<"----------------------------------------------------"< cout<<"桂林电子科技大学计算机科学与工程学院信息安全"< cout<<""< cout<<""< cout<<"11003601班罗宗聪"< cout<<""< cout<<"----------------------------------------------------"< cout<<"欢迎使用-长整数的加减运算-系统"< cout<<"请输入两个任意长整数,并以;隔开,然后‘Enter’"< cout<<""< cout<<"如: 1314,5210+5210,1314"< cout<<"1314,5210;"< cout<<"5210,1314;"< cout<<"6524,6524"< cout<<"----------------------------------------------------"< //freopen("大数求和.txt","r",stdin); while (1) { puts(""); charc; inta; dl_node*h1,*h2; list_init(&h1); 输入元素,直到读入";"则停止输入第一个链表值 while (1) { //cout<<"asdfa"; scanf("%d%c",&a,&c); //cout< 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); intr=0; 相同方法输入第二个链表,碰到";"则停止,并且读到文件结束 while (1) { if(scanf("%d%c",&a,&c)==EOF) { r=1; break; } list_insert(h2,a); if(c==';') break; } //cout< 如果第一个元素小于0,则取正值,并在头结点当中保存信息 if(h2->next->x<0) { h2->x=-h2->x; h2->next->x=-h2->next->x; } /h1_num和h2_num分别表示长度 inth1_num=h1->x,h2_num=h2->x; 把长的放到h1里面,是为了后面的加减操作更顺利 if(abs(h1_num) { dl_node*tmp=h1; h1=h2; h2=tmp; h1_num=h1->x,h2_num=h2->x; } //cout< 此处为重点部分,分为两个部分,如果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; } 如果都为负数 else if(h1_num<0&&h2_num<0) { list_add(h1,h2); cout<<"-"; prin(h1); continue; } 如果h1为正而h2为负 elseif(h1_num>0&&h2_num<0) { list_sub(h1,h2); prin(h1); continue; } 如果h1为负而h2为正 else if(h1_num<0&&h2_num>0) { cout<<"-"; list_sub(h1,h2); prin(h1); } } 否则,如果他们长度都相等的话: else { 如果都为正数 if(h1_num>0&&h2_num>0) { list_add(h1,h2); prin(h1); continue; } 如果都为负数 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) { 这种情况,如果h1最高结点元素大于h2的最高元素,那么交换链表 if(h1->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为正 else if(h1_num<0&&h2_num>0) { if(h1->next->x { dl_node*tmp=h1; h1=h2; h2=tmp; //cout<<"-"; } 否则为负值,要输出负号 elsecout<<"-"; list_sub(h1,h2); prin(h1); } } 5、系统的调试与结果 5.1.调试过程出现的问题以及解决方法 由于对编程的熟练度不是很高,所以在编程的过程中往往很容易出现错误。 比如说,本系统同时应用了多个函数接口,有些接口可能尝试了很多次也不一定能够成功;调试中由于使用了数据结构的循环双链表,在插入时缺乏考虑,刚开始写程序是忘记,导致输入、输出结果错误。 这是最好的解决方法好了尝试还是尝试,是在不行的话,就请教老师和同学。 5.2.成功的测试数据截图 5.2.1以下是用户界面: 图5.2.1 5.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.2 6、课设小结 通过这次学习,让我认识到自己在学习上的诸多不足。 从刚拿到题目到完成整个编程,从理论到实践,虽然学到很多的的东西,但是也因为自己知识的不足,不能考虑周全,完全成功的完成此次课程设计。 在认识自己的不足后,我便开始认真复习书本知识,同时与动手能力强的同学互相交流,让自己学到了很多平时上课过程中学不到的东西。 在这次课程设计,我深刻的认识到,理论知识需要与实践结合,才能真正领悟所学知识。 同时我发现,我现在的动手能力不强,所以还要继续努力。 同时还要学会独立思考,才能真正的编出属于我自己的程序。 经过本次的课程设计,过程曲折可谓一语难尽。 整天都是对着电脑,不然就是翻阅资料。 在此期间我失落过,也曾一度热情高涨。 点点滴滴令我回味无长。 这次课程设计使我体会到只有做到细心耐心,恒心才能做好事情。 这次的课程设计,加强了我们动手、思考和解决问题的能力。 巩固和加深了对数据结构的理解,提高综合运用本课程所学知识的能力。 培养了我选用参考书,查阅手册及文献资料的能力。 培养独立思考,深入研究,分析问题、解决问题的能力。 通过实际编译系统的分析设计、编程调试,掌握应用软件的分析方法和工程设计方法。 通过课程设计,培养了我严肃认真的工作作风,逐步建立正确的生产观念、经济观念和全局观念。 而且做课程设计同时也是对课本知识的巩固和加强,平时看课本时,有些问题就不是很能理解,做完课程设计,那些问题就迎刃而解了。 而且还可以记住很多东西。 认识来源于实践,实践是认识的动力和最终目的,实践是检验真理的唯一标准。 所以这个期末测试之后的课程设计对我们的作用是非常大的。 这次的课程设计使我懂得了理论与实际相结合是很非常重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。 在整个设计过程中,构思是很花费时间的。 调试时经常会遇到这样那样的错误,有的是因为粗心造成的语法错误。 当然,很多也时用错了方法,总是实现不了。 同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。 经过这次课程设计,它将会敦促我将过去学习过的知识进行了温习,知识只有多巩固,才能真正的理解与领悟。 不论这次课程设计是否完全成功,我相信它对我的影响还是很大的。 这会敦促我在下次课程设计中,能更好地完成设计任务。 为自己加油! 7、参考文献: 【1】C++程序设计教程(第2版),罗建军,朱丹等编著,高等教育出版社2007.8;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 整数 加减 运算 系统 说明 文档 11003601