收藏 分销(赏)

c数制转换课程设计报告.docx

上传人:鼓*** 文档编号:9623370 上传时间:2025-04-01 格式:DOCX 页数:26 大小:321.04KB 下载积分:8 金币
下载 相关 举报
c数制转换课程设计报告.docx_第1页
第1页 / 共26页
c数制转换课程设计报告.docx_第2页
第2页 / 共26页


点击查看更多>>
资源描述
计算机学院《高级语言程序设计》课程设计报告 学号 1608220203 2016-2017学年 第二学期 《C语言程序设计》 课程设计报告 题目: 数制转换 专业: 网络工程(对口) 班级: 16网工(3)班 姓名: 代应豪 指导教师: 程庆 成绩: 计算机学院 2017 年 4月 25日 目录 一、转换概述 2 1、需求分析 2 2、概要设计 2 3.详细设计 4 1.十进制转化为任意进制函数: 4 2.任意进制转化十进制函数: 5 3.程序流程图 6 4.运行环境 11 5.开发工具和编程语言 12 二、数学原理 13 十进制转二进制: 13 十进制转八进制: 13 十进制转十六进制: 14 二进制转十进制: 14 二进制转八进制: 14 二进制转十六进制: 15 八进制转十进制: 15 八进制转十六进制: 16 十六进制转二进制: 16 十六进制转八进制: 16 三、附:源代码 17 测试结果 22 参考文献 25 四、小结 26 致谢 26 一、转换概述 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 int ANY_ten() int x,int num 任意进制转换为十进制 void Int ten_ANY() int num,int y 十进制转换为任意进制 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所示: 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; } else { s+=(num%10)*i; num=num/10; } } if(j==1) printf("原数据出错!请重新输入:\n"); else printf("转换为十进制:%d\n\n",s); return s; } 2.任意进制转化十进制函数: 从最后一位开始算,依次列为第0、1、2...位第n位的数乘以任意进制数y的n次方得到的结果相加结构图如图3.5所示: void ten_ANY(int num,int y) { int i; int arr[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]) { case 10 : printf("A");break; case 11 :printf("B");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");break; default :printf("%d",arr[i]); } } printf("\n\n"); } 3.程序流程图 (1)主函数main()流程图,如图3.1所示: 图3.1 main函数流程图 (2)主菜单list2()流程图,如图3.2所示: 图3.2 list2()函数流程图 6 (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.运行环境 软件环境 操作系统:Windows7 硬件环境 处理器:Intel Pentium 166MX 或更高 内存:32MB以上 硬盘空间:1GB以上 显卡:SVGA 显示适配 5.开发工具和编程语言 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*2^0=0  第1位:1*2^1=2 第2位:0*2^2=0 第3位:1*2^3=8 所以1010转换成十进制数,结果:0+2+0+8=10.  二进制转八进制:  利用421,从后往前每三位一组,缺位补0,然后按十进制方法进行转换。 例如: (11001) 001=1 011=3  然后将结果按从下往上顶顺序书写:31.  二进制转十六进制:  二进制和十六进制的互相转换比较重要。不过这二者的转换却不用计算;利用8421,对于任意一个4位的二进制数,都可以很快算出它对应的10进制值。 例如:  1111=8+4+2+1=15   又因为十六进制数:10~15用大写字母A~F表示,所以15为F.  八进制转二进制:     利用421;从后往前每三位一组,缺位处用0填补,然后按十进制方法进行转化;  例如:  1—>001  3-à011  然后我们将结果按从下往上的顺序书写就是:11001,那么这个11001就是八进制31的二进制形式。  八进制转十进制:  八进制就是逢8进1,八进制数采用 0~7这八数来表达一个数;八进制数第0位的权值为8的0次方,第1位权值为8的1次方,第2位权值为8的2次方…… 例如:  1507转换成十进制数: 第0位:7*8^0=7 第1位:0*8^1=0  第2位:5*8^2=320  第3位:1*8^3=512  所以换算成十进制:7+0+320+512=839 . 八进制转十六进制:    八进制转换成十六进制:有两种方法:一种是先将八进制转换成二进制,在将二进制转换成十六进制。另一种方法是将八进制转换成十进制,在将十进制转换成十六进制。  十六进制转二进制:  上面已经提到二进制转换成十六进制的方法,记住8421,每一位的权值,所以十六进制转成二进制就是一段四位分别转成二进制。  例如:Fà1111 ,Dà1101,Aà1010,5à0101.  十六进制转八进制:  十六进制转八进制也不能直接转换,需要将十六进制转换成十进制或者二进制,才能由十进制或者二进制转换成八进制。  十六进制转十进制:  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*16^0=5 第1位:F*16^1=240  第2位:A*16^3=2560  第3位:2*16^4=8192  所以转换 成十进制数为:10997. 26 三、附:源代码 #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; } else { s+=(num%10)*i; num=num/10; } } if(j==1) printf("原数据出错!请重新输入:\n"); else printf("转换为十进制:%d\n\n",s); return s; } void ten_ANY(int num,int y) { int i; int arr[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]) { case 10 : printf("A");break; case 11 :printf("B");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");break; default :printf("%d",arr[i]); } } printf("\n\n"); } void list1() { int i,a,m,num; char ch[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("输入有误! 请输入数字: ");goto st;break; } f=fopen("num.txt","r"); fscanf(f,"%d",&num); //读出文件num.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_ten(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("%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_ANY(m,y);break; case 2:printf("\t转换结束!");break; default:printf("选择有误! 请重选: ");goto loop2;break; } getchar(); } int list2() { int b; 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) { case 1: list1();break; /*常见进制转换菜单*/ case 2: ANY_ch();break; /*任意进制数之间转换*/ case 0: exit(0);break; default: printf("\n您的输入有误,请重新选择!\n\n");goto loop1;break; } getchar(); }while(b>0); return 0; } void main() { list2(); } 测试结果 按Enter键进入主菜单,如图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所示: 图3.10十六进制转换为十进制 选择8,二进制转换为十六进制函数,输入11111,结果如图3.11所示: 图3.11二进制转换为十六进制 选择0,返回主菜单如图3.12所示: 图3.12返回主菜单 选择2,自定义进制转换,输入进制数为2,数字为110101,选择1.是,结果如图3.13所示: 图3.13自定义进制转换 参考文献 [1]谭浩强.C程序设计(第三版).北京:清华大学出版社.2005:34 [2]李建忠.大学计算机基础.西安:西北大学出版社.2005:104 [3]谭浩强.C程序设计题解与上机指导(第三版).北京:清华大学出版社.2005:68 [4]罗建军、朱丹军、顾刚.C++程序设计教程(第2版).北京:高等教育出版社.2007:76 四、小结 本次课程设计,完成的数制转换器系统实现了二进制、八进制、十六进制和十进制之间相互转换等功能,同时也实现了二十进制内任意进制之间的转化功能。并且加入了对输入数字的判定是否符合要求,对输入不合法字符检验并提示的功能。当输入的数字太大而无法实现转化时,主要是因为数字超过了定义的长度,无法实现两个数制转化。除此之外本程序不能实现小数的转化等问题。我希望以后可以实现上述两个问题,首先是改进程序,使其能实现小数的转化,其次改进定义的长度问题,使其能够转化更大的数。 这次课程设计使我对C语言知识进行了系统的、有条理的复习,对许多知识点都加强了记忆。通过本次数据结构课程设计,我进一步学习了用C语言设计代码的思想,并把它运用到实际操作中。C语言是工具,数据结构是思想,把两者结合起来,熟练运用,才能设计出符合要求的算法。设计过程中,我也遇到很多麻烦,并通过翻阅资料、询问同学来解决。在这个过程中,我知道了与他人合作的重要性,学会了与他人合作。以后,我会更认真的学习C语言,不断提高自己的编程水平。 致谢 在这次C语言课程设计中,我的老师和同学给了我及大的帮助。特别是我的指导老师熊茜老师,还有我的C语言任课老师金尚柱老师。在此,我对他们表示感谢!感谢他们在我面对困难时给了我帮助和支持。也感谢那些给我帮助的所有同学!
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 考试专区 > 中考

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服