C语言进制转换课程设计_第1页
C语言进制转换课程设计_第2页
C语言进制转换课程设计_第3页
C语言进制转换课程设计_第4页
C语言进制转换课程设计_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、课 程 设 计进制转换课程设计名称: 数据结构课程设计 专 业 班 级 : 学 生 姓 名 : 学 号 : 指 导 教 师 : 设 计 时 间 : 计算机 专业课程设计任务书学生姓名专业班级学号题目进制转换课题性质A. 工程设计课题来源D自拟课题。指导教师同组姓名无主要内容针对进制转换问题,选择、设计和实现合适的抽象数据类型;进行进制转换分析,给出设计方案。学习掌握并熟练运用C语言进行程序设计;任务要求 这次课程设计不仅提升C语言理论知识,更重要的是能够提高自己的编程能力。这个项目是用来实现进制转换的一些简单功能。实现过程中需要编制函数,依次实现各个功能。也需要学会利用网络或其他工具来查找相关

2、的资料解决问题,每解决一个问题,就会多一份收获,会不断培养自我学习的能力。参考文献1谭浩强.C程序设计(第三版).北京:清华大学出版社.2005:342李建忠.大学计算机基础.西安:西北大学出版社.2005:1043谭浩强.C程序设计题解与上机指导(第三版).北京:清华大学出版社.2005:684罗建军、朱丹军、顾刚.C+程序设计教程(第2版).北京:高等教育出版社.2007:76审查意见指导教师签字:教研室主任签字: 2014年6月15日 目录一、转换概述31、需求分析32、概要设计33.详细设计51.十进制转化为任意进制函数:52.任意进制转化十进制函数:63.程序流程图74.运行环境11

3、5.开发工具和编程语言12二、数学原理13十进制转二进制:13十进制转八进制:13十进制转十六进制:14二进制转十进制:14二进制转八进制:14二进制转十六进制:15八进制转十进制:15八进制转十六进制:16十六进制转二进制:16十六进制转八进制:16三、程序编码17测试结果22参考文献25四、心得体会26一、转换概述1、需求分析 进制数制是人们利用符号进行计数的科学方法。数制有很多种,在计算机中常用的数制有:十进制,二进制、八进制和十六进制。十六进制数有两个基本特点:它由十六个字符09以及A,B,C,D,E,F组成(它们分别表示十进制数015),十六进制数运算规律是逢十六进一。要求: (1)

4、 输入一个十进制数N,将它转换成R进制数输出,并可以进行逆转换。(2) 输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(2<=R<=16, R<>10)。(3) 为每个测试实例输出转换后的数,每个输出占一行。如果R大于10,则对应的数字规则参考16进制(比如,10用A表示,等等)。(4) 界面友好。2、概要设计 数制转换器程序是要求任意两种数间的相互转化,本次课程设计以任意进制间转换为中心实现二进制、八进制、十进制、十六进制、十八进制之间的相互转化。对输入的任意进制的数字进行转换,实现常见进制间的转换以及用户自定义需要转换的目标进制数,这样大大提

5、高了本程序的用途。常见的二进制、八进制、十进制、十六进制、十六进制之间的固定转换,其转换方式大同小异,从低进制数向高进制数转换进行乘数累加,反之则逐步求余,最终进行分布计算得到想要的结果,对以上思想进行扩展,使其不仅仅局限于那些常见进制间的转换,更多的应用到任意进制之间的转换。本次系统程序,主要有两大模块组成,即任意进制转换为十进制、十进制转换为任意进制,这两部分共同组成了对任意进制数的转换的实现,通过菜单选择,让用户实现自己想要的结果,同时也在程序的简洁上有所压减,达到简洁的应用程序实现相对较复杂的功能。最后打印输出结果,清屏执行下次任务。 该程序包括七个子函数模块,其中菜单函数模块定义为整

