当前位置:文档之家› 大数据结构课程设计——进制转换

大数据结构课程设计——进制转换

数据结构课程设计设计说明书进制转换的实现学生JUGG学号¥#··班级Dota all star——成绩优秀指导教师Puckdota科学与技术天灾元年 3 月 14 日Dota all star课程设计任务书天灾元年—近卫戊年第二学期专业:ganker 学号:sadofaiofo :课程设计名称:数据结构课程设计设计题目:进制转换的实现完成期限:自天灾元年年 3 月 1 日至近卫戊年年 3 月14 日共 2 周设计依据、要求及主要容(可另加附页):进制数制是人们利用符号进行计数的科学方法。

数制有很多种,在计算机中常用的数制有:十进制,二进制、八进制和十六进制。

十六进制数有两个基本特点:它由十六个字符0~9以及A,B,C,D,E,F组成(它们分别表示十进制数0~15),十六进制数运算规律是逢十六进一,例如:十六进制数4AC8可写成(4AC8)16,或写成4AC8H。

要求:(1)输入一个十进制数N,将它转换成R进制数输出,并可以进行逆转换。

(2)输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(2<=R<=16,R<>10)。

(3)为每个测试实例输出转换后的数,每个输出占一行。

如果R大于10,则对应的数字规则参考16进制(比如,10用A表示,等等)。

(4)界面友好。

指导教师(签字):教研室主任(签字):批准日期:年月日摘要由于数制计算和不同数制之间转换的需要,设计了一个10进制转换其它进制(36进制以)及逆转换的软件,该软件具有简单的将10进制数转换成2、8、16进制数以及较复杂的高进制数的转换和逆转功能。

本软件采用C语言编写以VC++作为软件开发环境,采用顺序栈存储方式来存储运算中的数位,借助栈后进先出的特点,易于结果输出。

操作简单,界面清晰,易于为用户所接受。

关键词:进制转换;顺序栈;逆转换目录1 课题描述 (1)2 问题分析和任务定义 (2)4 详细设计 (7)5 程序编码 (8)6 程序调试与测试 (13)7 结果分析 (15)8 总结 (16)参考文献 (17)1 课题描述数制有很多种,在计算机中常用的数制有:十进制,二进制、八进制和十六进制。

十六进制数有两个基本特点:它由十六个字符0~9以及A,B,C,D,E,F组成(它们分别表示十进制数0~15),十六进制数运算规律是逢十六进一,例如:十六进制数4AC8可写成(4AC8)16,或写成4AC8H。

更大一些的数制则扩展十六进制未用的其他大写字母。

顺序栈是顺序存储结构的栈,是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素。

同时附设栈顶指针top和栈基指针base,来方便栈数据元素的存取和栈的扩充。

2 问题分析和任务定义问题分析:编写进制转换及其逆转,其算法过程恰好是结果的逆序,因此建立一个顺序栈将计算过程中得到的数位顺序进栈,则按出栈顺序就会输出对应的转换结果。

