《数据结构与算法》
课程设计报告
题目: 任意长整数加法 学期: 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.课程设计期间的主要收获:
理论转化到实际应用,看似简单,实际操作却有各种难点。唯独静下心来,查找相关资料文献,代码一个一个敲进去,运行测试看结果,再修改,再测试,已经不知道重复多少次才有了现在的满意结果,深知其中还有很多处有待改善之处。希望以后能熟练掌握大学里的每个知识和技能,灵活运用于实际生活中。在此感谢老师的悉心指导和同学的帮助,才有现在完善的结果。