长整数四则运算+数据结构课程设计的报告书.docx

上传人:太** 文档编号:86526629 上传时间:2023-04-14 格式:DOCX 页数:9 大小:22.51KB
返回 下载 相关 举报
长整数四则运算+数据结构课程设计的报告书.docx_第1页
第1页 / 共9页
长整数四则运算+数据结构课程设计的报告书.docx_第2页
第2页 / 共9页
点击查看更多>>
资源描述

《长整数四则运算+数据结构课程设计的报告书.docx》由会员分享,可在线阅读,更多相关《长整数四则运算+数据结构课程设计的报告书.docx(9页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、长整数四那么运算题目:编制一个演示长整数的四那么运算的程序 一、需求分析1 .本程序实现计算任意长的整数的四那么运算.以用户和计算机对话 的方式,先后输入数字的最多位数,然后程序就计算并显示出这两个数 的运算。2 .利用双向循环链表现实长整数的存储,每个结点含一个整形变量。输 入的形式以回车完毕,可以直接输入正数或负数,程序会过滤掉无效的 字符。按中国对于长整数的表示习惯,每四位一组,除数字和位于首位 置的负号外,其它一切字符都将作为分隔符,连续多个分隔符当一个处 理。但不使用分隔符也不影响结果。3 .测试数据(1)0; 0;输出“0”;(2)-2345,6789; -7654,3211;输出

2、 “-1,000,000”;(3)-9999,9999; 1,0000,0000,0000;输出 “9999,0000,0001”;(4)1,0001,0001;-1,0001,0001;输出 “0”;(5)1,0001,0001;-1,0001,0001;输出 T;(6)-9999,9999,9999; -9999,9999,9999;输出 “-1,9999,9999,9998”;(7)1,0000,9999,9999; 1;输出1,0001,0000,0000.二、概要设计为实现上述程序功能,应以双向循环链表表示长整数。为此,需要定义 一个抽象数据类型。1 .抽象数据类型定义为:ADT O

3、rderedList2 .数据对象:D=ai|aiint,i=l,2,.n, nO基本操作:init(&a,digit4)操作结果:构造一个位数是digit4*4长整数。pass(&a,&b,&c)初始条件:a,b,c都已存在操作结果:c等于a和b的和。nep(&a)初始条件:a已存在。操作结果:a变为输入参数的相反数。printlong(&a)初始条件:a已存在。操作结果:按四位一组,分隔符为“,”的格式,在屏幕上输出a。ston(&S,&a)初始条件:a已存在。操作结果:把字符串形式的长数字赋给a。ADT OrderedList2 .本程序包含两个模块:1主程序模块:Vbidmain()

4、选择操作:助法法法法出帮加减乘除退打印结果;)三、详细设计1 .元素类型,结点类型,指针类型#defineNULLO#include#include#includetypedef struct longnode /*每个节点的构造*/int num;/*数字*/struct longnode *lowl;/*指向低一位节点*/struct longnode *highl; /*指向高一位节点*/ longnode;typedef struct xlong/*每个长整数的构造*/longnode *High;/*每个长整数的最高节点*/longnode *Low;/*每个长整数的最低节点*/in

5、t digit4;/*每个长整数的总位数(不包括高位的0)/4 */*xlong;int init(xlong *a,int digit4) int I; /*.init.*/longnode*j;(*a)=(xlong)malloc(sizeof(struct xlong);/*为 a 的头构造申请空间,并赋初 始值*/(*a)High=NULL;(*a)-Low=NULL;(*a)-High=NULL; (*a)-Low=NULL;(*a)-digit4=0;for(i=0;inum=O;j-high 1 二NULL; j-low 1 =(*a)-High;if(*a)-High) (*a

6、)-High-high 1 二j;else(*a)-Low=j ;(*a)-High=j ;(*a)-digit4+;)int pass(xlong a,xlong belong c)int cf=0;/*两个数字的相加*/longnode *al=a-Low,*bl=b-Low,*cl=c-Low;while(al) c 1 -num=a 1 -num+b 1 -num+cf;if(c l-num9999)cf=l;/*如果产生进位(借位)*/cl-num-= 10000;elsecf=0;al=al-high l;bl=bl-high l;cl=cl-highl;return cf;/*最

7、高位的进位(借位)*/)int passa(xlong a,xlong b,xlong c)intcf=0;/*两个数字的相减*/longnode *al=a-Low,*bl=b-Low,*cl=c-Low;while(a l)cl-num=a 1 -num-b l-num-cf;if(c 1 -num9999)cf= 1 ;/* 如果产生进位(借位)*/ cl-num-= 10000;elsecf=0;al=al-high l;bl=bl-high l;cl=cl-high 1;)return cf;/*最高位的进位(借位)*/)int passb(xlong a,xlong b,xlong

8、 c)intcf=0;/*两个数字的相乘*/longnode*a 1 =a-Low,*b 1 =b-Low,*c l=c-Low;while(a l)cl-num=a 1 -num*b 1 -num*cf;if(c 1 -num9999) cf=l; /* 如果产生进位(借位)*/ cl-num= 10000;elsecf=0;al=al-high l;bl=bl-high l;cl=cl-high 1;return cf; /*最高位的进位(借位)*/)int passc(xlong a,xlong b,xlong c)intcf=0;/*两个数字的相除*/longnode *al =a-L

