任意长整数加法运算
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程名称: 《数据结构》课程设计
课程设计题目: 任意长整数加法运算
姓名: XXX
专业: 计算机科技2班年级: 13级学号: E11314XXX
指导老师:XXX
2015年9月17
目录
1.课程设计的目的 (1)
2.需求分析 (1)
3任意长整数加法的设计 (2)
3.1概要设计 (2)
3.2详细设计 (3)
3.3调试分析 (9)
3.4用户手册 (10)
3.5测试结果 (10)
4总结 (11)
5、程序清单:(见附录) (11)
7、程序运行结果 (11)
附录1 (13)
1.课程设计的目的
(1) 熟练使用 C 语言编写程序,解决实际问题;
(2) 了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;
(3) 初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;
(4) 提高综合运用所学的理论知识和方法独立分析和解决问题的能力;
2.需求分析
(1)设计一个实现任意长的整数加法运算演示程序。
(2)利用双向链表实现长整数的存储,每个结点含一个整型变量。
(3)输入输出形式按中国对长整数的表示习惯,每四位一组,用逗号隔开。
3任意长整数加法的设计
3.1概要设计
(1)主界面设计
图 1
图2
主界面,如图1所示,包含四个菜单项,输入数字选择对应菜单,进入子项。其中选项2包含子菜单,如图2所示。
(2)存储结构
本系统用结构体linlist存储数据,该结构体由数据data、下一节点指针next、上一节点指针prior组成。data是short型变量,存放每个结点的数据。本系统中data 一般不超过10000。用结构体linlist构建链表,头结点的data域符号代表长整数的符号,绝对值表示链表结点数目。
(3)系统功能设计
本系统主菜单包含四个选项,功能描述如下:
菜单1:输入两个任意长的整数。可按照标准四位一组中间用逗号隔开输入,也可直接输入,输入的数字保存在文件中,结束后自动返回主菜单。
菜单2:实现两个任意长整数的加法。可直接输入两个数也可读入一个文件,获取两个加数,相加结果可保存在文件中,也可不保存,结束后返回菜单2。
菜单3:输入文件名称,查询文件中的数字。文件中可能保存的是两个加数,也可能保存的是某次两个任意长整数相加的结果。
菜单4:退出系统。
3.2详细设计
(1)系统子程序及功能设计
本系统设置16个子程序,各程序的函数名及功能说明如下:
void append(LinList &L,Elemtype d);//以L为头结点,将d加入到链表L void Delete(LinList &L);//删除结点L
void display(LinList L);//按照输出标准,输出任意长整数
void add(LinList &L1,LinList L2);//将L1与L2相加
short StrToPosiNum(char * s);//将s转化为一个小于32767的正整数
void input(LinList &L);//输入一个很长的整数到L
void FREE(LinList &L1);//删除以L1为头结点的整个链表
void save(LinList L1,LinList L2);//把L1,L2写到文件
void load(LinList &L1,LinList &L2);//读文件到L1,L2
void inputdata();//调用input函数,实现两个任意长整数的输入
void welcome();//输出欢迎界面
void fileadd();//读入文件,调用add函数,实现两个任意长整数的相加void directadd();//直接输入数字相加
void calculayteadd();//实现两个任意长整数的相加
int maincourse();//菜单选择
void search();//查询文件中的数字
(2)数据类型定义
typedef struct linlist{
Elemtype data;
linlist * next;
linlist * prior;
} * LinList;
(3)系统主要子程序详细设计
本系统的各个函数之间的关系如下图:
图3
1)菜单1代码
void inputdata(){//调用input函数,实现两个任意长整数的输入system("cls");
LinList L1=NULL,L2=NULL;
printf("\t\t\t ------------------\n\t\t\t\t 输入数据\n\t\t\t ------------------\n");
printf("输入第一个长整数:");
input(L1); //调用input函数
printf("输入第二个长整数:");
input(L2);
printf("\n数据将存放于文件中...");
save(L1,L2); //调用save函数,存储L1L2
FREE(L1);
FREE(L2);//释放L1,L2
printf("写入完成!\n");
system("pause");
}
void input(LinList &L){//输入一个很长的整数到L
char s[1000],s2[5]={'0','0','0','0','\0'};
unsigned i=0,j;
int sign=1,num=0,flag=1;
Elemtype data;
while(flag){
flag=0;
s[0]=getchar();
if(s[0]=='-'){//若为负数
sign=-1;
i=i-1;
}
while(i==-1||s[i]!='\n'){//第一个输入负号或者输入数字
i=i+1;
s[i]=getchar();
if(s[i]==',')
i=i-1;
else if((s[i]>'9'||s[i]<'0')&&s[i]!='\n'){
printf("非法输入,请重新输入!\n");
flag=1;
continue;
}
}
}
s[i]=0;
append(L,(int)(sign*ceil((strlen(s))/4.0)));//第一个结点存放链表长度和数据的正负号
j=strlen(s)%4;
i=0;
if(j!=0){
for(;i