《数制转换数据结构.docx》由会员分享,可在线阅读,更多相关《数制转换数据结构.docx(29页珍藏版)》请在三一办公上搜索。
1、西安文理学院软件学院课程设计报告设计名称:数据结构课程设计设计题目:数制转换学生学号:1402120335专业班级:12级3班学生姓名:王康琦学生成绩:指导教师(职称):杨全(讲师)课题工作时间:2014616 至 2014627说明: 1、报告中的任务书、进度表由指导教师在课程设计开始前填写并发给每个学生。2、学生成绩由指导教师根据学生的设计情况给出各项分值及总评成绩。3、所有学生必须参加课程设计的答辩环节,凡不参加答辩者,其成绩一律 按不及格处理。答辩由指导教师实施。4、报告正文字数一般应不少于3000字,也可由指导教师根据本门综合设 计的情况另行规定。5、平时表现成绩低于6分的学生,取消
2、答辩资格,其本项综合设计成绩按 不及格处理。学生姓名王康琦 学号1402120327专业班级12级三班设计题目数制转换问题内容概要:生活中我们经常会接触到各种数制,例如2, 8, 16等非10进制的数制,因此数制转 换问题是我们生活中最常见的问题之一,为此我们将对常用的各种数制进行他们之间的任 意转换。本选题根据此需求,利用数据结构的知识实现了:在2, 8,10,16进制之间, 对输入的任意进制进行灵活的转换。使用C语言编写数制转换的程序,其中包含有三种 方法:栈的结构,递归的结构和数组的结构。在VC+6.0的环境下运行,实现了以下功能: 任意给定一个M进制的数,求出此数的10进制值,实现对X
3、向任意的一个非M进制数 的转换。文献资料:1谭浩强.C语言程序设计教程.北京:清华大学出版社,2008 严蔚敏,吴伟民.数据结构(C语言版)清华大学出版社,20103王晓东.计算机算法设计与分析.电子工业出版社,2007设计要求:任意给定一个M进制的数x,实现功能:1)对输入的任意数制能够求出此数的10进制值,2)实现在2, 8, 10,16进制之间对输入的任意数制x向任意的一个非M进制数的转换。3)至少用两种或两种以上的算法实现上述功能要求。工作期限:设计工作自2014年6月16日至2014年6月27日止。指导教师: 杨全院长:日期:2014年6月16日学生姓名:干.康琦学号:1402120
4、327 专业:软件工程 班级: 12级三班起止日期内 容备注6月16日6月17日下任务书;收集、阅读、整理相关参考文献,并进行 归纳和概括总结,完成项目/任务背景介绍部分文字 内容。6月18日11月20日系统功能设计和模块设计、系统体系结构构建。6月21日6月24日各功能模块编码实现,系统各功能模块调试与维护。6月25日6月26日系统功能集成、系统调试与测试,按照模板要求撰写 课程设计/项目设计报告。6月27日课程设计/项目设计分组答辩,提交课程设计/项目设 计报告以及相关文档,进行成绩评定。指导教师签名:2014年6月16日成绩评定表学生姓名,:王康琦 学号: 1402120327 专业:软
5、件工程班级: 12级三班类别合计 分值各项 分值评分标准实际得分合计得分平时 表现1010按时参加设计指导,无违反纪律情况。完成情况3020按设计任务书的要求完成了全部任务,能完整演示 其设计内容,符合要求。10能对其设计内容进行详细、完整的介绍,并能就指 导教师提出的问题进行正确的回答。报告质量3510报告文字通顺,内容翔实,论述充分、完整,立论 正确,结构严谨合理;报告字数符合相关要求,工 整规范,整齐划一。5课题背景介绍清楚,综述分析充分。5设计方案合理、可行,论证严谨,逻辑性强,具有 说服力。5符号统一;图表完备、符合规范要求。5能对整个设计过程进行全面的总结,得出有价值的 结论或结果
6、。5参考文献数量在2篇以上,格式符合要求,在正文 中正确引用。答辩 情况2510在规定时间内能就所设计的内容进行阐述,言简意 明,重点突出,论点正确,条理清晰。15在规定时间内能准确、完整、流利地回答教师所提 出的问题。总评成绩:分指导教师:(签字)日期:2014年6月_2匕日目录第一章课题背景11.1引言11.1.1课程设计目的1第二章设计简介及设计方案论述22.1选题分析22.1.1数组的结构22.1.2栈的结构22.1.3递归的结构2第三章详细设计33.1算法说明33.1.1数组的算法33.1.2栈的算法43.1.3递归的算法43.2变量设计43.3函数功能设计5第四章设计结果及分析64
7、.1运行与调试说明及分析6总结10参考文献11摘要:在生活中我们经常会遇到各式各样的数制,例如2, 8, 10, 16进制,其实数制 之间的转换问题不仅仅是数学问题,还是我们计算机需要研究的范围之一,其中包括有 数据结构,C语言中的递归算法与数组的存储问题。本设计在2, 8, 10,16进制之间, 能实现对输入的任意数制进行相对应的数制转换。在此程序设计中我采用了 C语言中的数 组与递归的算法,以及数据结构中的栈,实现了如下功能:1.对输入的任意数制能够求出此数 的10进制值2.实现在2, 8,10, 16进制之间对输入的任意数制x向任意的一个非M进制数的 转换。3.至少用两种或两种以上的算法
8、实现上述功能要求。系统开发平台为Windows?,程序 设计设计语言采用C语言,程序运行平台为VC+6.0。关键词:程序设计;数制转换;C;课程设计;数据结构第一章课题背景1.1引言1.1.1课程设计目的在生活中我们经常会遇到各式各样的数制,例如2, 8, 10, 16进制,其实数制之 间的转换问题不仅仅是数学问题,还是我们计算机需要研究的范围之一。高速发展的现 代社会,计算机浩浩荡荡地成为了人们生活中不可缺少的一部分,帮助人们解决通信, 联络,互动等各方面的问题。计算机在处理数字是和人是不同的,计算机使用的是二进 制,人们在日常生活中使用十进制,但是在一些特定场合使用其他进制的表示,所以需
9、要进行不同进制之间的转换其中包括有数据结构,C语言中的递归算法与数组的存储问 题。本设计在2, 8, 10,16进制之间,能实现对输入的任意数制进行相对应的数制转 换。在此程序设计中我采用了 C语言中的数组与递归的算法,以及数据结构中的栈, 实现了如下功能:1.对输入的任意数制能够求出此数的10进制值2.实现在2, 8, 10, 16进制之间对输入的任意数制x向任意的一个非M进制数的转换。3.至少用两种或 两种以上的算法实现上述功能要求。在程序设计中,可以用使用很多种方法解决该问 题。例如:数组、栈、递归。不同的方法实现转换的原理基本相同,只是代码的细节不 同。在我的程序中不同的方法所需的函数
10、在一个单独的头文件里面,便以管理和修改。第二章设计简介及设计方案论述2.1选题分析2.1.1数组的结构为了处理方便,把具有相同类型的若干变量按有序的形式组织起来的一种形式。 这些按序排列的同类数据元素的集合称为数组。由于处理简单的情况,最大的数字将不 大于整形的范围,整形为4个字节,因此开辟的数组为33个元素。2.1.2栈的结构栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按 照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数 据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对 栈的插入与删除操作中,不需要改变栈底指针
11、。在此程序中我首先定义了一个结构体, 结构体中包含栈元素的首地址、栈顶位置、栈顶位置、栈的最大范围。栈元素的存储空 间在程序中再动态开辟。和上面一样,栈的最大为33。2.1.3递归的结构递归做为一种算法在程序设计语言中广泛应用。一个过程或函数在其定义或说明 中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与 原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所 需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定 义对象的无限集合。在这个程序中,递归不需要自己定义存储空间,大量的减少了需要 定义变量所需要的存储空间。第三
12、章详细设计3.1算法说明在此程序的算法设计中,我采用了数组,栈,递归的算法。3.1.1数组的算法M进制转十进制:从该M进制数的最后一位开始算,依次列为第0、1、2.n位并 分别乘以M的0、1、2.n次方,将得到的次方相加便得到对应的十进制数。由于输入 的M进制的数可能出现字符,所以使用了字符数组进行存储。并在输入后将字符全部 转换为数字,并存储到全局变量s数组里面,每个数组元素存储一位。N图3-1 M进制转十进制处理流程图十进制转换为其他进制:首先取x对需要转换的进制n取余,然后再对其取整,将 取到的余数存入数组中,然后重复上面的步骤,将得到的余数依次存入数组中,知道x 变成0。然后将数组反向
13、输出。输出的数可能大于10,所以进行了必要的判断。初始化数组元素位置i=0;N3.1.2栈的算法算法思路和上面基本相同,只是将取到的余数依次入栈,输出时只要依次出栈就行。3.1.3递归的算法递归过程中不需要另外的存储取到的余数,只需要在递归返回时输出相应的结果就 行。3.2变量设计#define MAX 0x7fffffff定义了整形数的最大值,防止数字溢出。int m;用于表示输入的数据是哪个进制的数。char s33;输入时用于存储输入的十进制数x的m进制表示。处理过程中用于存储m进制表示的每一位所代表的的数字。int n;要将输入的m进制数转换成的进制。int len;输入的字符数据有多
14、长。注:其他变量在程序中均有说明。第4页共27页3.3函数功能设计表5-1程序中的函数函数功能int Turn10( int l );将m进制的数转换成十进制数void Turnx( int x );将十进制的数转换成n进制数int CalcRecursion( int k, int c );将m进制转换成10进制void Recursion( int x );将十进制数x转换成n进制数void InitStack( PSTACK s );初始化栈void Push( PSTACK s, int x );将一个元素压入栈中int Pop( PSTACK s );取出栈顶元素void UseSt
15、ack( int x );将十进制数x转换成n进制数void Convert( char *s );将输入的数据转换成数字第四章设计结果及分析4.1运行与调试说明及分析程序开始运行时提示用户按照规定的输入格式输入数据E :C 语言练习 Debdgshuzh i.exe1请输入要转换的数据,格式:原数据进制数据要转换的进制数据的进制不能超过36,因为36后不好表达。 E:K 语言练习、腿请输入要转换的数据,格式:原数据进制数据要转换的进制=36:37 las 16舫麟li飘可以表达的范围数据中也不能出现除a.z,A.Z,0.9之外的字符m进制数中的每一位不可能大于等于m,否则数据应该是错的。当数
16、据输入正确时将给出不同进制之间的转换结果输出完成后,程序将正常结束。总结数据结构是一门纯属于设计的科目,它需用把理论变为上机调试。在学习科目的第 一节课起,老师就为我们阐述了它的重要性。它对我们来说具有一定的难度。它是其它 编程语言的一门基本学科。刚开始学的时候确实有很多地方我很不理解,每次上课时老师都会给我们出不同的 设计题目,对于我们一个初学者来说,无疑是一个具大的挑战,撞了几次壁之后,我决 定静下心来,仔细去写程序。老师会给我们需要编程的内容一些讲解,顺着老师的思路, 来完成自己的设计,我们可以开始运行自己的程序,可是好多处的错误让人看的可怕, 还看不出到底是哪里出现了错误,但是程序还是
17、得继续下去,我多次请教了老师和同学, 逐渐能自己找出错误,并加以改正。VC+6.0里检查错误有时候真是让你难以找到为什 么错。经过了这次课程设计,现在已经可以了解很多错误的原因,这对我来说是一个突 破性的进步,眼看着一个个错误通过自己的努力在我眼前消失,觉得很是开心。在这一 段努力学习的过程中,我的编程设计有了明显的提高。虽然程序中不是很完美,还未能实现对小数之间的数制转换问题,但是对于我来说 已经不错了,今后还需继续努力。参考文献1谭浩强.C语言程序设计教程.北京:清华大学出版社,2008 严蔚敏,吴伟民.数据结构(C语言版)清华大学出版社,20103王晓东.计算机算法设计与分析.电子工业出
18、版社,2007附录1:源程序清单/程序名称:课程设计.c程序功能:分别采用数组、栈、递归实现进制间的转换 程序作者:余岁最后修改日期:2014-6-24#include #include 公用的函数头文件数组实现转换的头文件递归实现转换的头文件堆栈实现转换的头文件#include #include public.h#include array.h#include Recursion.h#include stack.h int main()int x, i;while ( 1 )system( pause);system( cls);提示用户按照正确的格式输入数据要转换的进制printf(请输入
19、要转换的数据,格式:原数据进制数据 (36 II n36 ) printf(输入的进制超出了可以表达的范围!n);else计算数字用m进制表示时的位数len = strlen( s );数据的位数for ( i=0; ilen; +i )if ( si=58 & si=91 & si 122 )break;if ( i != len )printf(输入的数据中出现不符合要求的字符! n);continue;Convert( s );将字符数据转换为数字,并存入数组中for ( i=0; i m )break;if ( i != len )printf(输入的数据有错误! n);continu
20、e;break;计算出x的十进制表示,便以后面的使用x = Turn10( len );输出使用数组计算出的结果printf(用数组算出 x 为:dn, x );输出使用递归计算出的结果printf(用递归算出 x 为:dn”, CalcRecursion( len-1, 1 );转换为其他进制/x的n进制表示,用数组实现printf( %d的d进制表示(数组计算):,x, n );Turnx( x );/x的n进制表示,用递归实现printf( %d的d进制表示(递归计算):,x, n );Recursion( x );/x的n进制表示,用堆栈实现printf( n%d的d进制表示(堆栈计算
21、):,x, n );UseStack( x );return 0;头文件名称:array.h/*功能:将m进制的数转换成十进制数*参数:l: s数组元素的个数 “/*/ int Turn10( int l )int a32=1, i=0, result;数组a存储m的k次幕,result为转换后的十进制数当ai*m不会超出整形范围while ( ai =0; -l, +i )result += sl*ai;return result;/mA(i+1) = mAi * m初始化result当s的下标减少时,a的下标应该增加将得到的次方乘以x中一位相乘后相加返回得到的十进制数/*功能:将十进制的数
22、转换成n进制数*参数:x:十进制数值 “/*/ void Turnx( int x )int i=0, t;char result32;/n进制表示的每一位while ( x )当x不为0时t = x%n;/用t保存x对n的余数,便以下面判断if ( t 9 )resulti+ = t-10+A;大于9的数用字母A.F表示elseresulti+ = t+0;小于9的数用字符0.9表示x /= n;for ( -i; i=0; -i )逆向输出每一位printf( %c, resulti);printf( n);头文件名称:public.h#define MAX 0x7fffffffintm;
23、输入的数据为哪个进制intn;要转换成哪个进制int len;输入的字符串的长度chars33; /m 进制数/*功能:将输入的数据转换成数字*参数:s:输入的乂的m进制的字符串指针 “ /*/ void Convert( char *s )int i = 0;从字符串的0地址开始while ( si)当 si ! =0 的字符转换成对应的数字if ( si=a & si=A & si= 0 )返回k对应的元素乘以对应的次方return sk*c + CalcRecursion( k-1, c*m );elsereturn 0;/*功能:将十进制数x转换成n进制数*参数:x:十进制数x “ /
24、*/ void Recursion( int x )int t;if ( x 0 )Recursion( x/n );t = x%n;if ( t 10 )printf( %c, t-10+A);elseprintf( %d, t );头文件名称:stack.h#include 堆栈的最大位置#define MAXSTACK 33定义栈数据结构typedef struct _stackint *addr;int length;int top;int bottom;STACK, *PSTACK;栈的存储地址栈的最大长度/栈顶栈底/*功能:初始化栈*参数:s:栈的地址 “ /*/ void Ini
25、tStack( PSTACK s )s-addr = malloc( MAXSTACK*sizeof( int ) ); / 申请空间s-length = MAXSTACK;设定栈的最大长度s-top = -1; s-bottom = 0;初始化栈指针/*功能:将一个元素压入栈中*参数:s:栈的地址X:要压入的元素 “ /*/void Push( PSTACK s, int x )压入栈+s-top;栈顶上移s-addrs-top = x;数据进栈/*功能:取出栈顶元素*参数:s:栈的地址 “/*/int Pop( PSTACK s )int t;t = s-addrs-top;-(s-top
26、 );return t;弹出数据取出栈顶元素栈顶下移返回栈顶元素/*功能:将十进制数X转换成n进制数*参数:X:要转换的十进制数 “ /*/定义栈变量void UseStack( int x ) STACK s;int t;InitStack( &s );初始化堆栈当x不为0,将x除n的余数进栈while ( x )Push( &s, x%n );未到栈底取出栈顶元素x /= n;while ( s.top = s.bottom )t = Pop( &s );if ( t 10 )判断元素是否大于10printf( %c, t-10+A);输出字符elseprintf( %d, t );输出数字printf( n);