9、ow,*b 1 =b-Low,*c 1 =c-Low;while(a 1) cl-num=a 1 -num/bl-num/cf;if(c 1 -num9999)cf=l; /* 如果产生进位(借位)*/cl-num-=10000;else cf=0;al=al-high l;bl=bl-high l;cl=cl-high 1; return cf; /*最高位的进位(借位)*/)nep(xlong a)/* 求 a 的相反数 */int cf=l; /*因为求相反数是取反加一,所以这里cf=l; */ longnode *al=a-Low;while(al) al-num=9999-(al -

10、num)+cf;if(a l-num9999)a l-num= 10000;else cf=0; al=al-high 1;)return;)printlong(xlong a)longnode *i=a-High;/* 打印长整数 a*/if(i-num=5000) printf(-); /*最高位(bit)=l表示负数,即用补码表示*/nep(a); /*求反打印其绝对值*/ while(i&i-num=0) i=i-lowl; /* 跳过最位的 0 */if(i)printf(n%dn,i-num); i=i-lowl;if(i)printf(, );else printf(0); /*

11、 a=0 打 0 */while(i)printf(n%04dn,i-num);if(i-lowl)printf(f7,);i=i-lowl; int ston(char in,xlong out) /*把字符串转化为数字赋给a */ int bit,i ,jishu=l ,num0=0;longnode *j=out-Low;i=strlen(in)-l;while(i=0 & j)/* 循环每一个字节 */bit=ini-40,;/*把字符形式的值赋给整数形式的bit */if(bit=0 & bit 1 &(jishu= 10000|bit9) /* 数字以外的字符 */j-num=nu

12、m0;j=j-highl; /* 存入一个节点 */num0=0;jishu=l;)i-;)if(num0)j-num=numO;j=j-highl;/*把最后一个没存入节点的数存入节点*/for(;j;j=j-highl) j-num=0; /* 最位缺乏补 0 */if(out-High-num=5000)return 1; /*如果最高位是1,返回1表示出*/if(in0=!J) nep(out);/*如果最后一个字符是一那么取反*/ return0;)int add() char *al,*bl;/*力口*/int digit4,cf=0;xlong a,b,c;do printf(n

13、How much digits do you need?);/* 输入最多位数*/ scanf(n%dn,&digit4);)while(digit4=0);a 1 =(char*)malloc(digit4+1);b 1 =(char*)malloc(digit4+1);digit4=digit4/4+l;init(&a,digit4);init(&b,digit4);init(&c,digit4); /* 初始化 a,b,c */do cf=O; printf(nEnter 2 number:nn);scanf(n%sal);printf(H+nn);scanf(n%sn,bl);cf|=

14、ston(al,a);cf|=ston(bl,b);)while(cf);/*输入被加数和加数,如果转换出错,那么重输*/pass(a,b,c); /*执行相加运算*/printlong(a);printf(+); /* 打印结果 */printlong(b) ;printf(f-n);printlong(c) ;printf(nnn);printf(unn);bioskey(0);int subtract。/* 减*/(charint digit4,cf=0;xlong a,b,c;doprintf(nHow much digits do you need?);/* 输入最多位*/ scan

15、f(d&digit4); while(digit4=0);al =(char*)malloc(digit4+1);b 1 =(char*)malloc(digit4+1);digit4=digit4/4+l;init(&a9digit4);init(&b,digit4);init(&c,digit4); /* 初始化 a,b,c */do cf=0;printf(nEnter2number:nn);scanf(n%sn,al);printf(Mnn);scanf(n%sbl);cf|=ston(al,a);cf|=ston(bl9b);while(cf);/*输入被减数和减数,如果转换出错,那

16、么重输*/passa(a,b,c);/*执行相减运算*/printlong(a);printf(M-M);/* 打印结果 */printlong(b) ;printf(n=n);printlong(c);printf(nnn);printf(nnn);bioskey(0);)int multiply() /* 乘*/ charint digit4,cf=0;xlong a,b,c;do printf(nHow much digits do you need?n); /* 输入最多位数 */ scanf(n%d&digit4);while(digit4=0);a 1 =(char*)malloc

