ImageVerifierCode 换一换
格式:DOC , 页数:17 ,大小:125.54KB ,
资源ID:4515390      下载积分:5 金币
快捷注册下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/4515390.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(任意长整数的乘法数据结构课程设计报告.doc)为本站上传会员【二***】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

任意长整数的乘法数据结构课程设计报告.doc

1、课 程 设 计 任 务 书   专 业 计算机科学与技术(专升本) 班 级 姓 名 设 计 起 止 日 期 设计题目:任意长整数的乘法 设计任务(重要技术参数): 数据结构课程设计规定结合《数据结构(C语言版)》课程所学的基础知识进行程序设计,并实现下列目的: 1. 通过课堂讲解和学习研究,查阅和收集C语言程序设计的相关资料; 2. 进行方案的选择、分析与设计; 3. 对程序进行上机调试; 4. 写出设计体会; 5. 撰写数据结构课程设计报告。报告力求做到观点对的、方法科学、技术先进。  硬件环境:CPU: 酷睿i5-2430    内存:6G  硬

2、盘:750G  软件环境:操作系统: win7 程序开发环境:VC++6.0 指导教师评语:         成绩:    签字: 年   月   日 课程设计说明书 NO.1  任意长整数的乘法 1、课程设计目的 (1)较纯熟地掌握数据结构(C语言)课程的基本内容,程序设计的基本方法与编程技巧。 (2)较纯熟地掌握C语言程序编辑、编译、连接和运营的方法。 (3)通过运营C程序,了解C语言的特点,培养学生应用计算机解决和解决实际问题的思维方法与基本能力。 2、课程设计方案论证 2.1  设计思绪 (1)

3、输入的形式和输入值的范围: 用户从键盘输入2个任意长度的长整数,输入的时候是按4个为一段输入的,即一段一段输入的,求它们的乘积的大小,并将结果在屏幕上显示;2个长整数的输入没有大小的限制,要输入多大的数据,就可以输入多大的数据。 (2)输出的形式: 输出直接在屏幕上显示2个任意长度的长整数的乘积大小。 (3)程序所能达成的功能: 对于用户输入的任意长度的2个的长整数,可以对的没有错误的显示结果,和电脑附件中的计算器的计算值要一致;可以准确无误地显示结果。 (4)测试数据: 如输入1000 1000 和1111 2个长整数后,显示0111 1111 1111 100

4、0的话,就是对的的结果形式。 如输入1111 1111 1111和1111 2个长整数后,结果显示0123 4444 4444 4322就不是对的结果,由于这2个长整数的积为0123 4444 4444 4321 2.2概要设计 (1)抽象数据类型的定义 为了实现任意长整数的乘法,由于这种运算存在进位和位移等操作,因此选择双链表的结构体(如图2.2.1和图2.2.2),它有一个data,left,right;考虑到data表达的数据的范围,使它只接受4个数字的整数,这样一个长整数就分为若干段,每一段为4个数

5、 沈 阳 大 学 课程设计说明书 NO2 字,便于进位和借位以及位移的操作,用户在输入时就是每次输入4个数字。 (2)主程序的流程 主程序是一方面调用初始化2个长整数的函数,用户4个数字一段一段地输入2个长整数,用双链表的形式和头插法的形式建立,返回2个长整数的头节点;建立完2个长整数后,就开始进行2个长整数的乘积的运算了; 一方面将第一个长整数的所有去乘第2个长整数的最后一段,这样得到一个长整数;接着将第一个长整数的所有去乘第2个长整数的倒数第2段;这样得到一个长整数,但是要向左位

