数据结构-任意长整数加法

《数据结构与算法》

课程设计报告

题目: 任意长整数加法 学期: 2017春 班号: 学号:姓名: 代号

成绩:

哈尔滨华德学院电子与信息工程学院

年 月 日

一、 课程设计的目的与要求 (一) 课程设计目的

1.通过课程设计,加深对《数据结构》课程所学知识的理解,熟练掌握和固数据结构的基本知识和语法规范。通过课程设计,巩固和加深对线性表、栈、队列、字符串、查找、排序等理论知识的理解;提高利用计算机分析解决综合性实际问题的基本能力。包括:数据类型(整形、实型、字符型、指针、数组、结构等);运算类型(算术运算、逻辑运算、自增自减运算、赋值运算等) ;程序结构(顺序结构、判断选择结构、循环结构)。 2.库函数应用数据结构与算法课程设计是综合运用课程中学到的几种典型数据结构、常用算法以及程序设计语言,自行实现一个较为完整的应用系统。

3.学会将理论知识应用于实践的方法,提高分析和解决问题的能力,提高综合能力。

(二)题目与要求 题目:任意长整数加法 要求:

1.Windows DOS 窗口提示用户输入两个为无限长的整数,当用户有非法输入符时给出用户提示并重新输入整数,然后输出两个整数的和,输出形式按照中国人的习惯,每四位一组,组间用逗号隔开。 2.整形变量范围是-(215-1)~(215-1),读取数据后利用ASCII 码的方式转换数据,采用单链表结构方式实现长整数的存储。 3. 基于Code Blocks软件建立工程并用C++语言编译 。 4:测试数据为: (1) 输入:“0”;“0” 应输出:“ 0”。 (2) 输入:“234”;“123” 应输出:“ 357”。 (3) 输入:“345”;“345” 应输出:“ 690”。 (4) 输入:“19”;“25” 应输出:“ 44”。 (5) 输入:“123456789”;“123456789” 应输出:“2,4691.3578。 (6) 输入:“[**************]8”;“[**************]” 应输出:“ 8777,7788,8888,8887”。 (7) 输入:“[**************]5”;“[***********]78” 应输出:“ 7879,2424,2424,2424,2423”。

二、实践环境配置 1. 硬件配置

处理器: Intel Core i5 CPU @ 2.10GHz 内存: 8G SSD :120G 硬盘:1T 2. 软件配置

Windows 10 专业版 Code Blocks 16

三、设计正文

1. 需求分析 在加法运算中, C ++语言所能定义的整形变量是有一定长度限制的。例如 int 型变量所能储存值的值域为 -32768~32767,最长的整型 long int 值域为 -2147483648~2157483646。当在需要位数更长的整数加法时计算器设计运用简单的加法运算符难以达到要求, 或是在两个较大整数相加的值超过了整型变量所能储存的数值是程序会发生溢出。 需要一种新的加法模式来解决上述问题,来实现任意长的整数进行加法,得到想要的结果。本程序目的就是完成对任意长的整数进行加法运算:

1. 系统分析 本程序实现计算任意长的整数的加法运算。以用户和计算机对话的方式,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令,然后程序就计算并显示出这两个数的运算。功能框图如下3-1所示

图3-2 功能框图

2. 系统设计 本程序中,集合的元素限定为数字字符[‘0’~’9’]和字符‘,’与‘:’,输入字符可以任意长,输入形式以“回车符”为结束标志,串中字

符顺序不限,且允许出现重复字符。利用单链表现实长整数的存储,每个结点含一个整形变量。输入的形式以回车结束,可以直接输入正数或负数。按中国对于长整数的表示习惯,显示数以每四位一组,字符‘,’为分隔符。 算法流程如下图3-1所示:

3. 程序系统实现

本程序包含三个模块:1)

主程序模块: void main(){ 初始化;

图3-2 算法流程图

while(1){

链表创建; 用户输入数字; 数据存储; 数据处理; 输出结果; } }

2)集合单元模块——实现集合的抽象数据类型。 3)结点结构单元模块——定义集合的结点结构。

