任意长整数的乘法数据结构课程设计报告样本.docx
《任意长整数的乘法数据结构课程设计报告样本.docx》由会员分享,可在线阅读,更多相关《任意长整数的乘法数据结构课程设计报告样本.docx(20页珍藏版)》请在冰豆网上搜索。
任意长整数的乘法数据结构课程设计报告样本
课程设计任务书
专业
计算机科学与技术(专升本)
班级
姓名
设计起止日期
设计题目:
任意长整数的乘法
设计任务(主要技术参数):
数据结构课程设计要求结合《数据结构(C语言版)》课程所学的基础知识进行程序设计,并实现下列目标:
1.经过课堂讲解和学习研究,查阅和收集C语言程序设计的相关资料;
2.进行方案的选择、分析与设计;
3.对程序进行上机调试;
4.写出设计体会;
5.撰写数据结构课程设计报告。
报告力求做到观点正确、方法科学、技术先进。
硬件环境:
CPU:
酷睿i5-2430 内存:
6G 硬盘:
750G
软件环境:
操作系统:
win7
程序开发环境:
VC++6.0
指导教师评语:
成绩:
签字:
年 月 日
课程设计说明书NO.1
任意长整数的乘法
1、课程设计目的
(1)较熟练地掌握数据结构(C语言)课程的基本内容,程序设计的基本方法与编程技巧。
(2)较熟练地掌握C语言程序编辑、编译、连接和运行的方法。
(3)经过运行C程序,了解C语言的特点,培养学生应用计算机解决和处理实际问题的思维方法与基本能力。
2、课程设计方案论证
2.1 设计思路
(1)输入的形式和输入值的范围:
用户从键盘输入2个任意长度的长整数,输入的时候是按4个为一段输入的,即一段一段输入的,求它们的乘积的大小,并将结果在屏幕上显示;2个长整数的输入没有大小的限制,要输入多大的数据,就能够输入多大的数据。
(2)输出的形式:
输出直接在屏幕上显示2个任意长度的长整数的乘积大小。
(3)程序所能达到的功能:
对于用户输入的任意长度的2个的长整数,能够正确没有错误的显示结果,和电脑附件中的计算器的计算值要一致;能够准确无误地显示结果。
(4)测试数据:
如输入10001000和11112个长整数后,显示0111111111111000的话,就是正确的结果形式。
如输入111111111111和11112个长整数后,结果显示0123444444444322就不是正确结果,因为这2个长整数的积为0123444444444321
2.2概要设计
(1)抽象数据类型的定义
为了实现任意长整数的乘法,因为这种运算存在进位和位移等操作,因此选择双链表的结构体(如图2.2.1和图2.2.2),它有一个data,left,right;考虑到data表示的数据的范围,使它只接受4个数字的整数,这样一个长整数就分为若干段,每一段为4个数
沈阳大学
课程设计说明书NO2
字,便于进位和借位以及位移的操作,用户在输入时就是每次输入4个数字。
(2)主程序的流程
主程序是首先调用初始化2个长整数的函数,用户4个数字一段一段地输入2个长整数,用双链表的形式和头插法的形式建立,返回2个长整数的头节点;建立完2个长整数后,就开始进行2个长整数的乘积的运算了;
首先将第一个长整数的全部去乘第2个长整数的最后一段,这样得到一个长整数;接着将第一个长整数的全部去乘第2个长整数的倒数第2段;这样得到一个长整数,可是要向左位移4位;这次得到的长整数要和上一次相加,得到一个新的长整数;接着接着将第一个长整数的全部去乘第2个长整数的倒数第3段,得到一个长整数,再和前面相加;
依次进行,一直到已经到第一个长整数的全部乘于了第2个长整数的最高1段,
那么乘法就结束了;这时将得到的长整数从高位到低位一段一段,4个4个数字显示在屏幕上,程序就运行结束了。
(3)模块之间的层次(调用)关系
程序的调用关系如下:
主函数调用了初始化2个长整数的函数,然后再调用了2个2个长整数的乘积的函数;2个长整数的乘积的函数调用了部分求和的函数和从表头得到表尾的函数,以及将一个长整数前后数值交换的函数以及显示一个长整数的函数。
图1双链表的数据结构
图2双链表的数据结构(虚线部分为地址值,这个是为了描述方便随便写的值)
沈阳大学
课程设计说明书NO.3
2.3详细设计
(1)2个长整数的输入
接着采用头插法的方式,当输入一个4个数字的整数时,就产生一个新的节点,它的值为输入的整数值,建立起它的左右指针,并用头节点指向它;为了判断一个长整数是否输入结束,定义一个结束标志,当输入正数时就继续,当输入负数时,就结束一个长整数的输入;同时用一个函数得到长整数的尾节点和段数,段数在比较2个数的大小有用。
(2)2个长整数的乘法
先定义一个部分加法的函数,就是2个正的长整数的加法的运算;它从2个长整数的尾部开始,同时相加,接着再向左移一段,又同时相加;当2个数据的某一段同时存在时,就相加;当一个数据已经全部被相加后,另外一个数据的剩下的段就要全部复制到和中;在实行加法的时候,设置一个进位标志位,目的是为了使结果正确;当一段的数据相加产生进位时,那么进位标志位为1;下一次一段的数据相加就要加上这个进位标志位;而且如果2个长整数的所有的段的数据都相加完了,还要判断是否产生了进位标志位,如果有的话,就要新建一个节点,它的值就是1;2个正的长整数的求和就完成了。
再定义一个部分乘法的函数,就是1个正的长整数乘于一个4位整数,并向左位移特定的段数的运算;其实开始实现向左位移的运算,只需要建立新的节点,节点的数目为需要左移段数,并将这些节点的值设置为0;接着实现一个长整数乘于一个4位整数的运算,采用每一段都和这个4位整数的相乘的方法,当积超过10000时,那么多于高4位全为进位,参与下一次相乘时要加上它;低4位就是要新建的节点的值;和加法一样,当这个正的长整数的每一段都和这个4位整数相乘后,但还存在进位时,就要新建一个节点,它的值就是进位值;现在1个正的长整数乘于一个4位整数,并向左位移特定的段数的运算就完成了;
再实现2个正的长整数的乘法的运算,采用第一个长整数作为一个整体乘于第二个长整数的每一段,并向左位移的方法;例如当采用第一个长整数作为一个整体乘于第二个长整数的最后一段,就不用向左位移;可是第一个长整数作为一个整体乘于第二个
沈阳大学
课程设计说明书NO.4
长整数的倒数第二段,就用向左位移一段,就是最后一段为0,依次类推;此过程是调用部分乘法的函数实现的;我们只需要定义2个长整数的临时变量,1个是本次新产生的部分乘法的结果,1个是上次的总和;那么总和加上本次新产生的部分乘法的结果重新给总和,此操作是调用2个长整数的加法实现的;第2个数的段一直向左位移,总和也就不断扩大,当第2个数的段达到最高一段时,就完成了2个正的长整数的乘法的运算。
(3)补充说明
在程序中,因为我们需要得到一个长整数的头部和尾部,因此定义了2个函数,一个是已知一个一长整数的头部,得到它的尾部;一个是已知一个一长整数的尾部,得到它的头部;具体实现都是利用指针的左移和右移,为空时就得到头部或尾部;
在程序中,我们输入是从高位到低位输入的,而相加后的顺序就相反了,因此我们需要定义一个将一个长整数的数据前后交换的函数,新建一个一个长整数,使用头插法,将从原来一个长整数的尾部开始,向左移,一个一个给新建的长整数。
2.4 源程序清单
#include
#include
typedefstructlinknode
{intdata;/*节点的值*/
structlinknode*left,*right;
/*左指针和右指针*/
}dnode;
dnode*r1,*r2,*r3,*head1,*head2,*head3;
dnode*head_temp,*rear_temp;
/*head1为第1个数的头指针,r1为为第1个的尾指针*/
/*head2为第2个数的头指针,r2为为第2个的尾指针*/
/*head3为结果的头指针,r3为结果的尾指针*/
/*head_temp为临时数的头指针,rear_temp为临时数的尾指针*/
/*产生一个长整数*/
dnode*creat()
{dnode*head,*p,*s;
/*head为头指针,p和s为临时指针*/
intx,cycle=1;
/*x为输入的数据,cycle为是否继续输入的标志*/
head=(dnode*)malloc(sizeof(dnode));
沈阳大学
课程设计说明书NO.5
p=head;
/*指向头*/
while(cycle)
{scanf("%d",&x);
/*输入数据*/
if(x>=0)/*输入正数才有效*/
{s=(dnode*)malloc(sizeof(dnode));
s->data=x;
p->right=s;
s->left=p;
p=s;
/*采用的是头插法*/
}
elsecycle=0;
/*输入负数就退出*/
}
head=head->right;
/*第一个头没有用到*/
head->left=NULL;
p->right=NULL;
returnhead;
}
dnode*rear(dnode*head)
/*根据一个数的头节点,得到尾节点,并得到这个数的段数*/
{dnode*p;
p=head;
while(p->right)
/*向右移*/
p=p->right;
returnp;
}
voidinput_and_init()
/*初始化2个数据的大小*/
{
/*符号变为对应的0或1*/
printf("inputthefirstdata,inputnegativedataexit\n");
head1=creat();
/*产生第一个数,得到它的头指针*/
r1=rear(head1);
/*得到第一个数的尾指针和*/
沈阳大学
课程设计说明书NO.6
/*符号变为对应的0或1*/
printf("inputtheseconddata,inputnegativedataexit\n");
head2=creat();
/*产生第2个数,得到它的头指针*/
r2=rear(head2);
/*得到第一个数的尾指针和段数*/
}
/*打印一个数*/
voidprint(intdata)
{if(data>=1000)
/*含有4个数字*/
printf("%d",data);
elseif(data>=100)
/*含有3个数字,补1个零*/
printf("0%d",data);
elseif(data>=10)
/*含有2个数字,补2个零*/
printf("00%d",data);
else
/*含有1个数字,补3个零*/
printf("000%d",data);
}
/*显示一个结果的长整数,从后向前移*/
voiddisplay(dnode*rear)
{dnode*p;
p=rear;
while(p)
{print(p->data)