6、移4位; 这次得到的长整数要和上一次相加,得到一个新的长整数;接着接着将第一个长整数的所有去乘第2个长整数的倒数第3段,得到一个长整数,再和前面相加; 依次进行,一直到已经到第一个长整数的所有乘于了第2个长整数的最高1段, 那么乘法就结束了;这时将得到的长整数从高位到低位一段一段,4个4个数字显示在屏幕上,程序就运营结束了。 (3)模块之间的层次(调用)关系 程序的调用关系如下:主函数调用了初始化2个长整数的函数,然后再调用了2个2个长整数的乘积的函数;2个长整数的乘积的函数调用了部分求和的函数和从表头得到表尾的函数,以及将一个长整数前后数值互换的函数以及显示一个长整数的函数。

7、图1双链表的数据结构 图2双链表的数据结构(虚线部分为地址值,这个是为了描述方便随便写的值) 沈 阳 大 学 课程设计说明书 NO.3 2.3具体设计 (1)2个长整数的输入 接着采用头插法的方式,当输入一个 4个数字的整数时,就产生一个新的节点,它的值为输入的整数值,建立起它的左右指针,并用头节点指向它;为了判断一个长整数是否输入结束,定义一个结束标志,当输入正数时就继续,当输入负数时,就结束一个长整数的输入;同时

8、用一个函数得到长整数的尾节点和段数,段数在比较2个数的大小有用。 (2)2个长整数的乘法 先定义一个部分加法的函数,就是2个正的长整数的加法的运算;它从2个长整数的尾部开始,同时相加,接着再向左移一段,又同时相加;当2个数据的某一段同时存在时,就相加;当一个数据已经所有被相加后,此外一个数据的剩下的段就要所有复制到和中;在实行加法的时候,设立一个进位标志位,目的是为了使结果对的;当一 段的数据相加产生进位时,那么进位标志位为1;下一次一段的数据相加就要加上这个进位标志位;并且假如2个长整数的所有的段的数据都相加完了,还要判断是否产生了进位标志位,假如有的话,就要新建一个节点,它的值就

9、是1;2个正的长整数的求和就完毕了。 再定义一个部分乘法的函数,就是1个正的长整数乘于一个4位整数,并向左位移特定的段数的运算;其实开始实现向左位移的运算,只需要建立新的节点,节点的数目为需要左移段数,并将这些节点的值设立为0;接着实现一个长整数乘于一个4位整数的运算,采用每一段都和这个4位整数的相乘的方法,当积超过10000时,那么多于高4位全为进位,参与下一次相乘时要加上它;低4位就是要新建的节点的值;和加法同样,当这个正的长整数的每一段都和这个4位整数相乘后,但还存在进位时,就要新建一个节点,它的值就是进位值;现在1个正的长整数乘于一个4位整数,并向左位移特定的段数的运算就完毕了;

10、再实现2个正的长整数的乘法的运算,采用第一个长整数作为一个整体乘于第二个长整数的每一段,并向左位移的方法;例如当采用第一个长整数作为一个整体乘于第二个长整数的最后一段,就不用向左位移;但是第一个长整数作为一个整体乘于第二个 沈 阳 大 学 课程设计说明书 NO.4 长整数的倒数第二段,就用向左位移一段,就是最后一段为0,依次类推;此过程是调用部分乘法的函数实现的;我们只需要定义2个长整数的临时变量,1个是本次新产生的部分乘法的

11、结果,1个是上次的总和;那么总和加上本次新产生的部分乘法的结果重新给总和,此操作是调用2个长整数的加法实现的;第2个数的段一直向左位移,总和也就不断扩大,当第2个数的段达成最高一段时,就完毕了2个正的长整数的乘法的运算。 (3)补充说明 在程序中,由于我们需要得到一个长整数的头部和尾部,因此定义了2个函数,一个是已知一个一长整数的头部,得到它的尾部;一个是已知一个一长整数的尾部,得到它的头部;具体实现都是运用指针的左移和右移,为空时就得到头部或尾部; 在程序中,我们输入是从高位到低位输入的,而相加后的顺序就相反了,因此我们需要定义一个将一个长整数的数据前后互换的函数,新建一个一个长整数,