6、型,其余字符转换函数处理模块都根据函数所需定义数据类型。数制转换器处理系统中用数组来储存处十进制以外的数,将一个指定进制的数,从低到低高一位一位取出,并计算出每位的十进制值,然后乘以其数基的特定幂指数,得出这一位数的十进制值,将所有各位的十进制值相加得出这个数的十进制值,然后再将该十进制数转换为指定数制的数,此过程采用求余法进行,用这个十进制数作为被除数,用指定的数基作除数,连续求余,得出的余数依由个位到十位等的顺序组成新数,即得指定数制的数。(1)逻辑设计如图所示: 图2.1(2) 程序中各函数简单说明见如表1、1函数说明所示:表2.1返回值函数名参数表函数说明intmainvoid主函数v

7、oidint ANY_ten()int x,int num任意进制转换为十进制voidInt ten_ANY()int num,int y十进制转换为任意进制voidten_ANY()num,2十进制转换为二进制voidlist1()num进制转换菜单voidlist2()num主菜单voidANY_ch ()num,num任意进制间的转换3.详细设计1.十进制转化为任意进制函数:十进制整数num转换为任意(x)进制整数采用"除x取余,逆序排列法。具体做法是:用x去除十进制整数,可以得到一个商和余数;再用x去除商,又会得到一个商和余数,如此进行,直到商为一时为止,然后把先得到的余数作