函数主要功能的代码如下: 函数:Node *creat(Node *head) 功能:创建单链表。 函数: Node *insert(Node *head) 功能:试读取数据,采用头插法和ASCII 码技术。将字符转换为与字 符相同的数字。 函数:void Add(Node *headone,Node *headtwo,Node *headthree) 功能:释放内存空间。 函数:void destroy(Node *head) 功能:求出两个无限长整数的求和。

主函数深度解析: /*主函数*/ void main() { Node *creat(Node *head); /*声明创建单链表的函数*/ Node *insert(Node *head); /*声明读取数据函数*/ void Add(Node *headone,Node *headtwo,Node *headthree); /*声明相加函数*/ void print(Node *head); /*声明输出函数*/ void destroy(Node *head); /*声明释放内存空间函数*/ Node *headone; /*被加数的头结点*/ Node *headtwo; /*加数的头结点*/ Node *headthree; /*和的头结点*/ while(1)

{ headone=creat(headone); /*创建单链表,用于储存被加数*/ headtwo=creat(headtwo); /*创建单链表,用于储存加数*/ headthree=creat(headthree); /*创建单链表,用于储存和*/ printf("输入被加数A:"); headone=insert(headone); /*读被加数*/ if(headone !=NULL) { printf("输入被数B:"); headtwo=insert(headtwo); /*读取加数*/ } if(headone !=NULL && headtwo !=NULL) { Add(headone,headtwo,headthree); /*求和*/ print(headthree); /*输出和*/ destroy(headthree); /*释放内存空间*/ } printf("\n\n\n"); } }

4.系统测试 由Code Block编写datalist.cpp 文件,用编译器编译出datalist.o 文件,最后连接成可执行文件datalist.exe ,如图4-1所示。运行可执行文件datalist.exe 出现DOS 界面,根据上文预定测试数据进行测试,查看结果的正确性,效果如图4-2所示。

图4-1 编译文件

图4-2 测试程序

四、小组成员分工说明

独立完成。 五、总结

1.算法改进设想:

(1)在算法效率上,将单链表该为双向循环列表,

(2)在功能设置上,编写出简易GUI ,在界面中设置相关操作选项。 2.课程设计期间的主要收获:

理论转化到实际应用,看似简单,实际操作却有各种难点。唯独静下心来,查找相关资料文献,代码一个一个敲进去,运行测试看结果,再修改,再测试,已经不知道重复多少次才有了现在的满意结果,深知其中还有很多处有待改善之处。希望以后能熟练掌握大学里的每个知识和技能,灵活运用于实际生活中。在此感谢老师的悉心指导和同学的帮助,才有现在完善的结果。

《数据结构与算法》

课程设计报告

题目: 任意长整数加法 学期: 2017春 班号: 学号:姓名: 代号

成绩:

哈尔滨华德学院电子与信息工程学院

年 月 日

一、 课程设计的目的与要求 (一) 课程设计目的

1.通过课程设计,加深对《数据结构》课程所学知识的理解,熟练掌握和固数据结构的基本知识和语法规范。通过课程设计,巩固和加深对线性表、栈、队列、字符串、查找、排序等理论知识的理解;提高利用计算机分析解决综合性实际问题的基本能力。包括:数据类型(整形、实型、字符型、指针、数组、结构等);运算类型(算术运算、逻辑运算、自增自减运算、赋值运算等) ;程序结构(顺序结构、判断选择结构、循环结构)。 2.库函数应用数据结构与算法课程设计是综合运用课程中学到的几种典型数据结构、常用算法以及程序设计语言,自行实现一个较为完整的应用系统。

3.学会将理论知识应用于实践的方法,提高分析和解决问题的能力,提高综合能力。

(二)题目与要求 题目:任意长整数加法 要求:

1.Windows DOS 窗口提示用户输入两个为无限长的整数,当用户有非法输入符时给出用户提示并重新输入整数,然后输出两个整数的和,输出形式按照中国人的习惯,每四位一组,组间用逗号隔开。 2.整形变量范围是-(215-1)~(215-1),读取数据后利用ASCII 码的方式转换数据,采用单链表结构方式实现长整数的存储。 3. 基于Code Blocks软件建立工程并用C++语言编译 。 4:测试数据为: (1) 输入:“0”;“0” 应输出:“ 0”。 (2) 输入:“234”;“123” 应输出:“ 357”。 (3) 输入:“345”;“345” 应输出:“ 690”。 (4) 输入:“19”;“25” 应输出:“ 44”。 (5) 输入:“123456789”;“123456789” 应输出:“2,4691.3578。 (6) 输入:“[**************]8”;“[**************]” 应输出:“ 8777,7788,8888,8887”。 (7) 输入:“[**************]5”;“[***********]78” 应输出:“ 7879,2424,2424,2424,2423”。

