欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOC文档下载  

    数制转换 C 数据结构课程设计.doc

    • 资源ID:2385357       资源大小:220.50KB        全文页数:17页
    • 资源格式: DOC        下载积分:8金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要8金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    数制转换 C 数据结构课程设计.doc

    福建农林大学计算机与信息学院计算机类课程设计报告课程名称:数据结构课程设计课程设计题目:数制转换问题姓 名:XIA系:计算机科学与技术专 业:计算机科学与技术年 级:2011级学 号:3116013131指导教师:刘必雄职 称:讲师2011年 12月 24日福建农林大学计算机与信息学院计算机类课程设计结果评定评语:评分项目分值得分综合运用知识能力和实践动手能力强,设计方案合理,计算、分析正确,设计成果质量高;40设计态度认真,独立工作能力强,有独到见解,水平较高,并具有良好的团队协作精神;40设计报告条理清晰、论述充分、文字通顺、图表规范课程设计报告符合规范要求。20成绩:指导教师签字:任务下达日期:评定日期:目 录1.设计目的- 1 -2.设计要求- 1 -3.设计方案- 1 -4.设计内容- 1 -4.1需求分析- 1 -4.1.1输入的形式和输入值的范围- 1 -4.1.2输出的形式- 1 -4.1.3程序所能达到的功能- 1 -4.1.4测试数据:- 2 -4.2概要设计- 3 -4.2.1抽象数据类型的定义- 3 -4.2.2主控程序的流程- 3 -4.2.3各程序模块之间的层次关系- 3 -4.3详细设计- 4 -4.3.1流程图- 4 -4.3.2伪代码- 5 -4.4调试分析- 7 -4.5测试结果- 9 -4.5.1键盘输入输出结果- 9 - 整数转换测试- 9 - 小数转换测试- 9 - 输入出错测试- 10 -4.5.2文本输入输出结果- 11 -5.总结- 14 -参考文献- 14 -数制转换问题1. 设计目的实现二、八、十和十六进制不同数制数据之间的相互转换。2. 设计要求 输入一种数的数据及数制,输出这个数的其他三种数制的表示。 输入的数包括整数和小数。 基于vc+6.0平台,用C语言实现程序设计。3. 设计方案用顺序栈实现数据的存入和读取4. 设计内容4.1 需求分析1) 输入的形式和输入值的范围 先输入未转换前数的进制:取值范围只能是2、8、10、16,输入其他数据则提示出错重输。 再输入该进制的数:取值范围可以是原进制的整数或小数,根据提供的原数据的数制,通过ASCII码判断每次输入的各个字符是否正确,如:2进制只能输入1,0和小数点;8进制只能输入0到7的数和小数点;10进制只能输入0到9的数和小数点;16进制只能输入输入0到9的数,A到F的字母和小数点;输入其他字符则提示出错重输。2) 输出的形式 分三行分别输出该数其他进制的表示。3) 程序所能达到的功能 通过键盘输入、文本读取数据,检测输入的数与原进制是否有误; 将输入的数(可以是整数或小数),转换成除本身的进制数外其他3种进制的数并输出; 可以在数据转换后,选择是否退出或继续输入数据进行转换。4) 测试数据:正确的输入及其输出,示例整数:正确的输入及其输出,示例小数:含错误的输入及其输出:4.2 概要设计1) 抽象数据类型的定义typedef structint *b,*top; int size;Stack;Stack S;/定义栈int InitS(Stack &S) /构造空栈int ClearS(Stack &S) /释放栈Sint IsEmpty(Stack S) /判断栈是否为空,若空返回1,否则返回0int Push(Stack &S , int e) /插入元素e为新的栈顶元素int Pop(Stack &S, int &e) /删除S的栈顶元素,用e返回其值char c1000;/c存入未转换的数int e,m,n,r,i,j; /定义全局变量/e为栈顶元素临时变量,m为要转的进制数, n为转换前数的个数/r是十进制转M进制的余数,i为自增变量,j存小数点后有几位小数用 float x,y,z;/定义全局变量/x为要转换的十进制,y是转后的10进制数,z是十进制的小数部分2) 主控程序的流程 首先接收未转换前数的进制m及数据,判断是否非法做出提示; 用c数组接收数据,有小数得记下小数位数j。当接收的数据为十进制则用float(atof(c)转成小数给全局变量x;若接收的数据为其他进制数则逐个读取Push(S,ci)入栈。 根据全局变量m判断要调用的函数:DtoM(float a,int b) 十进制转换成其他进制的函数,MtoD()其他进制转换为十进制的函数。 在DtoM(float,int)函数中,接收形参为要转换的十进制数和要转成的数制。先判断数据是否有小数,有小数则先转换小数部分的存入zz。输出时先输出转换的整数部分,有小数再读取zz逐个输出小数部分。 在MtoD()函数中,由j判断数据是否有小数,若有小数先转换小数部分。输出时将转后的小数部分(若有)累加上整数部分输出。 转换完成后,清除栈,由用户选择是否继续输入数据转换或退出。3) 各程序模块之间的层次关系void DtoM(float a,int b) /十进制转换成其他进制的函数void MtoD()/其他进制转换为十进制的函数void main()/根据输入数据调用MtoD()和DtoM()函数对数据转换注:其他非十进制的数转换时,都先调用MtoD()转成十进制,得到float类型数存入全局变量y,再调用DtoM(y,m)转成需要的进制。4.3 详细设计 流程图:m=16m=8m=10m=2NYYYNN开始m->未转换前数的进制合法c->要转换的数合法switch(m)x=float(atof(c)DtoM(x,2)DtoM(x,8)DtoM(x,16)MtoD()DtoM(y,8)DtoM(y,16)继续退出MtoD()DtoM(y,2)DtoM(y,16)MtoD()DtoM(y,2)DtoM(y,8) 伪代码:/十进制转换成其他进制的函数DtoM()/void DtoM(float a,int b) z=a-(int)a;/取小数部分int zz20;/存转后的小数部分i=0;if(z)/有小数while(z)zzi=int(z*b);i+;z=z*b-int(z*b);n=i;while(int)a)r=(int)a%b;if(r>9)r=r+55;Push(S,r); /压入栈a=a/b; /转换成b进制printf("t该数<%d>进制的结果是:",b);while(!IsEmpty(S)Pop(S,e); /弹出栈if(e>=65)printf("%c",e);elseprintf("%d",e);if(i)/有小数printf(".");/小数点for(i=0;i<n;i+)printf("%X",zzi);printf("n");return;/其他进制转换为十进制的函数MtoD()/void MtoD()i=0;y=0;if(j)/有小数while(j)Pop(S,e);if(e>=65)e=e-55;/转字母else e=e-48;/转数字y+=1/(float)pow(m,j)*e;/1除(e乘(m的j次方))j-;Pop(S,e);/小数点抛出while(!IsEmpty(S)Pop(S,e);if(e>=65)e=e-55;/转字母else e=e-48;/转数字y+=(int)pow(m,i)*e;/e乘(m的i次方)i+;printf("t该数<10>进制的结果是:");if(int)y=y) printf("%.0f n",y); elseprintf("%f n",y);/有小数return;/-主函数main()-/void main()freopen("DS1.in", "r", stdin);freopen("DS1.out", "w", stdout);/界面功能说明printf("n");printf("n");printf("t=数制转换器= n"); printf("n");printf(" -实现 2 8 10 16 进制数据之间的转换-n");printf("t| 先输入未转换前数的数制类型 |n");printf("t| 再输入未转换的数 |n");printf("t| <该数可以是整数或小数> |n");printf("t| 程序将输出该数的其他进制形式 |n");printf("t| |n");printf(" -=");printf("=-n");printf("n");printf("n");First:int f=1;/判断标识InitS(S); /构造一个空栈printf("t请输入未转换前数的进制:");while(f)if(scanf("%d",&m)=EOF|m!=2&&m!=8&&m!=10&&m!=16)printf("t输入有误,请重新输入<2 or 8 or 10 or 16>:");elsef=0;printf("t请输入该数:");Second:scanf("%s",c);n=strlen(c);f=0; /判断标识for(i=0;i<n;i+)/检查输入格式switch(m)case 2:if(ci>49|ci<46|ci=47)f=1;break;case 8:if(ci>55|ci<46|ci=47)f=1;break;case 10:if(ci>57|ci<46|ci=47)f=1;break;case 16:if(ci>70|(ci>57&&ci<65)|ci<46|ci=47)f=1;break;default:break;/有错f=1;if(f)/检查输入格式是否有误printf("t输入有误,请重新输入:");goto Second; if(m!=10)/其他进制转换成十进制j=0;for(i=0;i<n;i+)Push(S,ci);if(ci='.') j=n-1-i;/存小数位数else/十进制转换成其他进制x=float(atof(c);/字符串转小数printf("n");switch(m)/数制相互转换case 10: DtoM(x,2);DtoM(x,8);DtoM(x,16);break;case 2: MtoD();DtoM(y,8);DtoM(y,16);break;case 8: MtoD();DtoM(y,2);DtoM(y,16);break;case 16: MtoD();DtoM(y,2);DtoM(y,8);break;default:break;ClearS(S);/释放栈Sprintf("n");printf(" -=");printf("=-n");printf("t是否继续? 继续【1】or 退出【0】:");scanf("%d",&f);if(f)printf("n");goto First;4.4 调试分析n 难点:检查输入格式是否有误n 解决:通过ASCII码判断每次输入的各个字符是否正确,如:2进制只能输入1,0和小数点;8进制只能输入0到7的数和小数点;10进制只能输入0到9的数和小数点;16进制只能输入0到9的数,A到F的字母和小数点;用f判断标识,输入其他字符则将f=1提示出错重输。 n 代码示例:main()f=0;for(i=0;i<n;i+)/检查输入格式是否有误switch(m) case 2:if(ci>49|ci<46|ci=47)f=1;break;case 8: if(ci>55|ci<46|ci=47)f=1;break;case 10:if(ci>57|ci<46|ci=47)f=1;break;case 16:if(ci>70|(ci>57&&ci<65)|ci<46|ci=47) f=1;break;default:break; /有错f=1;n 难点:取未转换十进制的小数部分,并输出转换后的相应的进制格式n 解决:使用强制转换,转义符号 %X、%.0fn 代码示例:void DtoM(float a,int b) /十进制转换成其他进制的函数z=a-(int)a;/ 用强制转换取小数部分int zz10;/存转后的小数部分i=0;if(i)/有小数printf(".");/小数点for(i=0;i<n;i+)printf("%X",zzi); /用%X逐个输出即为输出相应进制转换后的数void MtoD()/其他进制转换为十进制的函数 printf("t该数<10>进制的结果是:");if(int)y=y)printf("%.0f n",y);/小数部分没有有效数字,用%.0f去除小数点后的0elseprintf("%f n",y);/有小数return;n 难点:求输入数据小数点后有几位n 解决:用scanf("%s",c)将输入数存入数组中,用n=strlen(c)得到长度,用j存小数位数:for(i=0;i<n;i+)if(ci='.') j=n-1-i;4.5 测试结果l 键盘输入输出结果: 整数转换测试 小数转换测试 输入出错测试l 文本输入输出结果: /DS1.in 整数转换测试DS1.inDS1.out2110118765110111164A30=数制转换器= -实现 2 8 10 16 进制数据之间的转换-| | 先输入未转换前数的数制类型 | 再输入未转换的数 | <该数可以是整数或小数> | 程序将输出该数的其他进制形式 | | -=-请输入未转换前数的进制:请输入该数:该数<10>进制的结果是:13 该数<8>进制的结果是:15该数<16>进制的结果是:D -=-是否继续? 继续【1】or 退出【0】:请输入未转换前数的进制:请输入该数:该数<10>进制的结果是:501 该数<2>进制的结果是:111110101该数<16>进制的结果是:1F5 -=-是否继续? 继续【1】or 退出【0】:请输入未转换前数的进制:请输入该数:该数<2>进制的结果是:1011该数<8>进制的结果是:13该数<16>进制的结果是:B -=-是否继续? 继续【1】or 退出【0】:请输入未转换前数的进制:请输入该数:该数<10>进制的结果是:1187 该数<2>进制的结果是:10010100011该数<8>进制的结果是:2243 -=-是否继续? 继续【1】or 退出【0】: /DS2.in 小数转换测试DS2.inDS2.out21101.101118765.211011.1251164A3.20=数制转换器= -实现 2 8 10 16 进制数据之间的转换-| | 先输入未转换前数的数制类型 | 再输入未转换的数 | <该数可以是整数或小数> | 程序将输出该数的其他进制形式 | | -=-请输入未转换前数的进制:请输入该数:该数<10>进制的结果是:13.687500 该数<8>进制的结果是:15.54该数<16>进制的结果是:D.B -=-是否继续? 继续【1】or 退出【0】:请输入未转换前数的进制:请输入该数:该数<10>进制的结果是:501.250000 该数<2>进制的结果是:111110101.01该数<16>进制的结果是:1F5.4 -=-是否继续? 继续【1】or 退出【0】:请输入未转换前数的进制:请输入该数:该数<2>进制的结果是:1011.001该数<8>进制的结果是:13.1该数<16>进制的结果是:B.2 -=-是否继续? 继续【1】or 退出【0】:请输入未转换前数的进制:请输入该数:该数<10>进制的结果是:1187.125000 该数<2>进制的结果是:10010100011.001该数<8>进制的结果是:2243.1 -=-是否继续? 继续【1】or 退出【0】: /DS3.in 输入出错测试DS3.inDS3.out92b1211018z.286711011.awd90.2511689GA6.50=数制转换器= -实现 2 8 10 16 进制数据之间的转换-| | 先输入未转换前数的数制类型 | 再输入未转换的数 | <该数可以是整数或小数> | 程序将输出该数的其他进制形式 | | -=-请输入未转换前数的进制:输入有误,请重新输入<2 or 8 or 10 or 16>:请输入该数:输入有误,请重新输入:输入有误,请重新输入:该数<10>进制的结果是:6 该数<8>进制的结果是:6该数<16>进制的结果是:6 -=-是否继续? 继续【1】or 退出【0】:请输入未转换前数的进制:请输入该数:输入有误,请重新输入:输入有误,请重新输入:该数<10>进制的结果是:55 该数<2>进制的结果是:110111该数<16>进制的结果是:37 -=-是否继续? 继续【1】or 退出【0】:请输入未转换前数的进制:请输入该数:输入有误,请重新输入:输入有误,请重新输入:该数<2>进制的结果是:1011010.01该数<8>进制的结果是:132.2该数<16>进制的结果是:5A.4 -=-是否继续? 继续【1】or 退出【0】:请输入未转换前数的进制:请输入该数:输入有误,请重新输入:该数<10>进制的结果是:166.312500 该数<2>进制的结果是:10100110.0101该数<8>进制的结果是:246.24 -=-是否继续? 继续【1】or 退出【0】:4.6 用户使用说明 第一次输入:未转换前数的进制(只能输入2或8或10或16,输入其他数据则提示出错重输) 第二次输入:该进制的数(取值范围应当是原进制的整数或小数。如:2进制只能输入1,0和小数点;8进制只能输入0到7的数和小数点;10进制只能输入0到9的数和小数点;16进制只能输入0到9的数,A到F的字母和小数点;输入其他字符则提示出错重输。) 程序将自动分三行分别输出该数其他进制的表示。【注】:小数转换的算法不是互逆的。输入非十进制(2、8、16进制)的小数可以成功转成其他进制的小数;但不是任意的十进制的小数能完全转成非十进制(2、8、16进制)的小数。程序目前仍然有Bug,对输入十进制的小数的判断还未完成。5. 总结通过本次课程设计,我认识到熟练掌握基础算法的重要性,对栈的含义及其基本算法有了更好的理解和应用。栈“先进后出”的算法加上Push()和Pop() 方便了对要转换的数进行读取,和对转换后数倒置的输出。在编写过程中常遇到的不少问题,例如:变量类型的转换和ASCII码转义字符的应用,变量的定义和范围,算法循环语句的退出条件等,我通过不断调试,翻阅课本和网上搜索材料得到了解决,也认识到这些细节上的处理更当注意。在调试时,学会了在有问题的地方注释并能经常使用printf()函数测试输出结果。在测试时,对测试数据的选取更当考虑全面,能检测错误输入并进行提示。通过这次实验,我学会运用课本和老师平时讲授知识进行切身实践,通过网络搜索学到了新的库函数,提高了我实际编写程序的能力。参考文献1 宁正元,王秀丽.算法与数据结构M.北京:清华大学出版社,2006.01.2 宁正元,王秀丽,林大辉.算法与数据结构习题精解和实验指导M.北京,2007.05.

    注意事项

    本文(数制转换 C 数据结构课程设计.doc)为本站会员(文库蛋蛋多)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开