8、为x进制数的低位有效位,后得到的余数作为x进制数的高位有效位,结构图如图3.4所示:int ANY_ten(int x,int num) int i,j=0;int s=0;for(i=1;num!=0;i*=x)if(num%10>(x-1)j=1;break;elses+=(num%10)*i;num=num/10;if(j=1)printf("原数据出错!请重新输入:n");elseprintf("转换为十进制:%dnn",s);return s;2.任意进制转化十进制函数:从最后一位开始算,依次列为第0、1、2.位第n位的数乘以任意进制数y

9、的n次方得到的结果相加结构图如图3.5所示:void ten_ANY(int num,int y)int i;int arr30;for(i=0;i+)arri=num%y;num=num/y;if(num=0)break;printf("转换为 %d 进制:",y);for(;i>=0;i-)switch(arri)case 10 : printf("A");break;case 11 :printf("B");break;case 12 :printf("C");break;case 13 :printf

10、("D");break;case 14 :printf("E");break;case 15 :printf("F");break;case 16 :printf("G");break;case 17 :printf("H");break;case 18 :printf("I");break;case 19 :printf("J");break;default :printf("%d",arri);printf("nn&quo

11、t;);3.程序流程图(1)主函数main()流程图,如图3.1所示:图3.1 main函数流程图(2)主菜单list2()流程图,如图3.2所示:图3.2 list2()函数流程图7(3)常见进制转换菜单list1()函数流程图,如图3.3所示:图3.3常见进制转换菜单list1()函数流程图(4)十进制转换为任意进制函数ten_ANY ()函数流程图,如图3.4所示:图3.4十进制转换为任意进制函数ten_ANY ()函数流程图(5)任意进制转换为十进制函数ANY _ch()函数流程图,如图3.5所示:图3.5任意进制数之间的转换ANY_ch ()函数流程图4.运行环境 软件环境 操作系统

12、:Windows7 硬件环境 处理器:Intel Pentium 166MX 或更高 内存:32MB以上 硬盘空间:1GB以上 显卡:SVGA 显示适配5.开发工具和编程语言 Microsoft visual C+ C语言二、数学原理  实现进制转换需要编个函数(进制转换器),每一函数完成相应进制的转换,下面是各个进制之间转换的数学方法的算法。 十进制转二进制:  十进制数转换成二进制数,是一个连续除2的过程;把要转换的数,除以2,得到商和余数,将商继续除以2,直到商为0.最后将所有余数倒序排列,得到数就是转换结果。 例如: 302/2

13、0;= 151 余0 151/2 = 75 余1  75/2 = 37 余137/2 = 18 余118/2 = 9 余0 9/2 = 4 余14/2 = 2 余02/2 = 1 余0  所以302转换为2进制,结果:100101110  . 十进制转八进制:  十进制

14、数转换成八进制的方法和转换为二进制的方法类似,唯一变化:除数由2变成8。 例如: 120/8=15余0 15/8=1余71/8=0余1 所以120转换为8进制,结果:170.  十进制转十六进制:  十进制数转换成十六进制数的方法和转换为二进制的方法类似,唯一变化:除数由2变成16。 不过,十六进制数:(1015)是用英文大写字母(AF)表示。 例如: 123/16=7余11 所以123转换为16进制,结果:7B.  二进制转十进制:  二进制数转换为十进

15、制数按权展开,第0位的权值是2的0次方,第1位的权值是2的1次方······ 例如: 1010转换成十进制数:第0位:0*20=0 第1位:1*21=2第2位:0*22=0第3位:1*23=8所以1010转换成十进制数,结果:0+2+0+8=10. 二进制转八进制:  利用421,从后往前每三位一组,缺位补0,然后按十进制方法进行转换。 例如: (11001) 001=1 011=3 然后将结果按从下往上顶顺序书写:31. 二

16、进制转十六进制:  二进制和十六进制的互相转换比较重要。不过这二者的转换却不用计算;利用8421,对于任意一个4位的二进制数,都可以很快算出它对应的10进制值。 例如: 1111=8+4+2+1=15  又因为十六进制数:1015用大写字母AF表示,所以15为F. 八进制转二进制:    利用421;从后往前每三位一组,缺位处用0填补,然后按十进制方法进行转化; 例如:  1>001  3-à011 然后我们将结果按从下往上的顺序

17、书写就是:11001,那么这个11001就是八进制31的二进制形式。 八进制转十进制:  八进制就是逢8进1,八进制数采用 07这八数来表达一个数;八进制数第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+0+320+512=839 .八进制转十六进制:    八进制转换成十六进制:有两种方法:一种是先将八

18、进制转换成二进制,在将二进制转换成十六进制。另一种方法是将八进制转换成十进制,在将十进制转换成十六进制。 十六进制转二进制:  上面已经提到二进制转换成十六进制的方法,记住8421,每一位的权值,所以十六进制转成二进制就是一段四位分别转成二进制。 例如:Fà1111 ,Dà1101,Aà1010,5à0101. 十六进制转八进制:  十六进制转八进制也不能直接转换,需要将十六进制转换成十进制或者二进制,才能由十进制或者二进制转换成八进制。 十六进制转十进制:  16进制就是逢

19、16进1,但我们只有09这十个数字,所以我们用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

20、*160=5第1位:F*161=240 第2位:A*163=2560 第3位:2*164=8192 所以转换 成十进制数为:10997.11三、程序编码#include<stdio.h>#include<stdlib.h>#include<string.h>list2();int ANY_ten(int x,int num) int i,j=0;int s=0;for(i=1;num!=0;i*=x)if(num%10>(x-1)j=1;break;elses+=(num%10)*i;num=num/10;if(

21、j=1)printf("原数据出错!请重新输入:n");elseprintf("转换为十进制:%dnn",s);return s;void ten_ANY(int num,int y)int i;int arr30;for(i=0;i+)arri=num%y;num=num/y;if(num=0)break;printf("转换为 %d 进制:",y);for(;i>=0;i-)switch(arri)case 10 : printf("A");break;case 11 :printf("B&qu

22、ot;);break;case 12 :printf("C");break;case 13 :printf("D");break;case 14 :printf("E");break;case 15 :printf("F");break;case 16 :printf("G");break;case 17 :printf("H");break;case 18 :printf("I");break;case 19 :printf("J")

23、;break;default :printf("%d",arri);printf("nn");void list1()int i,a,m,num;char ch100;FILE *f;dogetchar();system("cls");printf(" *n");printf(" * *n");printf(" * 数制转换器 *n");printf(" * *n");printf(" * 1 - 十进制转二进制 *n");printf

