大数据结构课程设计(长整数四则运算)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、需求分析
1.本程序实现计算任意长的整数的四则运算. 以用户和计算机对话的方式,先后输入数字的最多位数,然后程序就计算并显示出这两个数的运算。
2. 利用双向循环链表现实长整数的存储,每个结点含一个整形变量。输入的形式以回车结束,可以直接输入正数或负数,程序会过滤掉无效的字符。按中国对于长整数的表示习惯,每四位一组,除数字和位于首位置的负号外,其它一切字符都将作为分隔符,连续多个分隔符当一个处理。但不使用分隔符也不影响结果。
3.测试数据(1)0; 0; 输出“0”; (2)-2345,6789; -7654,3211; 输出“-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; 输出“1”; (6)-9999,9999,9999;
-9999,9999,9999; 输出“-1,9999,9999,9998”; (7)1,0000,9999,9999; 1; 输出"1,0001,0000,0000".
二、概要设计
为实现上述程序功能,应以双向循环链表表示长整数。为此,需要定义一个抽象数据类型。
1. 抽象数据类型定义为:
ADT OrderedList{
数据对象:D={ai|ai∈int,i=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 OrderedList
2.本程序包含两个模块:
1)主程序模块:V oid main(){
选择操作:
1:帮助。
2:加法。
3:减法。
4:乘法。
5:除法。
6:退出。
打印结果;
}
三、详细设计
1.元素类型,结点类型,指针类型
#define NULL 0
#include
#include
#include
typedef struct longnode{ /*每个节点的结构*/
int num; /*数字*/
struct longnode *low1; /*指向低一位节点*/
struct longnode *high1; /*指向高一位节点*/
}longnode;
typedef struct xlong{ /*每个长整数的结构*/
longnode *High; /*每个长整数的最高节点*/
longnode *Low; /*每个长整数的最低节点*/
int 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;i j=(longnode*)malloc(sizeof(longnode)); j->num=0;j->high1=NULL; j->low1=(*a)->High; if((*a)->High) (*a)->High->high1=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->num>9999){ cf=1; /* 如果产生进位(借位) */ c1->num-=10000; }else{cf=0;} a1=a1->high1;b1=b1->high1;c1=c1->high1;} return cf; /* 最高位的进位(借位) */ } int passa(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->num>9999){cf=1;/* 如果产生进位(借位) */ c1->num-=10000; }else{cf=0;} a1=a1->high1;b1=b1->high1;c1=c1->high1; } return cf; /* 最高位的进位(借位) */ } int passb(xlong a,xlong b,xlong c){ int cf=0;/* 两个数字的相乘*/ longnode *a1=a->Low,*b1=b->Low,*c1=c->Low;