12、使用头插法,将从本来一个长整数的尾部开始,向左移,一个一个给新建的长整数。 2.4  源程序清单 #include #include typedef struct linknode {int data;/*节点的值*/ struct linknode *left,*right; /*左指针和右指针*/ }dnode; dnode *r1,*r2,*r3,*head1,*head2,*head3; dnode *head_temp,*rear_temp; /*head1为第1个数的头指针,r1为 为第1个的尾指针*/ /

13、head2为第2个数的头指针,r2为 为第2个的尾指针*/ /*head3为结果的头指针,r3为结果的尾指针*/ /*head_temp为临时数的头指针,rear_temp为临时数的尾指针*/ /*产生一个长整数*/ dnode* creat() {dnode *head,*p,*s; /*head为头指针,p和s为临时指针*/ int x,cycle=1; /*x为输入的数据,cycle为是否继续输入的标志*/ head=(dnode*)malloc(sizeof(dnode));

14、 沈 阳 大 学 课程设计说明书 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; /*采用的是头插法*/ } else cycle=0; /*输入负数就退出*/ } head=head->right; /*第一个头没有用到*/ h

15、ead->left=NULL; p->right=NULL; return head; } dnode *rear(dnode *head) /*根据一个数的头节点,得到尾节点,并得到这个数的段数*/ {dnode *p; p=head; while(p->right) /*向右移*/   p=p->right; return p; } void input_and_init() /*初始化2个数据的大小*/ { /*符号变为相应的0或1*/ printf("input the first data,input negative data

16、 exit\n"); head1=creat(); /*产生第一个数,得到它的头指针*/ r1=rear(head1); /*得到第一个数的尾指针和*/ 沈 阳 大 学 课程设计说明书 NO.6 /*符号变为相应的0或1*/ printf("input the second data,input negative data exit\n"); head2=creat(); /*产生第2个数,

17、得到它的头指针*/ r2=rear(head2); /*得到第一个数的尾指针和段数*/ } /*打印一个数*/ void print(int data) {if(data>=1000) /*具有4个数字*/ printf("%d",data); else if(data>=100) /*具有3个数字,补1个零*/ printf("0%d",data); else if(data>=10) /*具有2个数字,补2个零*/ printf("00%d",data); else /*具有1个数字,补3个零*/ printf("000%d",da

18、ta); } /*显示一个结果的长整数,从后向前移*/ void display(dnode *rear) {dnode *p; p=rear; while(p) {print(p->data); printf(" "); p=p->left; /*向左移*/ } printf("\n"); } dnode *find_sum2(dnode *r1,dnode *r2) /*得到2个正数的和*/ {dnode *head,*p,*s,*p1,*p2; /*head为头指针,p,s为临时指针,p1指向第1个数并向左移动,p2指向第2个数并并向左

19、移动*/ int inc=0,sum=0,f1=0,f2=0; /*inc为进位,sum为和,f1为第一个数是否结束,f2为第一个数是否结束*/ head=(dnode*)malloc(sizeof(dnode)); 沈 阳 大 学 课程设计说明书 NO.7 p=head; /*开辟空间*/ p1=r1;/*指向第一个数的尾*/ p2=r2;/*指向第二个数的尾*/ while(p1!=NULL&&p2!=NULL)

20、 /*2个数的某一段都不为空时 */ {sum=p1->data+p2->data+inc; /*和为2个数之和加进位*/ inc=0; /* 进位回0*/ if(sum>=10000) /*当超过2位数的大小时,和减去10000,并进位*/ {sum=sum-10000; inc=1; } /*用头插法建立一个新的节点*/ s=(dnode*)malloc(sizeof(dnode)); s->data=sum; p->right=s; s->left=p; p=s; /*2个数都向左移*/ p1=p1->left; p2=p2->left; } i

21、f(p1==NULL&&p2==NULL) if(inc==1) /*当2个数据都完了,但是存在进位时,新建一个节点,值就是进位*/ {s=(dnode*)malloc(sizeof(dnode)); s->data=1; p->right=s; s->left=p; p=s; } while(p1!=NULL) /*当第2个数空,第1个数不为空时,将第一个数剩下的全用新节点产生*/ {f1=1; s=(dnode*)malloc(sizeof(dnode)); sum=p1->data+inc; inc=0; if(sum>=10000)

22、 沈 阳 大 学 课程设计说明书 NO.8 {sum=sum-10000; inc=1; } s->data=sum; p->right=s; s->left=p; p=s; /*第1个数都向左移*/ p1=p1->left; } /*当第1个数据完了,但是存在进位时,新建一个节点,值就是进位*/ if(f1==1&&inc==1&&!p1) { s=(dnode*)malloc(sizeof(dnode)); s->data=

23、1; p->right=s; s->left=p; p=s; } /*当第1个数空,第2个数不为空时,将第一个数剩下的全用新节点产生*/ while(p2!=NULL) {f2=1; s=(dnode*)malloc(sizeof(dnode)); sum=p2->data+inc; inc=0; if(sum>=10000) {sum=sum-10000; inc=1; } s->data=sum; p->right=s; s->left=p; p=s; p2=p2->left; /*第2个数都向左移*/ } /*当第2个数据完了,但是存在进位时,

24、新建一个节点,值就是进位*/ if(f2==1&&inc==1) {s=(dnode*)malloc(sizeof(dnode)); s->data=1; p->right=s; s->left=p; 沈 阳 大 学 课程设计说明书 NO.9 p=s; } head=head->right; head->left=NULL; p->right=NULL; return head; /*返回头节点*/ } dnod

25、e * find_sub_mult(dnode * r1,int data ,int i) /*将r1指向的数全乘于data,并向左位移i段*/ {dnode *head,*p,*s,*rr; /*head为头指针,p,s为临时指针,rr为尾指针*/ int k,inc=0; /*k为循环用的,inc为进位*/ long sum=0; /*求和*/ rr=r1; head=(dnode*)malloc(sizeof(dnode)); p=head; /*开辟空间*/ /*先将需要位移的段数全用0补齐*/ if(i!=0) {for(k=1;k<=i;k++)

26、 { s=(dnode*)malloc(sizeof(dnode)); s->data=0; p->right=s; s->left=p; p=s; } } while(rr!=NULL) /* 当rr没有到头时*/ {s=(dnode*)malloc(sizeof(dnode)); sum=rr->data*data+inc; if(sum>10000) {inc=sum/10000; /*得到和的高4位*/ s->data=sum-inc*10000; /*值为低4位的值*/ }

27、 沈 阳 大 学 课程设计说明书 NO.10 else {s->data=sum; /*直接给值*/ inc=0; } p->right=s; s->left=p; p=s; /*左移*/ rr=rr->left; } if(inc!=0) /*假如尚有进位,就需要新建一个节点*/ { s=(dnode*)malloc(sizeof(dnode)); s->data=inc; p->right=s; s->left=p; p=s; } head=head->right; hea

28、d->left=NULL; p->right=NULL; /*返回头指针*/ return head; } /*由一个数的尾指针得到头指针*/ dnode * return_head(dnode *rear) { dnode *p; p=rear; while(p->left) p=p->left; return p; } /*由一个数的头指针得到尾指针*/ dnode * return_rear(dnode *head) { dnode *p; p=head; while(p->right)

29、 沈 阳 大 学 课程设计说明书 NO.11 p=p->right; return p; } /*将一个数的数据前后互换*/ dnode * tansfer_rear2(dnode *rear_temp) {dnode *head,*p,*s,*rear; rear=rear_temp; head=(dnode*)malloc(sizeof(dnode)); p=head; while(rear!=NULL) /*将后面的节点向左一个一个用头插法建立,就和本来相反了*/ {s=(

30、dnode*)malloc(sizeof(dnode)); s->data=rear->data; p->right=s; s->left=p; p=s; rear=rear->left; } head=head->right; head->left=NULL; p->right=NULL; return p; } /*2个数相乘,将第1个数乘于第2个数的每一段,要进行响应的移位解决,得到一系列的数,再相加*/ void multy(dnode *r1,dnode *r2) {dnode * p;int i=0,flag=0; p=r2; while(p

31、NULL) {head_temp=find_sub_mult(r1,p->data,i); /*将r1中所有的数乘于p->data,并向左位移i段*/ rear_temp=return_rear(head_temp); /*得到尾*/ rear_temp=tansfer_rear2(rear_temp); /*求反*/ if(flag==0) /*假如是第一个段,直接给r3*/ {r3=rear_temp; flag=1; } Else 沈 阳

32、大 学 课程设计说明书 NO.12 { /*假如不是第一个段,将r3和当前的结果相加*/ head3=find_sum2(r3,rear_temp); r3=return_rear(head3); r3=tansfer_rear2(r3); } i++; /*需要位移的段数增长*/ /*p左移*/ p=p->left; } r3=tansfer_rear2(r3); /*互换*/ display(r3); /*显示最后结果*/ } void main() { input_and_init(); multy(r1,r2

33、); getchar(); } 沈 阳 大 学 课程设计说明书 NO.13 3、课程设计运营结果与分析 3.1用户使用说明 本程序使用简朴,运营程序后出现了input the first data,input negative data exit的提醒,告诉用户输入第一个长整数,4个数字一段输入,要想结束输入直接输入一个负数就可以结束了;如需要输入1011 1011时; input the first da

34、ta,input negative data exit 1011 1011 -1 接着出现input the second data,input negative data exit的提醒,告诉用户输入第2个长整数,4个数字一段输入,要想结束输入直接输入一个负数就可以结束了;如需要输入1011 1011时; input the second data,input negative data exit 1011 1011 -1 0102 2325 4344 2121 输入完以后,程序直接显示运营结果,按回车就退出程序。运营结果如图: 图2

35、 运营结果 沈 阳 大 学 课程设计说明书 NO.14 3.2算法的时空分析 时间复杂度:由于2个长整数的乘法是用第一个长整数的所有乘于了第2个长整数的每一段然后想加得到的,因此它事实上就是2重循环的作用,假设2个数的段数分别为n1和n2,那么算法的时间复杂度为n1和n2的乘积; 空间复杂度: 空间复杂度是和2个长整数的段数成正比, 2个长整数的段数越多,那么需要开辟的空间越多,求和需要的长整数的开辟的空间也越多。

36、 沈 阳 大 学 课程设计说明书 NO.15 4、课程设计体会 在写程序中要规范书写,这样便于检查错误的出现所在的地方;写代码要前后照应,前面的变量和函数在后面使用时也许要相应,假如不注意,也许发生错误;当出现错误时,要大胆猜测各种犯错的也许的因素,一种一种排除,一种一种尝试,问题也许解决。定义了指针就需要开辟空间,否则会犯错;同时指针开辟的空间单元要初始一定的值, 否则会出现不需要的数据。 5、参考文献 [1] 赵梦龙.数据结构在通讯录管理系统设计中的应用[

37、M].数字技术与应用.2023.05:300-325 [2] 汪博.面向手机终端的数据备份系统的研究与实现[M].中南大学,2023.06:45-50 [3] 杨猛.学习迁移理论在数据结构课程设计中的应用及探索[M].计算机教育.2023.03:90-110 [4] 吴鹏.计算思维驱动的数据结构实践教学改革[J].福建电脑.2023.08:4-10 [5] 张淑娴.基于形象关联模式通讯录的设计与实现[J].无锡学报.2023.07:86-80 [6] 焦阳.具有身份验证和灾备功能的高效数据同步模型[D].南京邮电大学,2023.12:67-70 [7] 刘宁.手机通讯录云备份的安全解决[D].河北科技大学,2023.10:89-92 沈 阳 大 学

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服