逆转程序借助字符数组按顺序将每个数位转换成十进制数后求和,得到逆转结果例如: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{数据对象:D={ai | ai ∈ElemSet,i=1,2,…,n, n≥0 }数据关系:R1={ <ai-1,ai >| ai-1,ai∈D,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(2)主函数流程图如图3.2所示图3.1 创建主函数流程图(3)十进制转换其他进制数流程图如图3.3所示图3.2十进制转换其他进制数算法流程图(4)其他进制数转换十进制数流程图如图3.4所示图3.3倒序输出算法流程图4 详细设计本程序主要有三个算法:一、十进制整数转换其他进制数,其主要思路为:例如:11转换成二进制数11%2=1;11/2=5;5%2=1;5/2=2;2%2=0;2/2=0;被除数不为0;转换结果为110;二、十进制小数转换其他进制数,其主要思路为:例如:0.125转换成二进制小数0.125*2=0.25;取结果的整数为0;0.25*2=0.5;取结果的整数为0;0.5*2=1.0;取结果的整数为1;小数部分不为0;转换结果为0.001;三、其他数制转换十进制数,其主要思路为:例如:二进制数10.1转换成十进制数1*21=2;0*20=1;1*21 =0.5;逆转数字存储在数组中,最后的结束符’\0’,为标志。

转换结果为2+1+0.5=3.5;5 程序编码#include<stdio.h>#include<math.h>#include<stdlib.h>#define STACK_INIT_SIZE 20#define STACKINCREMENT 10typedef int SElemType;typedef struct{SElemType *base,*top;int stacksize;}SqStack;int InitStack(SqStack &S){S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));if(!S.base)exit(0);S.top=S.base;S.stacksize=STACK_INIT_SIZE;return 1;}int Push(SqStack &S,SElemType e){if(S.top-S.base>=S.stacksize){S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));if(!S.base)exit(0);S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;return 1;}int Pop(SqStack &S,SElemType &e){if(S.top==S.base)return 0;e=*--S.top;return 1;}int StackEmty(SqStack S){if(S.top==S.base)return 1;else return 0;}void XSZZ(double n,int T){int i=0;double a;if(n==0.0)printf("00000");while(n!=0.0){a=T*n;n=a-(int)a;if(a>=10){printf("%c",((int)a-10+'A'));i++;}else{printf("%d",((int)a>0?(int)a:0));i++;}if(i==5)break;}}int NZ(){int i=0,j,T,k=0;double sum=0;char a[20],X;getchar();printf("输入转换数");while((a[i]=getchar())!='\n'){if((a[i]<='9'&&a[i]>='0')||(a[i]<='Z'&&a[i]>='A')||a[i]=='.');else {break;}if(a[i]=='.')k=i;i++;}k=k?k:i;if(a[i]!='\n'){while(getchar()!='\n');printf("输入有误");return 0;}a[i]='\0';a[k]='\0';printf("输入转换数的进制");scanf("%d%c",&T,&X);if((!(T>1&&T<36))||X!='\n'){while(getchar()!='\n');printf("输入有误");printf("sdf %c",X);return 0;}for(j=0;j<k;j++){if(((a[j]-'0'>=T)&&(a[j]<='9'))||((a[j]-'A'+10>=T)&&(a[j]>'9'))){printf("输入有误!");return 1;}if(a[j]>='A')sum+=((a[j]-'A'+10)*pow(T,k-j-1));elsesum+=((a[j]-'0')*pow(T,k-j-1));}for(j=k+1;j<i;j++){if(((a[j]-'0'>=T)&&(a[j]<='9'))||((a[j]-'A'+10>=T)&&(a[j]>'9'))){printf("输入有误!");return 1;}if(a[j]>='A')sum+=((a[j]-'A'+10)*pow(T,k-j));elsesum+=((a[j]-'0')*pow(T,k-j));}if(!(((a[j]-'0'>=T)&&(a[j]<='9'))||((a[j]-'A'+10>=T)&&(a[j]>'9'))))printf("结果为%f",sum);return 1;}int ZZ(){int N,T,i=0,a;double Z,M;char X[10];SElemType e;SqStack S;InitStack(S);printf("输入转换数:");scanf("%lf%c",&Z,&X[0]);if(X[0]!='\n'){ while(X[i]!='\n'){i++;printf("输入有误!");return 1;}printf("输入转换进制:");scanf("%d%c",&T,&X[0]);if(T<36&&T>1&&X[0]=='\n'){printf("%c",X[0]);N=(int)Z;M=Z-N;while(N){if(T>10){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);}else{printf("输入有误\n");i=0;while(X[i]!='\n'){i++;scanf("%c",&X[i]);}}}main(){int choice;char X;do{printf("Press1:十进制转换其他进制数\nPress2:其他进制数转换十进制数\n");scanf("%d",&choice);switch(choice){case 1: ZZ();break;case 2:NZ();break;default:printf("输入有误!");}printf("\n continue ? y/n\n");scanf("\t%c",&X);while(X!='n'&&X!='y'){printf("输入有误!\n请重新输入:");scanf("\t%c",&X);}}while(X=='y');return 0;}6 程序调试与测试(1)输入十进制14.25转换成十六进制数为E.4.图6.1十进制转换其他进制数运行图(2)输入二进制1.1转换为十进制1.5图6.2其他进制转换十进制数运行图(3)输入数字字符混合体(非法字符)程序返回错误提示图6.3程序健壮性测试(4)程序调试过程修改:在不同进制数的互转换过程中小数部分尤为不好处理,例如:三进制数2.1整数部分2无需转换,小数0.1转换结果为1/3纯循环小数。

相关主题