二、实践环境配置 1. 硬件配置

处理器: Intel Core i5 CPU @ 2.10GHz 内存: 8G SSD :120G 硬盘:1T 2. 软件配置

Windows 10 专业版 Code Blocks 16

三、设计正文

1. 需求分析 在加法运算中, C ++语言所能定义的整形变量是有一定长度限制的。例如 int 型变量所能储存值的值域为 -32768~32767,最长的整型 long int 值域为 -2147483648~2157483646。当在需要位数更长的整数加法时计算器设计运用简单的加法运算符难以达到要求, 或是在两个较大整数相加的值超过了整型变量所能储存的数值是程序会发生溢出。 需要一种新的加法模式来解决上述问题,来实现任意长的整数进行加法,得到想要的结果。本程序目的就是完成对任意长的整数进行加法运算:

1. 系统分析 本程序实现计算任意长的整数的加法运算。以用户和计算机对话的方式,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令,然后程序就计算并显示出这两个数的运算。功能框图如下3-1所示

图3-2 功能框图

2. 系统设计 本程序中,集合的元素限定为数字字符[‘0’~’9’]和字符‘,’与‘:’,输入字符可以任意长,输入形式以“回车符”为结束标志,串中字

符顺序不限,且允许出现重复字符。利用单链表现实长整数的存储,每个结点含一个整形变量。输入的形式以回车结束,可以直接输入正数或负数。按中国对于长整数的表示习惯,显示数以每四位一组,字符‘,’为分隔符。 算法流程如下图3-1所示:

3. 程序系统实现

本程序包含三个模块:1)

主程序模块: void main(){ 初始化;

图3-2 算法流程图

while(1){

链表创建; 用户输入数字; 数据存储; 数据处理; 输出结果; } }

2)集合单元模块——实现集合的抽象数据类型。 3)结点结构单元模块——定义集合的结点结构。

函数主要功能的代码如下: 函数:Node *creat(Node *head) 功能:创建单链表。 函数: Node *insert(Node *head) 功能:试读取数据,采用头插法和ASCII 码技术。将字符转换为与字 符相同的数字。 函数:void Add(Node *headone,Node *headtwo,Node *headthree) 功能:释放内存空间。 函数:void destroy(Node *head) 功能:求出两个无限长整数的求和。

主函数深度解析: /*主函数*/ void main() { Node *creat(Node *head); /*声明创建单链表的函数*/ Node *insert(Node *head); /*声明读取数据函数*/ void Add(Node *headone,Node *headtwo,Node *headthree); /*声明相加函数*/ void print(Node *head); /*声明输出函数*/ void destroy(Node *head); /*声明释放内存空间函数*/ Node *headone; /*被加数的头结点*/ Node *headtwo; /*加数的头结点*/ Node *headthree; /*和的头结点*/ while(1)

{ headone=creat(headone); /*创建单链表,用于储存被加数*/ headtwo=creat(headtwo); /*创建单链表,用于储存加数*/ headthree=creat(headthree); /*创建单链表,用于储存和*/ printf("输入被加数A:"); headone=insert(headone); /*读被加数*/ if(headone !=NULL) { printf("输入被数B:"); headtwo=insert(headtwo); /*读取加数*/ } if(headone !=NULL && headtwo !=NULL) { Add(headone,headtwo,headthree); /*求和*/ print(headthree); /*输出和*/ destroy(headthree); /*释放内存空间*/ } printf("\n\n\n"); } }

4.系统测试 由Code Block编写datalist.cpp 文件,用编译器编译出datalist.o 文件,最后连接成可执行文件datalist.exe ,如图4-1所示。运行可执行文件datalist.exe 出现DOS 界面,根据上文预定测试数据进行测试,查看结果的正确性,效果如图4-2所示。

图4-1 编译文件

图4-2 测试程序

四、小组成员分工说明

独立完成。 五、总结

1.算法改进设想:

