数据结构课程设计之任意进制转换.docx
- 文档编号:4780652
- 上传时间:2022-12-08
- 格式:DOCX
- 页数:24
- 大小:22.95KB
数据结构课程设计之任意进制转换.docx
《数据结构课程设计之任意进制转换.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计之任意进制转换.docx(24页珍藏版)》请在冰豆网上搜索。
数据结构课程设计之任意进制转换
##大学
数据结构课程设计报告
题目:
数值转换
院(系):
学生姓名:
班级:
起迄日期:
指导教师:
计算机工程学院
学号:
6月16号到6月30号
20XX—20XX年度第2学期
一、需求分析
1.问题描述:
任意给定一个M进制的数x,请实现如下要求
1)求出此数x的10进制值(用MD表示)
2)实现对x向任意的一个非M进制的数的转换。
3)至少用两种或两种以上的方法实现上述要求(用栈解决,用数组解决,其它方法解
决)。
2.基本功能
本程序用三种方法,实现把一个M进制数x转换成其他进制数,分别是数组,递归,
栈。
1.把其他进制数转换成十进制包含在一个函数中:
2.把十进制转换成其他进制数用了三种方法(
N)。
递归:
voidprind_d(intn,intc)。
intgetdex();
数组,递归,栈),数组:
voidarray(int
栈:
voidinitstack(stack&s)
,voidpush(stack&s,chare)
,voidpop(stacks)
。
3.实现把一个
M进制数
x转换成其他进制数:
先把
M进制数转换成十进制数,再把十进制
数转换成其他进制数。
封装在三个函数中:
voidArray(),voidStack(),voidPrind()。
3.输入输出
输入要求其他进制数为字符型数据包括在1到9,和A到F这些字符中,输出也是包含在这些字符中。
如果输入超过这些范围进行容错处理。
二、概要设计
1.设计思路:
把M进制数转换成其他进制数,可以先把M进制数转换成十进制数,调用intgetdex();
再把十进制数转换成其他进制数(三种方法:
数组,递归,栈);最后把这两个步骤结合在
一起。
封装在三个函数中:
:
voidArray(),voidStack(),voidPrind();通过switch语句进行选择采用哪种方法转换。
2.数据结构设计:
抽象数据类型栈:
ADTStack{
数据对象:
D={ai|ai∈ElemSet,i=1,2,...,n,n≥0}
数据关系:
R1={
约定an端为栈顶,a1端为栈底。
}ADTStack
;
基本操作:
InitStack(&S)
操作结果:
构造一个空栈
S。
Push(&S,e)
初始条件:
栈S已存在。
操作结果:
插入元素e为新的栈顶元素。
Pop(&S,&e)
初始条件:
栈
操作结果:
删除
S已存在且非空。
S的栈顶元素,并用
e返回其值。
3.软件结构设计:
三、详细设计
1.定义程序中所有用到的数据及其数据结构,及其基本操作的实现;
用到的数据char类型M进制数,typedefstruct{
int*base;
int*top;
intstacksize;
}stack;
基本操作:
voidarray(intN)
初始条件:
已知一个十进制数
操作结果:
转换成其他进制数y。
intgetdex()
初始条件:
已知一个M进制数
操作结果:
转换成十进制数。
voidprind_d(intn,intc)基本操作:
初始条件:
已知一个十进制数
操作结果:
转换成其他进制数y。
InitStack(&S)
操作结果:
构造一个空栈S。
Push(&S,e)
初始条件:
栈S已存在。
操作结果:
插入元素e为新的栈顶元素。
Pop(&S,&e)
初始条件:
栈S已存在且非空。
操作结果:
删除S的栈顶元素,并用e返回其值。
2.主函数和其他函数的伪码算法;
算法设计说明,存储结构的说明。
1.intgetdex();把其他进制数转化为十进制数,
算法步骤:
(1)定义一个字符型的数组
chara【50】,用gets()函数输入字符串。
把M
进制数保存在一个字符串
数组当中,例如16进制数2A,
(2
)用for循环的嵌套实现转换。
从
i=n-1
开始,执行语句:
判断
a【i】是否大于57(整
数大小的比较),(a[i]<=57,a【i】减去
48,a[i]>57那么a[i]-55
,因为1
到9和A,B,C
的Aske码有差别。
)从而实现字符向整数的转变。
(3
)通过for循环把M进制数的每一位取出来用
t保存,倒序取出的先取得
A,再取2。
(4
)P=1,然后嵌套的
for循环用来求每一位对应的权。
例如
A对应的p=0,2的权p=1。
用for(j=0;j {p=p*x;}求p,循环的条件是j (5 )把十进制数用sum存储,sum=sum+t*p; **存储结构说明: 物理存储结构是顺序存储结构,逻辑结构是线性结构,主要是采用 数组来 存储处理M进制数。 2.voidarray(intN);把十进制数转成其他进制数。 (1).定义字符数组charHexNum[]="0123456789ABCDEF";chara[1000]={0}; (2)输入要转化成进制数q;用取余数的方法,把余数存储在数组a[1000],实现语句为while语 句,(a[i]=HexNum[N%q];i=i+1;N=N/q;)其中十进制数N除以q的余数正好对应数组 HexNum[]的某一元素,例如42除以16,余下2,对应HexNum[]中2,余下10对应数组 中的 A。 (3)倒序输出余数;定义变量m,存储数组a[]中余数的元素的个数, 用for循环从i=m+1;开始输出也就是从数组**本函数定义了两个数组一个存储1-9,A到 a【】中最后一个余数开始输出。 直到i=0;F这16个字符的另一个存储10进制数除以 q 进制数的余数的。 3.voidprind_d(intn,intc)递归的方法把十进制转换成其他进制数。 (1)定义一个递归函数用switch语句判断转换成的四种情况 (2)Case10,输入十进制数n,判断是否<0,如果是则putchar('-') 是否为0;再执行prind_d(n/10,10);递归,直到商为0时停止。 跳过 行putchar(n%10+'0');,输出余数,然后倒序的方式输出所有余数。 ;然后if(n/10)判断商 prind_d(n/10,10),执 (3)Case16 ,case8 ,case2 都和 case10 一样。 **十六进制数不太一样要把余数保存在一个数组中,charch[]="0123456789ABCDEF";然 后倒序输出。 4.栈的方式实现十进制转化为其他进制数。 (1)voidinitstack(stack&s) 定义一个结构体typedefstruct{ int*base; int*top; intstacksize; }stack; s.base=(int*)malloc(STACK_INIT_SIZE*sizeof(int)); 开辟一个 STACK_INIT_SIZE 大的空 间并把首地址赋给栈底指针 s.base ; s.top=s.base,栈底和栈顶指针相等表明是空栈;栈的大小为 s.stacksize=STACK_INIT_SIZE。 (2)入栈voidpush(stack&s,chare) 判断是否栈满s.top-s.base>=s.stacksize (),并把首地址赋给s.base。 ;如果栈满另外开辟新的空间 s.base=(int*)realloc 栈的栈顶指针为 s.top=s.base+s.stacksize; 栈的容量变为: s.stacksize+=STACKINCREMENT ;并把新的元素赋给栈顶指针, *s.top=e; 栈顶指针加 1,s.top=s.top+1 。 (3)出栈。 While语句判断s.top! =s.base时结束,栈顶指针的值赋给 e>9是否成立,如果是则以字符的形式输出输出否则以整数的形式输出。 e,然后减 1,判断 4.封装在三个函数中 Array() ,Stack(), Prind()把 M进制数转换为其他进制数。 (1)Array(),Prind()。 输入M进制数x,然后转换成十进制数 N),voidprind_d(intn,intc)这两个函数转换成y进制数。 m,分别再用 voidarray(int (2)Stack()。 temp=(int)N%n,求余数,并入栈,push(s,temp),但当temp>9时要强制转换成字符类型: temp=(char)(temp+55); 然后倒序出栈pop(s)。 5,。 主函数main() 用一个switch语句来选择用哪种方法,n=1,用数组,n=2用递归,n=3用栈。 其他输入输入错误。 3.主要函数的程序流程图,实现设计中主程序和其他子模块的算法,以流程图的形式表示。 开始 输入N charHexNum[]= "0123456789ABCDEF"; chara[1000]={0}; 输入q N=0 是 a[i]=HexN um[N%q]; 否 i=i+1; N=N/q; m=i; i=m+1 i>=0; 是 否 printf("%c",a[i]);否 i-- i-- cout< 结束 开始 chara[50] int n,j,i,sum=0,t=0, p=1;intx; 输入一个 数x cin.get(); gets(a); n=strlen(a); i=n-1 i>=0 是 p=1; a[i]<=57 否 t=a[i]-55 i==n-1 否 j=0 j 是 p=p*x j++ sum+=t*p; 结束 是 t=a[i]-48 是p=1 否 开始 intn,intc prind_d(int n,intc) switch(c) if(n/2) if(n/16) prind_d(n/2,2); prind_d(n/16,16); putchar(n%2+'0'); break;putchar(ch[n%16]); if(n/8) prind_d(n/8,8); putchar(n%8+'0'); break; 4.画出函数之间的调用关系图。 Void main() Prind() Array()Stack() array(a)getdex() void prind_d(i ntn,intc) initstackpush(s,t (s)emp)pop(s) 四、调试分析 调试分析: 1.实际完成的情况说明(完成的功能,支持的数据类型等);可以完成M进制数X到其他进制数的转换 2.程序的性能分析,包括时空分析; 程序的时间复杂度为o(n),空间复杂度为0 (1); 3.上机过程中出现的问题及其解决方案; 实验过程中要在数组方法中出现问题: 保存余数的数组chara[1000]要都赋予值0,否则在 倒序的是否会因为系统自动分配的未知数值出现问题chara[1000]。 本来结果应该是2A结果却是烫2A。 问题2.在把其他进制数转换成十进制数的时候,1到9的ASCII值(t=a[i]-48)与ABCF字符 的ASCII码(t=a[i]-55)的值有区别, 本应该转换成的十进制数是159,但却等于156,所以要分开对待。 4.程序中可以改进的地方说明; 试验中还是又可以改进的地方的,例如把小数转化的部分加进去。 增强程序的容错性主要在输入输出方面 5.程序中可以扩充的功能及设计实现假想。 可以直接实现把M进制数转换成N进制数,而不是通过十进制这个桥梁。 五、测试结果 栈方法: 递归方法: 六、 .用户手册: 用visualC打开源文件,按ctrl+F7,进行编译,再按ctrl+F5运行,会出现一个界面 再按菜单操作及可 七.体会与自我评价 实验设计中我学到了模块化处理问题,找到问题,并一个个解决,例如把三种方法封装在 三个函数中。 但在也存在着一些问题主要是16进制上,它包括一些AB等一些字母,所以要进行特别处理。 例如在十进制的转化中要分开处理 if(a[i]<=57)//比较大小都要换成整型的 t=a[i]-48; else t=a[i]-55; if(i==n-1) } 解决数制转换问题时,如果所给的数值不是用十进制表示的,一般用一个字符型数组来 存放。 数组的每个元素分别存储它的一位数字。 然后按位转换求和,得到十进制表示;再 十进制表示转换成所求的数制表示。 转换的结果也用一个字符型数组表示,每个元素表示 换结果的一位数字。 根据数制表示中相邻位的基数关系,可以把不同的数制分成两类。 一 类数制表示中,相 邻位的基数是等比关系,例如我们熟悉的十进制表示。 另一类数制表示中,相邻位的基数 不等比的。 例如在时间表示中,从秒到分采用 60 进进制;从月到年采用 12 进制。 把一个 数值从数制B 的表示bmbm-1bm-2...b1 转换成十进制表示dndn-1dn-2...d1 比较简 单。 假设数制 B中,第i位的基数为basei(1? i? m) ,直接把basei 与bi 相乘,然后对 全部乘积求和。 从十进制表示dndn-1dn-2...d1 到bmbm-1bm-2...b1 的转换需要分 两种情况考虑: 数制M中相邻数字的基数是等比关系,即: basei(m) 可以表示成Ci-1,其中C是 一个常量。 将 dndn-1dn-2...d1 除以C,余数即为 b1;将dndn-1dn-2...d1 和C相 除的结果再除以 q,余数即为b;⋯;直至计算出为 bm止。 数制M中相邻数字的基数不等比。 需要先判断 dndn-1dn-2...d1 在数制M中需要的 位数m,然后从高位到低位依次计算 bm、bm-1 、bm-2、...、b1。 源代码: #include usingnamespacestd; #include #include #defineSTACK_INIT_SIZE100 #defineSTACKINCREMENT10 typedefstruct{ int*base; int*top; intstacksize; }stack; //////////////////////////////// intgetdex() { chara[50]; intn,j,i,sum=0,t=0,p=1;intx; printf("输入要转化M进制数: "); scanf("%d",&x); printf("输入一个进制数x: "); cin.get(); gets(a); n=strlen(a); for(i=n-1;i>=0;i--) {p=1; if(a[i]<=57)//比较大小都要换成整型的 t=a[i]-48; else t=a[i]-55; if(i==n-1) { p=1; } else { for(j=0;j {p=p*x; } } sum+=t*p; } printf("对应的十进制数: %d\n",sum); returnsum; } ////////////////////////////////////////////////////////// voidarray(intN) {charHexNum[]="0123456789ABCDEF"; chara[1000]={0}; printf("输入一个要转化的进制数N: "); intq; scanf("%d",&q); inti=0,m=0; while(N) { a[i]=HexNum[N%q]; i=i+1; N=N/q; } //printf("%d",i); m=i; for(i=m+1;i>=0;i--) { printf("%c",a[i]); } cout< } ////////////////////////////////////////////////////// voidinitstack(stack&s) {//构造一个空栈s s.base=(int*)malloc(STACK_INIT_SIZE*sizeof(int));//存储分配失败 s.top=s.base;s.stacksize=STACK_INIT_SIZE; //returns; } ///////////////////////////////////////////////////////// voidpush(stack&s,chare) {//插入元素e为新的栈顶元素,并返回OK,否则返回ERROR if(s.top-s.base>=s.stacksize){//栈满追加存储空间 s.base=(int*)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(int)); s.top=s.base+s.stacksize; s.stacksize+=STACKINCREMENT; } *s.top=e; s.top=s.top+1; //returns; } //////////////////////////////////////////////////////// voidpop(stacks) {//若栈不空则删除s的栈顶元素,用e返回其值,并返回 inte; OK,否则返回 ERROR //printf("输出相等的一个%d进制数",&n);while(s.top! =s.base) {e=*--s.top; if(e>9) printf("%c",e); else printf("%d",e); } } ///////////////////////////////////////////////////// voidprind_d(intn,intc) { switch(c) { case10: { if(n<0) { putchar('-'); n=-n; } if(n/10) prind_d(n/10,10); putchar(n%10+'0'); break; } case8: { if(n/8) prind_d(n/8,8); putchar(n%8+'0'); break; } case16: { if(n<0) { putchar('-'); n=-n; } charch[]="0123456789ABCDEF"; if(n/16) prind_d(n/16,16); putchar(ch[n%16]); break; } case2: { if(n/2) prind_d(n/2,2); putchar(n%2+'0'); break; } } } /////////////////////////////////////////////////// voidArray() {printf("数组方法的运行结果: \n"); inta; a=getdex(); array(a); } ////////////////////////////////////////////////////// voidStack() { printf("栈方法的运行结果: \n"); stacks; intN,temp; initstack(s); N=getdex(); //printf("输入一个十进制数"); //scanf("%d",&N); printf("请输入要转换成的进制数N: "); intn;//把十进制转换成n进制 scanf("%d",&n); while(N) { temp=(int)N%n; if(temp>9) {temp=(char)(temp+55);} push(s,temp); N=N/n; } printf("转换成的N=%d进制数: \n",n); pop(s); printf("\n"); } //////////////////////////////////////////// voidPrind() {printf("递归方法的运行结果: \n"); intc,m; puts("输入要转化的进制数N"); cin>>c; m=getdex(); cout<<"N: ";
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 任意 转换