17、(digit4+1); bl =(char*)malloc(digit4+1);digit4=digit4/4+1;init(&a,digit4);init(&b,digit4);init(&c,digit4); /* 初始化 a,b,c */do cf=0;printf(n Enter2number: nn);scanf(n%sal);printf(n*nn);scanf(n%sn,bl);cf|=ston(al,a);cf|=ston(bl,b);while(cf);/*输入被乘数和乘数,如果转换出错,那么重输*/passb(a,b,c); /*执行相乘运算*/printlong(a);p

18、rintf(*);/* 打印结果 */printlong(b);printf(f-n);printlong(c);printf(nnn);printf( nnn) ;bioskey (0);int division() /* 除*/ charint digit4,cf=0;xlong a,b,c;do printf(nHow much digits do you need?); /*输入最多位数 */ scanf(n%d&digit4); while(digit4=0);a 1 =(char*)malloc(digit4+1);b 1 =(char)malloc(digit4+1);digit

19、4=digit4/4+1;init(&a,digit4);init(&b,digit4);init(&c,digit4); /* 初始化 a,b,c */do cf=O;printf(nEnter 2 number:nn);scanf(n%sal);prmtf(n/nn);scanf(n%sn,bl);cfl=ston(al,a);cf=ston(bl,b);while(cf); /*输入被除数和除数,如果转换出错,那么重输*/passc(a,b,c); /*执行相除运算*/printlong(a);printf(,7n); /* 打印结果 */printlong(b) ;printf(n=n

20、);printlong(c) ;printf(H nn);printf(Hnn) ;bioskey (0);)2 .主函数代码void main() /*main*/ int c;clrscr();textcolor(BLUE); / r / f f7,7,7, 7,7,7,7,7,7,7,7,7,7,7, 11 ,十,rjwrjw k! k! *JkJ* k| k|k! k!k!k! k1k!k! k!k| k! k|f f r 111(rpwrjwry* ry*7 | printf(* *本程序 实现长整数四 那 么运算* *n);one: printf(nl:HELPn!);printf

21、(n2:ADDnn);printf(n3:SUBTRACT/);printf(n4:MULTIPLY);printf(n5:DiVISIONnn);printf(n6:EXITnn);for(;)c=getch();switch(atoi(&c) clrscr(); goto one; break;case 1: add(); break;case 2: subtract(); break;multiply(); break;case 3: division(); break;textcolor(BLUE);nn);printf(nnprintf(nThanks cws work!nn);br

22、eak;default: textcolor(4);printf(nSorry please input right number!nn); break;I、调试分析.由于对 基本要求看得不仔细,一开场使用的形式是数组,并非链表,导 致空间开销大.1 .本程序的模块划分比较合理,且尽可能将指针的操作封装在构造体中, 对于一个长整数只需一个指针便可访问其所有信息,所以数据构造清晰.2 .算法的时空分析1)本程序的计算量不是很大,所以时间复杂度极低. 2)每个长整数的位数可能不同,考虑到根据位数调整空间比较麻烦,而且 容易出错,所以对每个长整数都是用同样大小的空间储存的.3)由于计算完毕,显示结果

23、后程序即完毕,所以无须释放空间.五、用户手册.本程序的运行环境为DOS操作系统,执行文件为:jO1242_5.EXE。1 .进入程序有菜单提示,选择需要的操作进入程序。2 .进入程序后屏幕提示“How much digits do you need?用户输入两个数 中最多的位数.如0那么输1,12那么输入2,依此类推.负号不必考虑在内.3 .接着屏幕提示“Enter 2 mimbe亡,用户应输入一个数,按回车,再输入一 个数,再按回车.4 .接着屏幕即打印出计算结果.六、测试结果首先进入菜单项选择择:如键入2回车(1)键入1回车0回车0回车输出“0(2)键入 8回车,-2345,6789V回车,-7654,3211回车输出 “-1,000,000”(3)键入 13回车A-9999,9999回车,1,0000,0000,0000回车,输出 “9999,0000,0001”(4)键入 9回车 1,0001,0001回车-1,0001,0001回车,输出 “0”(5)键入 9回车 1,0001,0001回车-1,0001,0001回车输出1参考资料严蔚敏参考数据的名称:数据构造

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 解决方案

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