《数据结构课程设计——进制转换.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计——进制转换.docx(28页珍藏版)》请在三一办公上搜索。
1、进制转换的实现学生姓名JUGG学号#Dota all star班 级成绩优秀指导教师Puckdota科学与技术天灾元年3月14日数据结构课程设计评阅书总成绩: 室主任签名:年 月 日Dota all star课程设计任务书天灾元年一近卫戊年第二学期专业: ganker 学号: sadofaiofo 姓名: 课程设计名称:数据结构课程设计设计题目:讲制转换的实现完成期限:自 天灾兀年年 3 月 日至_近卫戊年_年 月14日共 2 周设计依据、要求及主要内容(可另加附页):进制数制是人们利用符号进行计数的科学方法。数制有很多种,在计算机中常用的数制有:十进制, 二进制、八进制和十六进制。十六进制数
2、有两个基本特点:它由十六个字符。9以及A, B, C, D, E, F组成(它们分别表示十进制数015),十六进制数运算规律是逢十六进一,例如:十六进制数4AC8 可写成(4AC8) 16,或写成4AC8H。要求:(1) 输入一个十进制数N,将它转换成R进制数输出,并可以进行逆转换。(2) 输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R (2=R=16, R10)。(3) 为每个测试实例输出转换后的数,每个输出占一行。如果R大于10,则对应的数字规则 参考16进制(比如,10用A表示,等等)。(4) 界面友好。指导教师(签字):教研室主任(签字):批准日期: 年 月 日
3、摘要由于数制计算和不同数制之间转换的需要,设计了一个10进制转换其它进制(36进制 以内)及逆转换的软件,该软件具有简单的将10进制数转换成2、8、16进制数以及较复 杂的高进制数的转换和逆转功能。本软件采用C语言编写以VC+作为软件开发环境,采用 顺序栈存储方式来存储运算中的数位,借助栈后进先出的特点,易于结果输出。操作简单, 界面清晰,易于为用户所接受。关键词:进制转换;顺序栈;逆转换错误!未定义书签。 错误!未定义书签。 错误!未定义书签。 错误!未定义书签。 错误!未定义书签。 错误!未定义书签。错误!未定义书签。 错误!未定义书签。1课题描述2问题分析和任务定义4详细设计5程序编码6
4、程序调试与测试7结果分析8总结参考文献1课题描述数制有很多种,在计算机中常用的数制有:十进制,二进制、八进制和十六 进制。十六进制数有两个基本特点:它由十六个字符09以及A, B,C,D,E, F组成(它们分别表示十进制数015),十六进制数运算规律是逢十六进一,例 如:十六进制数4AC8可写成(4AC8) 16,或写成4AC8H。更大一些的数制则扩 展十六进制未用的其他大写字母。顺序栈是顺序存储结构的栈,是利用一组地址连续的存储单元依次存放自栈 底到栈顶的数据元素。同时附设栈顶指针top和栈基指针base,来方便栈内数 据元素的存取和栈的扩充。2问题分析和任务定义问题分析:编写进制转换及其逆
5、转,其算法过程恰好是结果的逆序,因此建立一个顺序 栈将计算过程中得到的数位顺序进栈,则按出栈顺序就会输出对应的转换结果。 逆转程序借助字符数组按顺序将每个数位转换成十进制数后求和,得到逆转结果例如:11转换成二进制数11%2=1;11/2=5; 1 入栈;5%2=1;5/2=2 ; 1 入栈;2%2=0 ;2/2=0 ; 0 入栈;被除数不为0;按顺序出栈,得到结果为110;任务定义:1)画出流程图;2)任意建立一个容量为20个栈元素的空栈;3)将十进制数与要转进制先求余,将余数顺序入栈;4)阐明测试方法,写出完整的运行结果;5)撰写课程设计说明书。3逻辑设计(1)ADT Stack数据对象:
6、D=ai | ai EElemSet,i=1, 2,,n, nN0 数据关系:R1 = | ai -1, aiED,i=2,,n 基本操作:Inistack(&S)操作结果:构造一个空栈S。stackEmpty(&S)初始条件:栈S已存在。操作结果:判断栈S是否为空,若为空,则返回1;否则返回0. push(&S,x)初始条件:栈S已存在。操作结果:插入元素x为新的栈顶元素。Pop(&S。&e)初始条件:栈S已存在且非空。操作结果:删除S的栈顶元素,并用y返回其值。ADT Stack图创建主函数流程图(3)十进制转换其他进制数流程图如图所示图十进制转换其他进制数算法流程图(4)其他进制数转换十
7、进制数流程图如图所示4详细设计本程序主要有三个算法:一、十进制整数转换其他进制数,其主要思路为:例如:11转换成二进制数11%2=1;11/2=5;5%2=1;5/2=2;2%2=0;2/2=0;被除数不为0;转换结果为110;二、十进制小数转换其他进制数,其主要思路为:例如:转换成二进制小数*2二;取结果的整数为0;*2二;取结果的整数为0;*2=;取结果的整数为1;小数部分不为0;转换结果为;三、其他数制转换十进制数,其主要思路为:例如:二进制数转换成十进制数1* 21 =2;0* 20=1;1* 21=;逆转数字存储在数组中,最后的结束符 0,为标志。转换结果为2+1+二;5程序编码#i
8、nclude#include#include#define STACK_INIT_SIZE 20#define STACKINCREMENT 10typedef int SElemType;typedef structSElemType *base,*top; int stacksize;SqStack;int InitStack(SqStack &S)=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType); if(!exit(0);- =STACK_INIT_SIZE;return 1;int Push(SqStack &S,SElemT
9、ype e) if =(SElemType*)realloc,+STACKINCREMENT)*sizeof(SElemType);if(!exit(0);=+;+=STACKINCREMENT;*+=e;return 1;int Pop(SqStack &S,SElemType &e) if=return 0;e=*;return 1;int StackEmty(SqStack S) if=return 1; else return 0;void XSZZ(double n,int T) int i=0; double a;if(n=printf(00000);while(n! =a二T*n
10、;n=a-(int)a;if(a=10)printf(%c,(int)a-10+A);i+;elseprintf(%d,(int)a0(int)a:0);i+;if(i=5)break;int NZ()int i=0,j,T,k=0;double sum=0;char a20,X;getchar();printf(输入转换数);while(ai=getchar()! = n)if(ai=0)|(ai=A)|ai = .); else break; if(ai = .)k=i;i+;k=kk:i;if(ai! = n)while(getchar()! = n);printf(输入有误);retu
11、rn 0;ai = 0;ak = 0;printf(输入转换数的进制);scanf(%d%c,&T,&X);if(!(T1&T36)|X! = n)(while(getchar()! = n);printf(输入有误);printf(sdf %c,X);return 0;for(j=0;j=T)&(aj=T)&(aj9)printf(输入有误!);return 1;if(aj=A)sum+=(aj-A+10)*pow(T,k-j-1);elsesum+=(aj-0)*pow(T,k-j-1);for(j=k+1;j=T)&(aj=T)&(aj9)printf(输入有误!);return 1;i
12、f(aj=A)sum+=(aj-A+10)*pow(T,k-j);elsesum+=(aj-0)*pow(T,k-j);if(!(aj-0=T)&(aj=T)&(aj9 )printf(结果为 %f,sum);return 1;int ZZ()int N,T,i=0,a;double Z,M;char X10;SElemType e;SqStack S;InitStack(S);printf(输入转换数:);scanf(%lf%c”,&Z,&X0);if(X0! = n)( while(Xi! = n)( i+;printf(输入有误!);return 1;printf(输入转换进制:); s
13、canf(%d%c,&T,&X0);if(T1&X0 = n) printf(%c,X0); N=(int)Z;M=Z-N;while(N)if(T10)a二N%T;if(a=10)a=a-10+A;Push(S,a); else Push(S,N%T);else Push(S,N%T);N=N/T;printf(结果为:);if(StackEmty(S)printf(0);while(!StackEmty(S)Pop(S,e);if(e=10) printf(%c,e);else printf(%d,e);printf(.);XSZZ(M,T);elseprintf(输入有误n);i=0;w
14、hile(Xi! = n)i+;scanf(%c,&Xi);main()int choice;char X;doprintf(Press1:十进制转换其他进制数nPress2:其他进制数转换 十进制数n);scanf(%d,&choice);switch(choice)case 1: ZZ();break;case 2:NZ();break;default:printf(输入有误!);printf(n continue y/nn);scanf(t%c,&X);while(X! = n&X! = y)printf(输入有误!n请重新输入:);scanf(t%c,&X);while(X=y);re
15、turn 0;6程序调试与测试(1)输入十进制转换成十六进制数为.图十进制转换其他进制数运行图 (2)输入二进制转换为十进制m P八我的文档X桌面DebueCppl.eKe*鬲入胡涣数的进制2F吉果为1.500000continue ? y/nesl:十进刺妆凑葺池进辙豪 g异他弛葡薮转换十进制数 海蠡羸只 绡果为10.081623d on t ir ue ? y/n十进制特魂丹他丑制.熟 村2:其他岛数殳换I进制数 备入传戾规上跖 前入样鬟数的进制812.791016cont inue ? y/nnPress any key to continue图其他进制转换十进制数运行图(3)输入数字字
16、符混合体(非法字符)程序返回错误提示图程序健壮性测试(4)程序调试过程修改:在不同进制数的互转换过程中小数部分尤为不好 处理,例如:三进制数整数部分2无需转换,小数转换结果为1/3纯循环小数。七进制数、,这些小数部分根本无法转换成十进制整数,这里不一一赘述, 故设定转换结果保留五位小数。7结果分析在设计的过程中遇到了许多问题,并最终得到解决,其分析过程如下:(1)考虑到本程序转换的数字对象并不是天文数字,栈操作定义中,初始 化栈空间为20 (存储20位数字),但也可能出现空间不足。解决的办法是当空 间不足时自动进行扩充。(2)程序的健壮性问题。数据通过一定的形式读入地。当输入格式有误时 就程序
17、无法计算时,返回输入错误重新输入。(3)程序的循环操作问题。当输入有误时必须把输入的错误字符读入,再 进行下次操作。时间复杂度T(n)=O(n);空间复杂度S(n)=O(n);8总结本程序实现了数制转换及其逆转换功能,具有强大的健壮性和容错能力。顺 序栈只参与其中的十进制整数转换部分,小数转换部分的算法与整数部分不同所 以另成函数体。逆转换借助数组读入数位进行转换,其整数和小数部分算法相同 故属一个函数。程序改进最多的要属健壮性部分,为此加入了好多读取非法输入 部分。在整整两个星期的日子里,可以学到很多很多的的东西,尤其是漫长的改 错部分!不仅可以巩固了以前所学过的知识,而且学到了很多在书本上
18、所没有学 到过的知识。参考文献1 严蔚敏,吴伟民.数据结构(C语言版)M.北京:清华大学出版社,20022 谭浩强.C程序设计M.北京:清华大学出版社,20053 李建忠.大学计算机基础M.西安:西北大学出版社,20054 何钦铭,颜晖.C语言程序设计M.北京:高等教育出版社,20085 谢俊屏.大学计算机基础实验教程M.西安:西北大学出版社,2005附代码:#include#include#include#define STACK_INIT_SIZE 100#define STACKINCREMENT 10typedef int SElemType;typedef structSElemTy
19、pe *base,*top; int stacksize;SqStack;int InitStack(SqStack &S)=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType); if(!exit(0); =;=STACK_INIT_SIZE;return 1;int Push(SqStack &S,SElemType e)if =(SElemType *)realloc,+STACKINCREMENT)*sizeof(SElemType); if(!exit(0); =+;+=STACKINCREMENT;*+=e;return 1;i
20、nt Pop(SqStack &S,SElemType &e) if=return 0;e=*;return 1;int StackEmty(SqStack S) if=return 1; else return 0;void XSZZ(double n,int T)int i=0;double a;if(n=printf(00000);while(n!=(a=T*n;n=a-(int)a;if(a=10)(printf(%c,(int)a-10+A);i+;elseprintf(%d,(int)a0(int)a:0);i+;if(i=5)break;int NZ()int i=0,j,T,k
21、=0;double sum=0;char a20,X;getchar();printf(输入转换数);while(ai=getchar()! = n)if(ai=0)|(ai=A)|ai二二.); else break;if(ai二二.)k=i;i+;k=kk:i;if(ai! = n)while(getchar()! = n);printf(输入有误);return 0;ai = 0;ak = 0;printf(输入转换数的进制);scanf(%d%c,&T,&X);if(!(T1&T36)|X! = n)while(getchar()! = n);printf(输入有误);printf(s
22、df %c,X);return 0;for(j=0;j=T)&(aj=T)&(aj9)printf(输入有误!);return 1;if(aj=A)sum+=(aj-A+10)*pow(T,k-j-1);elsesum+=(aj-0)*pow(T,k-j-1);for(j=k+1;j=T)&(aj=T)&(aj9)printf(输入有误!);return 1;if(aj=A)sum+=(aj-A+10)*pow(T,k-j);elsesum+=(aj-0)*pow(T,k-j);if(!(aj-0=T)&(aj=T)&(aj9)prin tf(结果为 %f,sum);return 1;int
23、ZZ()int N,T,i=0,a;double Z,M;char X10;SElemType e;SqStack S;InitStack(S);printf(输入转换数:);scanf(%lf%c,&Z, &X0);if(X0! = n)printf(输入有误!);while(Xi!=n)|+;scanf(%c,&Xi);return 1;printf(输入转换进制:); scanf(%d%c,&T,&X0);if(T1&X0=n)printf(%c,X0);N=(int)Z;M=Z-N;while(N)if(T10)a=N%T;if(a=10)a=a-10+A;Push(S,a);else
24、 Push(S,N%T);else Push(S,N%T);N=N/T;printf(结果为:);if(StackEmty(S)printf(0);while(!StackEmty(S)Pop(S,e);if(e=10) printf(%c,e);else printf(%d,e);printf(.);XSZZ(M,T);elseprintf(输入有误n);i=0;while(Xi! = n)i+;main()(int choice;char X;doprintf(Press1:十进制转换其他进制数nPress2:其他进制数转换十进制数 n);scanf(%d,&choice);switch(choice)case 1: ZZ();break;case 2:NZ();break;default:printf(输入有误!);printf(n continue y/nn);scanf(t%c,&X);while(X!=n&X!=y)printf(输入有误!n请重新输入:);scanf(t%c,&X);while(X=y);return 0;