C语言进制转换课程设计.docx
- 文档编号:25932923
- 上传时间:2023-06-16
- 格式:DOCX
- 页数:32
- 大小:239.77KB
C语言进制转换课程设计.docx
《C语言进制转换课程设计.docx》由会员分享,可在线阅读,更多相关《C语言进制转换课程设计.docx(32页珍藏版)》请在冰豆网上搜索。
C语言进制转换课程设计
课程设计
进制转换
课程设计名称:
数据结构课程设计
专业班级:
学生姓名:
指导教师:
设计时间:
计算机专业课程设计任务书
学生姓名
专业班级学号
题目
进制转换
课题性质
A.工程设计
课题来源
D•自拟课题。
指导教师
同组姓名
无
主要内容
针对进制转换问题,选择、设计和实现合适的抽象数据类型;
进行进制转换分析,给出设计方案。
学习掌握并熟练运用C语言进行程序设计;
任务要求
这次课程设计不仅提升C语言理论知识,更重要的是能够提高自己的编程能力。
这个项目是用来实现进制转换的一些简单功能。
实
现过程中需要编制函数,依次实现各个功能。
也需要学会利用网络或其他工具来查找相关的资料解决问题,每解决一个问题,就会多一份收获,会不断培养自我学习的能力。
参考文献
[1]谭浩强.C程序设计(第三版).北京:
清华大学出版社.2005:
34
[2]李建忠.大学计算机基础.西安:
西北大学出版社.2005:
104
[3]谭浩强.C程序设计题解与上机指导(第三版).北京:
清华大学
出版社.2005:
68
[4]罗建军、朱丹军、顾刚.C++程序设计教程(第2版).北京:
高等教育出版社.2007:
76
审查意见
指导教师签字:
教研室主任签字:
2014年6月15日
、转换概述3....
1.需求分析3....
2.概要设计4....
3.详细设计8....
1.十进制转化为任意进制函数:
8..
2.任意进制转化十进制函数:
.9...
3.程序流程图11
4.运行环境12
5.开发工具和编程语言13
、数学原理14
十进制转二进制:
14
十进制转八进制:
15
十进制转十六进制:
15
二进制转十进制:
15
二进制转八进制:
16
二进制转十六进制:
16
八进制转十进制:
17
八进制转十六进制:
17
十六进制转二进制:
17
十六进制转八进制:
18
三、程序编码17
测试结果26
参考文献30
四、心得体会31
一、转换概述
1、需求分析
进制数制是人们利用符号进行计数的科学方法。
数制有很多种,在计算机中常用的数制有:
十进制,二进制、八进制和十六进制。
十六进制数有两个基本特点:
它由十六个字符
0〜9以及A,B,C,D,E,F组成(它们分别表示十进制数0〜15),十六进制数运算规律是逢十六进一。
要求:
(1)输入一个十进制数N,将它转换成R进制数输出,并可以进行逆转换。
(2)输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(2<=R<=16,R<>10)。
(3)为每个测试实例输出转换后的数,每个输出占一行。
如果R大于10,则对应的数字规则参考16进制(比如,10用A表示,等等)。
(4)界面友好。
2、概要设计
数制转换器程序是要求任意两种数间的相互转化,本次课程设计以任意进制间转换为中心实现二进制、八进制、十进制、十六进制、十八进制之间的相互转化。
对输入的任意进制的数字进行转换,实现常见进制间的转换以及用户自定义需要转换的目标进制数,这样大大提高了本程序的用途。
常见的二进制、八进制、十进制、十六进制、十六进制之间的固定转换,其转换方式大同小异,从低进制数向高进制数转换进行乘数累加,反之则逐步求余,最终进行分布计算得到想要的结果,对以上思想进行扩展,使其不仅仅局限于那些常见进制间的转换,更多的应用到任意进制之间的转换。
本次系统程序,主要有两大模块组成,即任意进制转换为十进制、十进制转换为任意进制,这两部分共同组成了对任意进制数的转换的实现,通过菜单选择,让用户实现自己想要的结果,同时也在程序的简洁上有所压减,达到简洁的应用程序实现相对较复杂的功能。
最后打印输出结果,清屏执行下次任务。
该程序包括七个子函数模块,其中菜单函数模块定义为整型,其余字符转换函数处理模块都根据函数所需定义数据类型。
数制转换器处理系统中用数组来储存处十进制以外的数,将一个指定进制的数,从低到低高一位一位取出,并计算出每位的十进制值,然后乘以其数基的特定幕指数,得出这一位数的十进制值,将所有各位的十进制值相加得出这个数的十进制值,然后再将该十进制数转换为指定数制的数,此过程采用求余法进行,用这个十进制数作为被除数,用指定的数基作除数,连续求余,得出的余数依由个位到十位等的顺序组成新数,即得指定数制的数。
(1)逻辑设计如图所示:
开始
主菜单
判断调用程序
图2.1
(2)程序中各函数简单说明见如表1、1函数说明所示:
表2.1
返回值
函数名
参数表
函数说明
int
main
void
主函数
void
intANY_ten()
intx,intnum
任意进制转换为
十进制
void
Intten_ANY()
intnum,inty
十进制转换为任
意进制9
void
ten_ANY()
num,2
十进制转换为一
进制
void
list1()
num
进制转换采单
void
list2()
num
主菜单
void
ANY_ch()
num,num
任意进制间的转
换
3.详细设计
1.十进制转化为任意进制函数:
十进制整数num转换为任意(x)进制整数采用"除x取余,逆序排列法。
具体做法是:
用x去除十进制整数,可以得到一个商和余数;再用x去除商,又会得到一个商和余数,如此进行,直到商为一时为止,然后把先得到的余数作为x进制数的低位有效位,后得到的余数作为x进制数的高位有效位,结构图如图3.4所示:
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;
}
2.任意进制转化十进制函数:
从最后一位开始算,依次列为第0、1、2...位第n位的数乘以任意进制数y的n
次方得到的结果相加结构图如图3.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");
}
3.程序流程图
(1)主函数main()流程图,如图3.1所示:
Iist2();
图3.1main函数流程图
(2)主菜单list2()流程图,如图3.2所示:
N
图3.2list2()函数流程图
(3)常见进制转换菜单Iist1()函数流程图,如图3.3所示:
4)十进制转换为任意进制函数ten_ANY()函数流程图,如图3.4所示:
图3.4十进制转换为任意进制函数ten_ANY()函数流程图
(5)任意进制转换为十进制函数ANY_ch()函数流程图,如图3.5所示:
图3.5任意进制数之间的转换ANY_ch()函数流程图
4.运行环境
软件环境
操作系统:
Windows7
硬件环境
处理器:
IntelPentium166MX或更高
内存:
32MB以上
硬盘空间:
1GB以上
显卡:
SVGA显示适配
5.开发工具和编程语言
MicrosoftvisualC++
C语言
二、数学原理
实现进制转换需要编个函数(进制转换器),每一函数完成相应进制的转换,下面是各个进制之间转换的数学方法的算法。
十进制转二进制:
十进制数转换成二进制数,是一个连续除2的过程;把要转换的数,除以2,得到商和余数,将商继续除以2,直到商为0.最后将所有余数倒序排列,得到数就是转换结果。
例如:
302/2
=151余0
151/2
=75余1
75/2
=37余1
37/2
=18余1
18/2
=9余0
9/2
=4余1
4/2
=2余0
2/2
=1余0
所以302转换为2进制,结果:
100101110
十进制转八进制:
十进制数转换成八进制的方法和转换为二进制的方法类似,唯一变化:
除数由2变成8。
例如:
120/8=15余0
15/8=1余7
1/8=0余1
所以120转换为8进制,结果:
170.
十进制转十六进制:
十进制数转换成十六进制数的方法和转换为二进制的方法类似,唯一变化:
除数
由2变成16。
不过,十六进制数:
(10〜15)是用英文大写字母(A~F)表示。
例如:
123/16=7余11
所以123转换为16进制,结果:
7B.
二进制转十进制:
二进制数转换为十进制数按权展开,第0位的权值是2的0次方,第1位的权值是2的1次方•例如:
1010转换成十进制数:
第0位:
0*2A0=0
第1位:
1*2八1=2
第2位:
0*2八2=0
第3位:
1*2A3=8
所以1010转换成十进制数结果:
0+2+0+8=10.
二进制转八进制:
利用421,从后往前每三位一组,缺位补0,然后按十进制方法进行转换。
例
女口:
(11001)001=101仁3
然后将结果按从下往上顶顺序书写:
31.
二进制转十六进制:
二进制和十六进制的互相转换比较重要。
不过这二者的转换却不用计算;利用
8421,对于任意一个4位的二进制数,都可以很快算出它对应的10进制值。
例如:
1111=8+4+2+1=15
又因为十六进制数:
10〜15用大写字母A~F表示,所以15为F.
八进制转二进制:
利用421;从后往前每三位一组,缺位处用0填补,然后按十进制方法进行
转化;
例如:
1—>0013-011
然后我们将结果按从下往上的顺序书写就是:
11001,那么这个11001就是八进制31
的二进制形式。
八进制转十进制:
八进制就是逢8进1,八进制数采用0〜7这八数来表达一个数;八进制数第0位的权值为8的0次方,第1位权值为8的1次方,第2位权值为8的2次方……例如:
1507转换成十进制数:
第0位:
7*8A0=7
第1位:
0*8A仁0
第2位:
5*8八2=320
第3位:
1*8八3=512
所以换算成十进制:
7+0+320+512=839.
八进制转十六进制:
八进制转换成十六进制:
有两种方法:
一种是先将八进制转换成二进制,在将二进
制转换成十六进制。
另一种方法是将八进制转换成十进制,在将十进制转换成十六进
制。
十六进制转二进制:
上面已经提到二进制转换成十六进制的方法,记住8421,每一位的权值,所以十
六进制转成二进制就是一段四位分别转成二进制。
例如:
F1111,D1101,A1010,50101.
十六进制转八进制:
十六进制转八进制也不能直接转换,需要将十六进制转换成十进制或者二进制,才能由十进制或者二进制转换成八进制。
十六进制转十进制:
16进制就是逢16进1,但我们只有0~9这十个数字,所以我们用A,B,C,D,E,F这六个字母来分别表示10,11,12,13,14,15。
十六进制数的第0位的权值为16的0次方,第1位的权值为16的1次方,第2位的权值为16的2次方“所以,在第N(N从0开始)位上,如果是数X(X大于等于0,并且X小于等于15,即:
F)表示的大小为X*16的N次方。
例如:
2AF5
第0位:
5*16A0=5
第1位:
F*16A1=240
第2位:
A*16A3=2560
第3位:
2*16A4=8192
所以转换成十进制数为:
10997.
三、程序编码
#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;
}
}
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("
**********
1-十进制转二进制
********
**\n");
printf("
**********
2-十进制转八进制
********
**\n");
printf("
**********
3-十进制转十六进制**********\n");
printf("
**********
4-二进制转十进制
********
**\n");
printf("
********
**\n");
printf("
**********
6-
十六进制转十进制
**********\n");
printf("
**********
7-
二进制转八进制
**********\n");
printf("
8-
**********\n");
二进制转十六进制
**********
5-八进制转十进制
**********
********
printf("
0-返回
**\n");
printf("
**********
*********
**\n");
printf("
******************************************
**\n");
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);
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{
**\n");
n**********************************************
printf("***
二十进制内任意进制转换
***\n"
);
printf(
n**********************************************
**\n");
printf("\t\t按Enter进入主菜单!
");
getchar();
printf("
********************************************\n");
loop1:
printf("
请选择要执行的模式:
");
**\n");
system("cls");
printf("
**********
【主菜单】
**********\n")
printf("
**********
**********\n")
printf("
**********
模式选择
**********\n")
printf("
**********
**********\n")
printf("
**********
1-
常见进制转换
**********\n");
printf("
**********
2-
自定义进制数转换
**********\n");
printf("
**********
0-
退出
**********\n");
printf("
******************************************
**\n");
********
scanf("%d",&b);
switch(b)
{
case1:
list1();break;/*常见进制转换菜单*/
case2:
ANY_ch();break;/*任意进制数之间转换*/case0:
exit(0);break;
default:
printf("\n您的输入有误,请重新选择!
\n\n");gotoloop1;break;
gefchaoThi-e(bvo)八refurn0八voidmain()
宀
=會
测试结果
按Enter键进入主菜单,如图3.1所示:
[主菜单】
wiotwatwK豪豪豪
模式选择
■_■*■_■■■'・■n.■■■・■・■i_■'■■
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 转换 课程设计