大数据结构课程设计(长整数四则运算.docx

上传人:scccc 文档编号:14760979 上传时间:2022-02-16 格式:DOCX 页数:15 大小:21.53KB
返回 下载 相关 举报
大数据结构课程设计(长整数四则运算.docx_第1页
第1页 / 共15页
大数据结构课程设计(长整数四则运算.docx_第2页
第2页 / 共15页
大数据结构课程设计(长整数四则运算.docx_第3页
第3页 / 共15页
大数据结构课程设计(长整数四则运算.docx_第4页
第4页 / 共15页
大数据结构课程设计(长整数四则运算.docx_第5页
第5页 / 共15页
亲,该文档总共15页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《大数据结构课程设计(长整数四则运算.docx》由会员分享,可在线阅读,更多相关《大数据结构课程设计(长整数四则运算.docx(15页珍藏版)》请在三一文库上搜索。

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

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

3、=1,2,n, n 0基本操作: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 )主程序模块:Void main()选择操作:1 :帮助。2:加法。3:减法。4:乘法。5:

4、除法。6:退出。打印结果;三、详细设计1. 元素类型,结点类型,指针类型#define NULL 0#include#include#includetypedef struct longnode/* 每个节点的结构*/int num;/* 数字 */* 指向低一位节点*/struct longnode *low1;struct longnode *high1;/* 指向高一位节点*/longnode;typedef struct xlonglongnode *High;/* 每个长整数的结构*/* 每个长整数的最高节点*/* 每个长整数的最低节点*/longnode *Low;int digi

5、t4;/* 每个长整数的总位数(不包括高位的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=0;j-high1=NULL;j-low1=(*a)-High;if(*a)-High) (*a)-High-high

6、1=j;else(*a)-Low=j;(*a)-High=j;(*a)-digit4+;int pass(xlong a,xlong b,xlong c)int cf=0;/* 两个数字的相加*/longnode *a1=a-Low,*b1=b-Low,*c1=c-Low;while(a1)c1-num=a1-num+b1-num+cf;if(c1-num9999)cf=1;/*如果产生进位(借位)*/c1-num-=10000;elsecf=0;a1=a1-high1;b1=b1-high1;c1=c1-high1;return cf;int passa(xlong a,xlong b,xl

7、ong c)int cf=0;/* 两个数字的相减*/longnode *a1=a-Low,*b1=b-Low,*c1=c-Low;while(a1)c1-num=a1-num-b1-num-cf;if(c1-num9999)cf=1;/* 如果产生进位(借位)*/ c1-num-=10000;elsecf=0;a1=a1-high1;b1=b1-high1;c1=c1-high1;return cf;int passb(xlong a,xlong b,xlong c)int cf=0;/* 两个数字的相乘*/longnode /* 最高位的进位(借位) */* 最高位的进位(借位) */*a

8、1=a-Low,*b1=b-Low,*c1=c-Low;while(a1)c1-num=a1-num*b1-num*cf;if(c1-num9999)cf=1;/* 如果产生进位(借位)*/elsecf=0;c1-num=10000;a1=a1-high1;b1=b1-high1;c1=c1-high1;return cf;int passc(xlong a,xlong b,xlong c)int cf=0;/* 两个数字的相除*/* 最高位的进位(借位) */longnode *a1=a-Low,*b1=b-Low,*c1=c-Low;while(a1) c1-num=a1-num/b1-n

9、um/cf;if(c1-num9999)cf=1;/* 如果产生进位(借位)*/else cf=0;c1-num-=10000;a1=a1-high1;b1=b1-high1;c1=c1-high1; nep(xlong a)int cf=1;/* 求 a 的相反数*/return cf;/* 最高位的进位(借位) */* 因为求相反数是取反加一,所以这里cf=1; */longnode *a1=a-Low;while(a1) a1-num=9999-(a1-num)+cf;if(a1-num9999)a1-num=10000;elsecf=0;a1=a1-high1;return;print

10、long(xlong a)longnode *i=a-High;/* 打印长整数a */if(i-num=5000)printf(-); /* 最高位 (bit)=1 表示负数,即用补码表示*/nep(a);/*求反打印其绝对值*/ while(i&i-num=0) i=i-low1;/* 跳过最位的0 */if(i) printf( “ , ” );/* a=0 打 0 */if(i)printf(%d,i-num);i=i-low1;else printf( “ 0” );while(i)printf(%04d,i-num);if(i-low1)printf(,);i=i-low1; in

11、t ston(char in,xlong out)int bit,i,jishu=1,num0=0;/* 把字符串转化为数字赋给a */longnode*j=out-Low;i=strlen(in)-1;while(i=0 & j)/* 循环每一个字节*/bit=ini- 0 把字符形式的值赋给整数形式的 ;/*bit */if(bit=0 & bit 1&(jishu=10000|bit9) /* 数字以外的字符*/j-num=num0;j=j-high1;i-;if(num0)/* 存入一个节点*/num0=0;jishu=1;j-num=num0;j=j-high1;/* 把最后一个没存

12、入节点的数存入节点*/for(;j;j=j-high1) j-num=0;/* 最位不足补0 */if(out-High-num=5000)return 1;/* 如果最高位是1,返回 1 表示出 */if(in0=-) nep(out);/* 如果最后一个字符是 则取反*/return 0;int add()char *a1,*b1;/* 加 */int digit4,cf=0;xlong a,b,c;do printf(How much digits do you need?);/* 输入最多位数 */scanf(%d,&digit4);while(digit4=0);a1=(char*)

13、malloc(digit4+1);b1=(char*)malloc(digit4+1);init(&a,digit4);init(&b,digit4);init(&c,digit4); /* 初始化 a,b,c */docf=0;printf(Enter 2 number:n);scanf(%s,a1);printf(+n);scanf(%s,b1);cf|=ston(a1,a);cf|=ston(b1,b);while(cf);/* 输入被加数和加数,如果转换出错,则重输 */pass(a,b,c);/*执行相加运算*/* 打印结果 */printlong(a);printf(+);prin

14、tlong(b);printf(=);printlong(c);printf(n);printf(n);bioskey(0);int subtract()/* 减 */char *a1,*b1;int digit4,cf=0;xlong a,b,c;doprintf(How much digits do you need?);/* 输入最多位*/scanf(%d,&digit4);while(digit4=0);a1=(char*)malloc(digit4+1);b1=(char*)malloc(digit4+1);init(&a,digit4);init(&b,digit4);init(&

15、c,digit4); /* 初始化 a,b,c */docf=0;printf(Enter2number:n);scanf(%s,a1);printf(n);scanf(%s,b1);cf|=ston(a1,a);cf|=ston(b1,b);while(cf);passa(a,b,c);/*输入被减数和减数,如果转换出错,则重输*/*执行相减运算*/printlong(a);printf(-); /* 打印结果*/printlong(b);printf(=);printlong(c);printf(n);printf(n);bioskey(0);int multiply() /* 乘 */c

16、har *a1,*b1;int digit4,cf=0;xlong a,b,c;do printf(How much digits do you need?);/* 输入最多位数 */scanf(%d,&digit4);while(digit4=0);a1=(char*)malloc(digit4+1);b1=(char*)malloc(digit4+1);init(&a,digit4);init(&b,digit4);init(&c,digit4); /* 初始化 a,b,c */docf=0;printf(Enter2number:n);scanf(%s,a1);printf(*n);sc

17、anf(%s,b1);cf|=ston(a1,a);cf|=ston(b1,b);while(cf);/* 输入被乘数和乘数,如果转换出错,则重输*/passb(a,b,c);/*执行相乘运算*/printlong(a);printf( 打印结果 “ *” );/*/printlong(b);printf(=);printlong(c);printf(n);printf(n);bioskey(0);int division()/* 除 */char *a1,*b1;int digit4,cf=0;xlong a,b,c;do printf(How much digits do you need

18、?);scanf(%d,&digit4);while(digit4=0);a1=(char*)malloc(digit4+1);b1=(char*)malloc(digit4+1);init(&a,digit4);init(&b,digit4);init(&c,digit4); /* 初始化 a,b,c */docf=0;printf(Enter 2 number:n);scanf(%s,a1);printf(/n);/* 输入最多位数*/scanf(%s,b1);cf|=ston(a1,a);cf|=ston(b1,b);while(cf);passc(a,b,c);/*输入被除数和除数,如

19、果转换出错,则重输*/*执行相除运算*/printlong(a);printf(/); /* 打印结果*/printlong(b);printf(=);printlong(c);printf(n);printf(n);bioskey(0);2.主函数代码void main()/*main*/int c;clrscr();textcolor(BLUE);printf(*n);printf(*Welcome to Thunderstudio!*n);printf(”*n);printf(”*本程序实现长整数四则运算*n);one:printf(1: HELPn);printf(2: ADDn);p

20、rintf(3: SUBTRACTn);printf(4: MULTIPLYn);printf(5: DiVISIONn);printf(6: EXITn);for(;)c=getch();switch(atoi(&c)goto one;break;case 1: clrscr();case 2: add();break;case 3:subtract();break;case 4:multiply();break;case 5:division();break;case 6:textcolor(BLUE);n);printf(nprintf(Thanks cws work!n);break;

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

22、须释放空间.五、用户手册1 .本程序的运行环境为DOS操作系统,执行文件为:j01242_5.EXE2 .进入程序有菜单提示,选择需要的操作进入程序。3 .进入程序后屏幕提示“ How much digits do you need用户输入两个数中最多的位数.如 0 则输 1,12则输入2,依此类推.负号不必考虑在内.4 .接着屏幕提示“Enter 2 number:用户应输入一个数,按回车,再输入一个数, 再按回车.5 .接着屏幕即打印出计算结果.六、测试结果首先进入菜单选择:如键入2回车(1)键入1回车 0回车0回车输出“0”键入(2)8回车 -2345,6789回车 -7654,3211回车输出“-1,000,000”(3)键入13回车 -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回车输出115 / 15

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1