1、 二进制、八进制、十进制、十六进制之间的转换贵州航天职业技术学院计算机科学系二进制、八进制、十进制、十六进制数之间的转换 -C 语言程序设计课程设计报告 院系名称: 贵州航天职院计科系学生姓名: 陈 斌 班级学号:09 软件二班(A093GZ053020171)指导老师: 陈 美 成2010 年 12 月 13 日二进制、八进制、十进制、十六进制之间的转换贵州航天职业技术学院计算机科学系摘要【摘要】随着计算机技术的发展与普及,据算计已经成为各行各业最基本的工具之一,而且正迅速地进入人类生活的各个领域。C 语言作为国际上广泛的通用程序设计语言,在计算机的研究和应用中已展现出强大的生命力。C 语言
2、是很重要的高级语言,也是最基础的语言。C 语言是一种结构化语言。它层次清晰,便于按模块化方式组织程序,易于调试和维护。C 语言的表现能力和处理能力极强。它不仅具有丰富的运算符和数据类型,便于实现各类复杂的数据结构。它还可以直接访问内存的物理地址,进行位的操作。由于 C 语言实现了对硬件的编程操作,因此 C语言集高级语言和低级语言的功能于一体。既可用于系统软件的开发,也适合于应用软件的开发。此外语言还具有效率高,可移植性强等特点。因此广泛地移植到了各类各型计算机上,从而形成了多种版本的语言。语言的特点有:一、运算符丰富。C 语言的运算符包含的范围很广泛,共有 34 个运算符。C 语言把括号、赋值
3、、强制类型转换等都作为运算符处理。二、简洁紧凑、灵活方便。C 语言一共只有 32 个关键字,9 种控制语句,程序书写自由,主要用小写字母表示。三、数据结构丰富。C 的数据结构类型有:整型、实型、字符型、数组类型、指针类型、结构类型、结构体类型、共同体类型等。四、.结构式语言。结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。五、允许直接访问物理地址,可以直接对硬件进行操作。六、语法限制不太严格、程序设计自由度大。一般的高级语言语法检查比较严,能够检查出几乎所有的语法错误。而 C 语言允许程序编写者较大的自由度。七、C 语言程序生成代码质量高,程序执行效率高
4、,一般只比汇编程序生成的目标代码效率低1020%。8.C 语言适用范围大,可移植性好。C 语言有一个突出的优点就是适合于多种操作系统,如 DOS、UNIX 和 LINUX 也适用于多种机型。【关键词】main If switchcase for math 二进制、八进制、十进制、十六进制之间的转换贵州航天职业技术学院计算机科学系目录一、 引言二、 实现原理1、算法分析2、实现这个算法的难点3、流程图4、数据字典5、开发环境三、 小结四、 参考文献五、 附录二进制、八进制、十进制、十六进制之间的转换贵州航天职业技术学院计算机科学系一 、引言 这次课程设计不仅提升 C 语言理论知识,更重要的是能够
5、提高自己的编程能力。在做设计的过程中我们会遇到许多困难,有的知识是上课时没有接触到的,这就需要我们学会利用网络或其他工具来查找相关的资料解决问题,每解决一个问题,就会多一份收获,要不断培养自我学习的能力,现在我对 C 语言的各种图形函数有了更深的了解,能够用其来进行设计一些简单项目。这个项目是用来实现进制转换的一些简单功能还有许多有待改进的地方,在以后的时间里需要花更多的时间来深入学习 C 语言,通过这次课程设计才发现自己懂的东西其实很少,还有许多需要学习。我们无论做什么事情都要认真,编程并不是一件容易的事也不是一件很难的事,需要我们认真思考,需要耐心。程序=算法+ 数据结构+ 设计方法+语言
6、工具。二进制、八进制、十进制、十六进制之间的转换贵州航天职业技术学院计算机科学系二、实现原理1、算法分析实现进制转换需要编个函数,每一函数完成相应进制的转换,下面是各个进制之间转换的数学方法的算法。十进制转二进制:十进制数转换成二进制数,是一个连续除 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
7、所以 302 转换为 2 进制,结果: 100101110 十进制转八进制:十 进 制 数 转 换 成 八 进 制 的 方 法 和 转 换 为 二 进 制 的 方 法 类 似 , 唯 一 变 化 : 除 数 由 2 变 成8。例如:120/8=15 余 015/8=1 余 71/8=0 余 1所以 120 转换为 8 进制,结果为:170十进制转十六进制:十进制数转换成十六进制数的方法和转换为二进制的方法类似,唯一变化:除数由 2 变成16。不过,十六进制数:(1015)是用英文大写字母(AF)表示。例如:123/16=7 余 11所以 123 转换为 16 进制,结果为:7B二进制转十进制:
8、二进制数转换为十进制数按权展开,第 0 位的权值是 2 的 0 次方,第 1 位的权值是 2 的 1 次方二进制、八进制、十进制、十六进制之间的转换贵州航天职业技术学院计算机科学系例如:1010 转换成十进制数:第 0 位:0*20=0第 1 位:1*21=2第 2 位:0*22=0第 3 位:1*23=8所以转换为 10 进制数为:0+2+0+8=10二进制转八进制:利用 421,从后往前每三位一组,缺位除补 0,然后按十进制方法进行转换。例如:(11001)001=1011=3然后将结果按从下往上顶顺序书写:31二进制转十六进制:二 进 制 和 十 六 进 制 的 互 相 转 换 比 较
9、重 要 。 不 过 这 二 者 的 转 换 却 不 用 计 算 ; 利 用 8421,对 于 任 意 一 个 4 位 的 二 进 制 数 , 都 可 以 很 快 算 出 它 对 应 的 10 进 制 值 。例 如 :1111=8+4+2+1=15 又 因 为 十 六 进 制 数 : 10 15 用 大 写 字 母 AF 表 示 , 所 以 15 为 F。八 进 制 转 二 进 制 :利 用 421; 从 后 往 前 每 三 位 一 组 , 缺 位 处 用 0 填 补 , 然 后 按 十 进 制 方 法 进 行 转 化 ;例 如 :10013-011然 后 我 们 将 结 果 按 从 下 往 上
10、 的 顺 序 书 写 就 是 : 11001, 那 么 这 个 11001 就 是 八 进 制 31 的 二进 制 形 式 。八 进 制 转 十 进 制 :八 进 制 就 是 逢 8 进 1, 八 进 制 数 采 用 0 7 这 八 数 来 表 达 一 个 数 ; 八 进 制 数 第 0 位 的 权值 为 8 的 0 次 方 , 第 1 位 权 值 为 8 的 1 次 方 , 第 2 位 权 值 为 8 的 2 次 方 例 如 :1507第 0 位 : 7*80=7第 1 位 : 0*81=0第 2 位 : 5*82=320第 3 位 : 1*83=512所 以 换 算 成 十 进 制 : 7
11、+0+320+512=839八 进 制 转 十 六 进 制 :二进制、八进制、十进制、十六进制之间的转换贵州航天职业技术学院计算机科学系八 进 制 转 换 成 十 六 进 制 : 有 两 种 方 法 : 一 种 是 先 将 八 进 制 转 换 成 二 进 制 , 在 将 二 进 制 转换 成 十 六 进 制 。 另 一 种 方 法 是 将 八 进 制 转 换 成 十 进 制 , 在 将 十 进 制 转 换 成 十 六 进 制 。二进制、八进制、十进制、十六进制之间的转换贵州航天职业技术学院计算机科学系十六进制转二进制:上面已经提到二进制转换成十六进制的方法,记住 8421,每一位的权值,所以十
12、六进制转成二进制就是一段四位分别转成二进制。例如:F1111 ,D1101,A1010,50101十六进制转八进制:十六进制转八进制也不能直接转换,需要将十六进制转换成十进制或者二进制,才能由十进制或者二进制转换成八进制。十六进制转十进制:16 进 制 就 是 逢 16 进 1, 但 我 们 只 有 09 这 十 个 数 字 , 所 以 我 们 用A, B, C, D, E, F 这 六 个 字 母 来 分 别 表 示 10, 11, 12, 13, 14, 15。十 六 进 制 数 的 第 0 位 的 权 值 为 16 的 0 次 方 , 第 1 位 的 权 值 为 16 的 1 次 方 ,
13、 第 2 位 的权 值 为 16 的 2 次 方 所 以 , 在 第 N( N 从 0 开 始 ) 位 上 , 如 果 是 是 数 X ( X 大 于 等 于 0, 并 且 X 小 于 等于 15, 即 : F) 表 示 的 大 小 为 X * 16 的 N 次 方 。例 如 :2AF5 第 0 位:5*160=5第 1 位:F*161=240第 2 位:A*163=2560第 3 位:2*164=8192所以转换 成十进制数为:10997. 进制转换的相应代码:2、实现这个算法的难点这个算发的难点在于输入数据时数据的合法性判断和十六进制与八进制之间的转换,因为十六进制和八进制之间不能直接转换
14、,必须把十六进制或者八进制转换为二进制或者十进制,在由二进制或者十进制转换为十六进制或者八进制,也就是要在定义十六进制或者八进制的转换函数中在调用定义二进制或者十进制的转换函数,才能实现十六进制和八进制之间的转换!二进制、八进制、十进制、十六进制之间的转换贵州航天职业技术学院计算机科学系3、流程图开始SqStacks;Clrscr();i#include#include#include#include#include#define STACK_INIT_SIZE 10#define SIZE_INCREMENT 5#define ARRAY_SIZE 33#define NULL 0#defi
15、ne OK 1#define ERROR 0#define OVERFLOW 0/*#define LEFTUP 201#define LEFTDOWN 200#define LINE 205#define RIGHTUP 187#define RIGHTDOWN 188 */*TYPEDEF*/typedef int SELEMTYPE,Status;typedef struct二进制、八进制、十进制、十六进制之间的转换贵州航天职业技术学院计算机科学系SELEMTYPE *base;SELEMTYPE *top;int stacksize;SqStack,*SQSTACK;/*DATA_ST
16、RUCTURE*/Status Init_stack(SQSTACK s)(*s).base=(SELEMTYPE *)malloc(STACK_INIT_SIZE*sizeof(SELEMTYPE);if(!(*s).base) exit(OVERFLOW);(*s).top=(*s).base;(*s).stacksize=STACK_INIT_SIZE;return OK;/*INIT*/Status Push_stack(SQSTACK s,SELEMTYPE e)if(*s).base+(*s).stacksize=(*s).top)(*s).base=(SELEMTYPE *)re
17、alloc(*s).base,(SIZE_INCREMENT+(*s).stacksize)*sizeof(SELEMTYPE);(*s).top=(*s).base+(*s).stacksize;(*s).stacksize+=SIZE_INCREMENT;*(*s).top=e;(*s).top+=1;return OK;/*PUSH*/Status Pop_stack(SQSTACK s,SELEMTYPE *p)if(*s).base=(*s).top) return ERROR;*p=*(*s).top-1);(*s).top-=1;return OK;/*POP*/Status G
18、ettop_stack(SqStack s,SELEMTYPE *e)if(s.base=s.top) return ERROR;*e=*(s.top-1);return OK;/*GETTOP*/Status Length_stack(SqStack s)int y;二进制、八进制、十进制、十六进制之间的转换贵州航天职业技术学院计算机科学系if(s.base=s.top) return 0;/*size=sizeof(SELEMTYPE); */y=s.top-s.base;return y;/*LENGTH*/Status Free_stack(SQSTACK s)free(*s).bas
19、e);(*s).top=(*s).base=NULL;return OK;/*FUNCTIONS*/Status Transform(num,sys,s)unsigned long num;int sys;SQSTACK s;unsigned long dividend=num;int divisor=sys,rem;/* int i,*p=NULL,e,length;*/if(!Init_stack(s) exit(0);/*-ALGORITHM-*/doif(dividend=48 printf(“Inupt Error!“);gotoxy(20,15); printf(“Inupt Error!“);gotoxy(20,17); printf(“Inupt Error!“);gotoxy(20,19); printf(“Inupt Error!“);gotoxy(20,22);exit(0);/* if() */for(j=1,pow=1;j1,no-0: “);scanf(“%d“,while(MARK!=0);restorecrtmode();/*main*/