




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
/课程设计进制转换课程设计名称:数据结构课程设计专业班级:学生姓名:学号:指导教师:设计时间:计算机专业课程设计任务书学生姓名专业班级学号题目进制转换课题性质工程设计课题来源D.自拟课题。指导教师同组姓名无主要内容针对进制转换问题.选择、设计和实现合适的抽象数据类型;进行进制转换分析.给出设计方案。学习掌握并熟练运用C语言进行程序设计;任务要求这次课程设计不仅提升C语言理论知识.更重要的是能够提高自己的编程能力。这个项目是用来实现进制转换的一些简单功能。实现过程中需要编制函数.依次实现各个功能。也需要学会利用网络或其他工具来查找相关的资料解决问题.每解决一个问题.就会多一份收获.会不断培养自我学习的能力。参考文献[1]谭浩强.C程序设计〔第三版.北京:清华大学出版社.2005:34[2]李建忠.大学计算机基础.XX:西北大学出版社.2005:104[3]谭浩强.C程序设计题解与上机指导〔第三版.北京:清华大学出版社.2005:68[4]罗建军、朱丹军、顾刚.C++程序设计教程〔第2版.北京:高等教育出版社.2007:76审查意见指导教师签字:教研室主任签字:20XX6月15日目录HYPERLINK一、转换概述3HYPERLINK1、需求分析3HYPERLINK2、概要设计3HYPERLINK3.详细设计5HYPERLINK1.十进制转化为任意进制函数:5HYPERLINK2.任意进制转化十进制函数:6HYPERLINK3.程序流程图7HYPERLINK4.运行环境11HYPERLINK5.开发工具和编程语言12HYPERLINK二、数学原理13HYPERLINK十进制转二进制:13HYPERLINK十进制转八进制:13HYPERLINK十进制转十六进制:14HYPERLINK二进制转十进制:14HYPERLINK二进制转八进制:14HYPERLINK二进制转十六进制:15HYPERLINK八进制转十进制:15HYPERLINK八进制转十六进制:16HYPERLINK十六进制转二进制:16HYPERLINK十六进制转八进制:16HYPERLINK三、程序编码17HYPERLINK测试结果22HYPERLINK参考文献25HYPERLINK四、心得体会26一、转换概述1、需求分析进制数制是人们利用符号进行计数的科学方法。数制有很多种.在计算机中常用的数制有:十进制.二进制、八进制和十六进制。十六进制数有两个基本特点:它由十六个字符0~9以及A.B.C.D.E.F组成〔它们分别表示十进制数0~15.十六进制数运算规律是逢十六进一。要求:输入一个十进制数N.将它转换成R进制数输出.并可以进行逆转换。输入数据包含多个测试实例.每个测试实例包含两个整数N<32位整数>和R〔2<=R<=16,R<>10。为每个测试实例输出转换后的数.每个输出占一行。如果R大于10.则对应的数字规则参考16进制〔比如.10用A表示.等等。界面友好。2、概要设计数制转换器程序是要求任意两种数间的相互转化.本次课程设计以任意进制间转换为中心实现二进制、八进制、十进制、十六进制、十八进制之间的相互转化。对输入的任意进制的数字进行转换.实现常见进制间的转换以及用户自定义需要转换的目标进制数.这样大大提高了本程序的用途。常见的二进制、八进制、十进制、十六进制、十六进制之间的固定转换.其转换方式XX小异.从低进制数向高进制数转换进行乘数累加.反之则逐步求余.最终进行分布计算得到想要的结果.对以上思想进行扩展.使其不仅仅局限于那些常见进制间的转换.更多的应用到任意进制之间的转换。本次系统程序.主要有两大模块组成.即任意进制转换为十进制、十进制转换为任意进制.这两部分共同组成了对任意进制数的转换的实现.通过菜单选择.让用户实现自己想要的结果.同时也在程序的简洁上有所压减.达到简洁的应用程序实现相对较复杂的功能。最后打印输出结果.清屏执行下次任务。该程序包括七个子函数模块.其中菜单函数模块定义为整型.其余字符转换函数处理模块都根据函数所需定义数据类型。数制转换器处理系统中用数组来储存处十进制以外的数.将一个指定进制的数.从低到低高一位一位取出.并计算出每位的十进制值.然后乘以其数基的特定幂指数.得出这一位数的十进制值.将所有各位的十进制值相加得出这个数的十进制值.然后再将该十进制数转换为指定数制的数.此过程采用求余法进行.用这个十进制数作为被除数.用指定的数基作除数.连续求余.得出的余数依由个位到十位等的顺序组成新数.即得指定数制的数。〔1逻辑设计如图所示:图2.1程序中各函数简单说明见如表1、1函数说明所示:表2.1返回值函数名参数表函数说明intmainvoid主函数voidintANY_ten<>intx,intnum任意进制转换为十进制voidIntten_ANY<>intnum,inty十进制转换为任意进制voidten_ANY<>num,2十进制转换为二进制voidlist1<>num进制转换菜单voidlist2<>num主菜单voidANY_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">;elseprintf<"转换为十进制:%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所示:图3.1main函数流程图〔2主菜单list2<>流程图.如图3.2所示:图3.2list2<>函数流程图〔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硬件环境处理器:IntelPentium166MX或更高内存:32MB以上硬盘空间:1GB以上显卡:SVGA显示适配5.开发工具和编程语言MicrosoftvisualC++C语言二、数学原理实现进制转换需要编个函数〔进制转换器.每一函数完成相应进制的转换.下面是各个进制之间转换的数学方法的算法。十进制转二进制:十进制数转换成二进制数.是一个连续除2的过程;把要转换的数.除以2.得到商和余数.将商继续除以2.直到商为0.最后将所有余数倒序排列.得到数就是转换结果。例如:302/2=151余0151/2=75余175/2=37余137/2=18余118/2=9余09/2=4余14/2=2余02/2=1余0所以302转换为2进制.结果:100101110.十进制转八进制:十进制数转换成八进制的方法和转换为二进制的方法类似.唯一变化:除数由2变成8。例如:120/8=15余015/8=1余71/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.然后按十进制方法进行转换。例如:〔11001001=1011=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*8^0=7第1位:0*8^1=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*16^0=5第1位:F*16^1=240第2位:A*16^3=2560第3位:2*16^4=8192所以转换成十进制数为:10997.三、程序编码#include<stdio.h>#include<stdlib.h>#include<string.h>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">;elseprintf<"转换为十进制:%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;elseprintf<"输入有误!请输入数字:">;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<>;}测试结果按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八进制转
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年合肥货物运输从业资格考试答题模板
- 2025年河源货运从业资格证模拟考试下载安装
- 沉箱盖板施工方案
- 工程管护移交协议书(2篇)
- 2024年农艺师考试全面检查试题及答案
- 框架协议合同变更
- 消防安装协议合同
- 鱼池买卖协议合同
- 风景在线协议合同
- 搅拌机租赁合同协议
- 2024年大学生电子版三方协议书模板
- 中小学生航天知识竞赛题库及答案(215题)
- 2024年高等教育法学类自考-00249国际私法考试近5年真题附答案
- DB13-T 5996-2024 公路基层病害聚合物注浆处治技术规程
- 食品安全规章制度目录清单
- 外研版(2021)中职英语基础模块1 Unit 8 Enjoy the Festivals Listening&Speaking 教案
- 中广核招聘笔试题库2024
- 2024年汽车驾驶员(技师)职业鉴定理论考试题库(含答案)
- GB/T 15568-2024通用型片状模塑料(SMC)
- TGDEIA-PET转移膜团体标准
- 08J933-1体育场地与设施(一)
评论
0/150
提交评论