24、(" * 2 - 十进制转八进制 *n");printf(" * 3 - 十进制转十六进制 *n");printf(" * 4 - 二进制转十进制 *n");printf(" * 5 - 八进制转十进制 *n");printf(" * 6 - 十六进制转十进制 *n");printf(" * 7 - 二进制转八进制 *n");printf(" * 8 - 二进制转十六进制 *n");printf(" * 0 - 返回 *n");prin

25、tf(" * * *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(chi,f);

26、fclose(f); for(i=0;i<(int)strlen(ch);i+) if(int)(chi)>=48&&(int)(chi)<=57|(chi)>='A'&&(int)(chi)<='J') continue; else printf("输入有误! 请输入数字: ");goto st;break; f=fopen("num.txt","r"); fscanf(f,"%d",&num); /读出文件nu

27、m.txt中权值 fclose(f); switch(a) case 0 : list2();break;/*返回上一层*/ case 1 : ten_ANY(num,2); break; /*十进制转二进制*/ case 2 : ten_ANY(num,8); break; /*十进制转八进制*/ case 3 : ten_ANY(num,16); break; /*十进制转十六进制*/ case 4 : ANY_ten(2,num); break; /*二进制转十进制*/ case 5 : ANY_ten(8,num); break; /*八进制转十进制*/ case 6 : ANY_te

28、n(16,num); break; /*十六进制转十进制*/ case 7 : m=ANY_ten(2,num);ten_ANY(m,8); break;/*二进制转八进制*/ case 8 : m=ANY_ten(2,num);ten_ANY(m,16);break; /*二进制转十六进制*/ default : printf("您的输入有误,请重新选择!n");goto loop;break; getchar();while(a>0);void ANY_ch()int a,m,x,y,num;printf("请输入进制数: ");scanf(&

29、quot;%d",&x);printf("输入该 %d 进制数:",x);scanf("%d",&num);m=ANY_ten(x,num);printf(" 是否将当前十进制数进一步转换: 1.是 2.否n"); printf(" 请选择: ");loop2:scanf("%d",&a); switch(a) case 1:printf("转换的目标进制数为: "); scanf("%d",&y); ten_AN

30、Y(m,y);break; case 2:printf("t转换结束!");break; default:printf("选择有误! 请重选: ");goto loop2;break; getchar();int list2()int b;doprintf(" *n");printf(" * 二十进制内任意进制转换! *n");printf(" *n");printf("tt按Enter进入主菜单!");getchar();system("cls");pr

31、intf(" *n");printf(" * 【主菜单】 *n");printf(" * *n");printf(" * 模式选择 *n");printf(" * *n");printf(" * 1 - 常见进制转换 *n");printf(" * 2 - 自定义进制数转换 *n");printf(" * 0 - 退出 *n");printf(" * *n");printf(" *n");loop

32、1:printf(" 请选择要执行的模式: "); scanf("%d",&b); switch(b) case 1: list1();break; /*常见进制转换菜单*/ case 2: ANY_ch();break; /*任意进制数之间转换*/ case 0: exit(0);break; default: printf("n您的输入有误,请重新选择!nn");goto loop1;break; getchar();while(b>0);return 0;void main()list2();测试结果按Enter键

33、进入主菜单,如图3.1所示:图3.1十进制转换为二进制选择1,进入常见进制转换菜单,如图3.2所示:图3.2十进制转换为二进制选择1,十进制转换为二进制函数,输入12,结果如图3.3所示:图3.3十进制转换为二进制选择2,十进制转换为八进制函数,输入20,结果如图3.4所示:图3.4十进制转换为八进制选择3,十进制转换为十六进制函数,输入30,结果如图3.5所示:图3.5十进制转换为十六进制选择4,二进制转换为十进制函数,输入131,结果如图3.6所示:图3.6二进制转换为十进制选择4,二进制转换为十进制函数,输入111,结果如图3.7所示:图3.7二进制转换为十进制选择5,八进制转换为十进制函数,输入171,结果如图3.8所示:图3.8八进制转换为十进制选择6,十六进制转换为十进制函数,输入19AF,结果如图3.9所示:图3.9十六进制转换为十进制选择7,二进制转换为八进制函数,输入1101,结果如图3.10

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论