(1)在算法效率上,将单链表该为双向循环列表,

(2)在功能设置上,编写出简易GUI ,在界面中设置相关操作选项。 2.课程设计期间的主要收获:

理论转化到实际应用,看似简单,实际操作却有各种难点。唯独静下心来,查找相关资料文献,代码一个一个敲进去,运行测试看结果,再修改,再测试,已经不知道重复多少次才有了现在的满意结果,深知其中还有很多处有待改善之处。希望以后能熟练掌握大学里的每个知识和技能,灵活运用于实际生活中。在此感谢老师的悉心指导和同学的帮助,才有现在完善的结果。


相关内容

  • 循环群中剩余类加群的讨论
  • 第21卷 第3期 2003年7月 沈阳师范大学学报(自然科学版) Jour nal of S heny ang N or mal Univer sity (N atur al Science) Vol 21, No 3Jul. 2003 文章编号:1008-374X(2003) 03-0169-03 ...

  • 2016"数学的思维方式与创新"考试满分答案
  • 一.单选题 1整除关系不会随着什么的变化而改变? A.函数次数变大 B.域的扩大 C.函数次数降低 D.函数结构改变 我的答案:B 2设R是一个环,a∈R,则0·a= A.1.0 B.a C.1.0 D.2.0 我的答案:A 3罗巴切夫斯基认为过直线外一点有几条直线与已知直线平行? A.有且只有1条 ...

  • 小学数学四年级下册知识点汇总(详细)
  • [人教版]小学数学四年级下册知识点总结 1.整数加法 (1)把两个数合并成一个数的运算叫做加法. (2)在加法里,相加的数叫做加数,加得的数叫做和.加数是部分数,和是总数. (3)加数+加数=和,一个加数=和-另一个加数 (学会变形) 2.整数减法 (1)已知两个加数的和与其中的一个加数,求另一个加 ...

  • 总结知识点
  • 一:有理数 知识网络: 正整数 负整数正分数 负分数 概念.定义: 大于0的数叫做正数(positive number). 在正数前面加上负号"-"的数叫做负数(negative number). 整数和分数统称为有理数(rational number). 人们通常用一条直线上的 ...

  • 抽象代数期末考试试卷及答案
  • 抽象代数试题 一.单项选择题(本大题共5小题,每小题3分,共15分) 在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的括号内.错选.多选或未选均无分. 1.6阶有限群的任何子群一定不是( ). A .2阶 B .3 阶 C.4 阶 D . 6 阶 2.设G 是群,G 有( ...

  • 小学数学法则知识归1
  • 小学数学法则知识归类 (一)笔算两位数加法,要记三条 1.相同数位对齐: 2.从个位加起: 3.个位满10向十位进1. (二)笔算两位数减法,要记三条 1.相同数位对齐: 2.从个位减起: 3.个位不够减从十位退1,在个位加10再减. (三)混合运算计算法则 1.在没有括号的算式里,只有加减法或只有 ...

  • 程序员应该了解的计算机知识(二)--数制系统
  • 引言 众所周知,计算机系统使用的是二进制数制系统,其所能识别的机器码和指令代码都是用的是由0和1组成的序列.而日常生活中我们使用的都是十进制数制系统,计算机为什么只能使用二进制系统,这与其组成结构有关,我们知道计算机内部都是电子元件组成,而电子元件的状态(例如:通电和断电等)往往有相对的两面性,使用 ...

  • 浅谈抽象代数的应
  • 浅谈抽象代数的应用 1 引言 代数学作为数学的一个重要分支,有着悠久的历史.早期代数学的研究对象是具体的, 以方程根的计算为研究中心.那时人们已经能够用根式来求解四次以下的方程的根.此后几乎经历了三百年的时间,数学家们企图用用根式解一般的五次方程而没有成功.阿贝尔(N.H.Abel)在1824 年证 ...

  • 小学四年级数学知识点归纳
  • 小学四年级数学上册知识点归纳 班级_______ 姓名__________ 知识点概括总结 1. 大数的认识: (1)亿以内的数的认识: 十万:10个一万: 一百万:10个十万: 一千万:10个一百万: 一亿:10个一千万: 2. 数级:数级是为便于人们记读阿拉伯数的一种识读方法,在位值制(数位顺序 ...