进制转换的实现.docx
- 文档编号:4760064
- 上传时间:2022-12-08
- 格式:DOCX
- 页数:22
- 大小:354.13KB
进制转换的实现.docx
《进制转换的实现.docx》由会员分享,可在线阅读,更多相关《进制转换的实现.docx(22页珍藏版)》请在冰豆网上搜索。
进制转换的实现
数据结构课程设计
设计说明书
进制转换的实现
学生姓名
学号
班级
成绩
指导教师
计算机科学与技术系
2011年月日
数据结构课程设计评阅书
题目
进制转换的实现
学生姓名
学号
指导教师评语及成绩
成绩:
教师签名:
年月日
答辩教师评语及成绩
成绩:
教师签名:
年月日
教研室意见
总成绩:
室主任签名:
年月日
注:
指导教师成绩60%,答辩成绩40%,总成绩合成后按五级制记入。
课程设计任务书
2010—2011学年第二学期
专业:
信息管理与信息系统学号:
姓名:
课程设计名称:
数据结构课程设计
设计题目:
进制转换的实现
完成期限:
自2011年2月19日至2011年3月4日共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)界面友好。
指导教师(签字):
教研室主任(签字):
批准日期:
年月日
摘要
本次课程设计设计了一个任意进制之间转换的软件程序系统,依据对计算机的发展要求,常见的二进制、八进制、十进制及十六进制数也相应得到广泛使用,从最基本十进制向各个转换以及各进制内部转换相对应用较多,随即出现多种进制数,针对此现实,开发本系统,解决任意进制之间的相互转换,系统主要有以下几个模块:
任意进制转换为十进制、十进制转换为任意进制以及两者组合实现任意进制间的相互转换。
本软件程序系统在windows2000/XP系统下,以MicrosoftVisualC++6.0为运行软件环境,采用C/C++语言进行编写,操作简单明了,实际解决各进制数之间的转换。
关键词:
二进制;进制数;任意进制;相互转换
目录
1课题描述1
2问题分析和任务定义2
3逻辑设计3
4详细设计4
4.1十进制转任意进制函数4
4.2任意进制转十进制函数4
4.3程序流程图5
5程序编码9
6程序调试与测试14
总结18
文参考献19
1课题描述
使用计算机的人每时每刻都在与数打交道,在计算机内部,数是以二进制表示的,而我们习惯上使用的是十进制数,所以计算机从我们这里接收到十进制数后,要经过翻译,把十进制数转换为二进制数才能进行处理,这个过程是由计算机自动完成的。
但是对程序员来说,有时需要把十进制数转换为二进制数、十六进制数和八进制数,或者把十六进制数转换为十进制数等,这都不是一件轻松的工作,为了使这项工作变得轻松愉快现在我们用C语言来编写这个程序,该系统能够根据用户的要求,实现二进制、八进制、十进制、十六进制之间的相互转化,以及任意进制间的相互转换。
系统开发基于Windows2000/Xp平台,以VisualC++6.0等作为开发工具。
2问题分析和任务定义
数制转换器程序是要求任意两种数间的相互转化,本次课程设计以任意进制间转换为中心实现二进制、八进制、十进制、十六进制、十八进制之间的相互转化。
对输入的任意进制的数字进行转换,实现常见进制间的转换以及用户自定义需要转换的目标进制数,这样大大提高了本程序的用途。
常见的二进制、八进制、十进制、十六进制、十六进制之间的固定转换,其转黄方式大同小异,从低进制数向高进制数转换进行乘数累加,反之则逐步求余,最终进行分布计算得到想要的结果,对以上思想进行扩展,使其不仅仅局限于那些常见进制间的转换,更多的应用到任意进制之间的转换。
本次系统程序,主要有两大模块组成,即任意进制转换为十进制、十进制转换为任意进制,这两部分共同组成了对任意进制数的转换的实现,通过菜单选择,让用户实现自己想要的结果,同时也在程序的简洁上有所压减,达到简洁的应用程序实现相对较复杂的功能。
最后打印输出结果,清屏执行下次任务。
3逻辑设计
竖直转换器系统,包括七个子函数模块,其中菜单函数模块定义为整型,其余字符转换函数处理模块都根据函数所需定义数据类型。
数制转换器处理系统中用数组来储存处十进制以外的数,将一个指定进制的数,从低到低高一位一位取出,并计算出每位的十进制值,然后乘以其数基的特定幂指数,得出这一位数的十进制值,将所有各位的十进制值相加得出这个数的十进制值,然后再将该十进制数转换为指定数制的数,此过程采用求余法进行,用这个十进制数作为被除数,用指定的数基作除数,连续求余,得出的余数依由个位到十位等的顺序组成新数,即得指定数制的数。
逻辑设计如图3.1所示。
图3.1系统模块图
4详细设计
4.1十进制转任意进制函数
十进制整数num转换为任意(x)进制整数采用"除x取余,逆序排列法。
具体做法是:
用x去除十进制整数,可以得到一个商和余数;再用x去除商,又会得到一个商和余数,如此进行,直到商为一时为止,然后把先得到的余数作为x进制数的低位有效位,后得到的余数作为x进制数的高位有效位,结构图如图4.5所示
intANY_ten(intx,intnum)
{
inti,j=0;
ints=0;
for(i=1;num!
=0;i*=x)
{
if(num%10>(x-1))
{
j=1;
break;
}
else
{
s+=(num%10)*i;
num=num/10;
}
}
if(j==1)
printf("原数据出错!
请重新输入:
\n");
else
printf("转换为十进制:
%d\n\n",s);
returns;
}
4.2任意进制转十进制函数
从最后一位开始算,依次列为第0、1、2...位第n位的数乘以任意进制数y的n次方得到的结果相加结构图如图4.5所示
voidten_ANY(intnum,inty)
{
inti;
intarr[30];
for(i=0;;i++)
{
arr[i]=num%y;
num=num/y;
if(num==0)
{
break;
}
}
printf("转换为%d进制:
",y);
for(;i>=0;i--)
{
switch(arr[i])
{
case10:
printf("A");break;
case11:
printf("B");break;
case12:
printf("C");break;
case13:
printf("D");break;
case14:
printf("E");break;
case15:
printf("F");break;
case16:
printf("G");break;
case17:
printf("H");break;
case18:
printf("I");break;
case19:
printf("J");break;
default:
printf("%d",arr[i]);
}
}
printf("\n\n");
}
4.3程序流程图
(1)主函数main()流程图,如图4.1所示
图4.1main函数流程图
图4.2list2()函数流程图
(2)主菜单list2()流程图,如图4.2所示
(3)常见进制转换菜单list1()函数流程图,如图4.3所示
图4.3常见进制转换菜单list1()函数流程图
(4)十进制转换为任意进制函数ten_ANY()函数流程图,如图4.4所示
图4.4十进制转换为任意进制函数ten_ANY()函数流程图
(5)十进制转换为任意进制函数ANY_ten()函数流程图,如图4.5所示
图4.5任意进制转换为十进制函数ANY_ten()函数流程图
(6)十进制转换为任意进制函数ANY_ch()函数流程图,如图4.6所示
图4.6任意进制数之间的转换ANY_ch()函数流程图
5程序编码
#include
#include
#include
list2();
intANY_ten(intx,intnum)
{
inti,j=0;
ints=0;
for(i=1;num!
=0;i*=x)
{
if(num%10>(x-1))
{
j=1;
break;
}
else
{
s+=(num%10)*i;
num=num/10;
}
}
if(j==1)
printf("原数据出错!
请重新输入:
\n");
else
printf("转换为十进制:
%d\n\n",s);
returns;
}
voidten_ANY(intnum,inty)
{
inti;
intarr[30];
for(i=0;;i++)
{
arr[i]=num%y;
num=num/y;
if(num==0)
{
break;
}
}
printf("转换为%d进制:
",y);
for(;i>=0;i--)
{
switch(arr[i])
{
case10:
printf("A");break;
case11:
printf("B");break;
case12:
printf("C");break;
case13:
printf("D");break;
case14:
printf("E");break;
case15:
printf("F");break;
case16:
printf("G");break;
case17:
printf("H");break;
case18:
printf("I");break;
case19:
printf("J");break;
default:
printf("%d",arr[i]);
}
}
printf("\n\n");
}
voidlist1()
{
inti,a,m,num;
charch[100];
FILE*f;
do{
getchar();
system("cls");
printf("********************************************\n");
printf("********************\n");
printf("**********数制转换器**********\n");
printf("********************\n");
printf("**********1-十进制转二进制**********\n");
printf("**********2-十进制转八进制**********\n");
printf("**********3-十进制转十六进制**********\n");
printf("**********4-二进制转十进制**********\n");
printf("**********5-八进制转十进制**********\n");
printf("**********6-十六进制转十进制**********\n");
printf("**********7-二进制转八进制**********\n");
printf("**********8-二进制转十六进制**********\n");
printf("**********0-返回**********\n");
printf("********************\n");
printf("********************************************\n");
loop:
printf("请输入你所选择的序号:
");
scanf("%d",&a);
if(a!
=0&&a<9)
{
st:
printf("\n输入要转换的数:
");
scanf("%s",&ch);
f=fopen("num.txt","w");
for(i=0;i<=(int)strlen(ch);i++)
fputc(ch[i],f);
fclose(f);
}
for(i=0;i<(int)strlen(ch);i++)
{
if((int)(ch[i])>=48&&(int)(ch[i])<=57||(ch[i])>='A'&&(int)(ch[i])<='J')
continue;
else
printf("输入有误!
请输入数字:
");gotost;break;
}
f=fopen("num.txt","r");
fscanf(f,"%d",&num);//读出文件num.txt中权值
fclose(f);
switch(a)
{
case0:
list2();break;/*返回上一层*/
case1:
ten_ANY(num,2);break;/*十进制转二进制*/
case2:
ten_ANY(num,8);break;/*十进制转八进制*/
case3:
ten_ANY(num,16);break;/*十进制转十六进制*/
case4:
ANY_ten(2,num);break;/*二进制转十进制*/
case5:
ANY_ten(8,num);break;/*八进制转十进制*/
case6:
ANY_ten(16,num);break;/*十六进制转十进制*/
case7:
m=ANY_ten(2,num);ten_ANY(m,8);break;/*二进制转八进制*/
case8:
m=ANY_ten(2,num);ten_ANY(m,16);break;/*二进制转十六进制*/
default:
printf("您的输入有误,请重新选择!
\n");gotoloop;break;
}
getchar();
}while(a>0);
}
voidANY_ch()
{
inta,m,x,y,num;
printf("请输入进制数:
");
scanf("%d",&x);
printf("输入该%d进制数:
",x);
scanf("%d",&num);
m=ANY_ten(x,num);
printf("是否将当前十进制数进一步转换:
1.是2.否\n");
printf("请选择:
");
loop2:
scanf("%d",&a);
switch(a)
{
case1:
printf("转换的目标进制数为:
");
scanf("%d",&y);
ten_ANY(m,y);break;
case2:
printf("\t转换结束!
");break;
default:
printf("选择有误!
请重选:
");gotoloop2;break;
}
getchar();
}
intlist2()
{
intb;
do{
printf("************************************************\n");
printf("***欢迎访问:
二十进制内任意进制转换!
***\n");
printf("************************************************\n");
printf("\t\t按Enter进入主菜单!
");
getchar();
system("cls");
printf("********************************************\n");
printf("**********【主菜单】**********\n");
printf("********************\n");
printf("**********模式选择**********\n");
printf("********************\n");
printf("**********1-常见进制转换**********\n");
printf("**********2-自定义进制数转换**********\n");
printf("**********0-退出**********\n");
printf("********************\n");
printf("********************************************\n");
loop1:
printf("请选择要执行的模式:
");
scanf("%d",&b);
switch(b)
{
case1:
list1();break;/*常见进制转换菜单*/
case2:
ANY_ch();break;/*任意进制数之间转换*/
case0:
exit(0);break;
default:
printf("\n您的输入有误,请重新选择!
\n\n");gotoloop1;break;
}
getchar();
}while(b>0);
return0;
}
voidmain()
{
list2();
}
6程序调试与测试
在vc++6.0运行界面如图6.1所示:
数制转换器函数调试结果截图
图6.1数制转换器函数调试结果
按Enter键进入主菜单,如图6.2所示
图6.2十进制转换为二进制
选择1,进入常见进制转换菜单,如图6.3所示
图6.3十进制转换为二进制
选择1,十进制转换为二进制函数,输入12,结果如图6.4所示
图6.3十进制转换为二进制
选择2,十进制转换为八进制函数,输入20,结果如图6.4所示
图6.4十进制转换为八进制
选择3,十进制转换为十六进制函数,输入30,结果如图6.5所示
图6.5十进制转换为十六进制
选择4,二进制转换为十进制函数,输入131,结果如图6.6所示
图6.6二进制转换为十进制
选择4,二进制转换为十进制函数,输入111,结果如图6.7所示
图6.7二进制转换为十进制
选择5,八进制转换为十进制函数,输入171,结果如图6.8所示
图6.8八进制转换为十进制
选择6,十六进制转换为十进制函数,输入19AF,结果如图6.9所示
图6.9十六进制转换为十进制
选择7,二进制转换为八进制函数,输入1101,结果如图6.10所示
图6.10十六进制转换为十进制
选择8,二进制转换为十六进制函数,输入11111,结果如图6.11所示
图6.11二进制转换为十六进制
选择0,返回主菜单如图6.12所示
图6.12返回主菜单
选择2,自定义进制转换,输入进制数为2,数字为110101,选择1.是,结果如图6.13所示
图6.13自定义进制转换
总结
在本次课程设计中,所完成的数制转换器系统实现了二进制、八进制、十六进制和十进制之间转换等功能,同时也实现了二十进制内任意进制之间的转化功能。
其中有关数字太大无法实现转化的问题,主要是因为数字超过了定义的长度时,无法实现两个数制转化。
除此之外不能实现小数的转化等问题。
加入了对输入数字的判定是否符合要求,对输入不合法字符检验并提示。
希望以后可以实现上述两个问题,首先是改进程序,是其能实现小数的转化,其次改进定义的长度问题,使其能够转化更大的数。
这次课程设计使我对C语言知识进行了系统的、有条理的复习,对许多知识点都加强了记忆。
在开始编写程序时,我遇到了许多问题,但通过看书、查资料、向老师请教,最后将问题一一化解。
同时这次课程设计的制作,为我毕业设计的制作打下了坚定的基础。
参考文献
[1]罗建军,朱丹军,顾刚。
C++程序设计教程(第2版),高等教育出版社,2007
[2]谭浩强。
C程序设计(第三版),北京:
清华大学出版社,2005
[3]李建忠。
大学计算机基础,西安:
西北大学出版社,2005
[4]谭浩强。
C程序设计题解与上机指导(第三版),北京:
清华大学出版社,2005
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 转换 实现