数制转换C数据结构课程设计.doc_第1页
数制转换C数据结构课程设计.doc_第2页
数制转换C数据结构课程设计.doc_第3页
数制转换C数据结构课程设计.doc_第4页
数制转换C数据结构课程设计.doc_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

福建农林大学计算机与信息学院计算机类课程设计报告课程名称:数据结构课程设计课程设计题目:数制转换问题姓 名:xia系:计算机科学与技术专 业:计算机科学与技术年 级:2011级学 号:3116013131指导教师:刘必雄职 称:讲师2011年 12月 24日福建农林大学计算机与信息学院计算机类课程设计结果评定评语:评分项目分值得分综合运用知识能力和实践动手能力强,设计方案合理,计算、分析正确,设计成果质量高;40设计态度认真,独立工作能力强,有独到见解,水平较高,并具有良好的团队协作精神;40设计报告条理清晰、论述充分、文字通顺、图表规范课程设计报告符合规范要求。20成绩:指导教师签字:任务下达日期:评定日期:- 16 -目 录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(r9)r=r+55;push(s,r); /压入栈a=a/b; /转换成b进制printf(t该数进制的结果是:,b);while(!isempty(s)pop(s,e); /弹出栈if(e=65)printf(%c,e);elseprintf(%d,e);if(i)/有小数printf(.);/小数点for(i=0;i=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该数进制的结果是:);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输入有误,请重新输入:);elsef=0;printf(t请输入该数:);second:scanf(%s,c);n=strlen(c);f=0; /判断标识for(i=0;i49|ci55|ci57|ci70|(ci57&ci65)|ci46|ci=47)f=1;break;default:break;/有错f=1;if(f)/检查输入格式是否有误printf(t输入有误,请重新输入:);goto second; if(m!=10)/其他进制转换成十进制j=0;for(i=0;in;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;i49|ci55|ci57|ci70|(ci57&ci65)|ci46|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;in;i+)printf(%x,zzi); /用%x逐个输出即为输出相应进制转换后的数void mtod()/其他进制转换为十进制的函数 printf(t该数进制的结果是:);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;in;i+)if(ci=.) j=n-1-i;4.5 测试结果l 键盘输入输出结果: 整数转换测试 小数转换测试 输入出错测试l 文本输入输出结果: /ds1.in 整数转换测试ds1.inds1.out2110118765110111164a30=数制转换器= -实现 2 8 10 16 进制数据之间的转换-| | 先输入未转换前数的数制类型 | 再输入未转换的数 | | 程序将输出该数的其他进制形式 | | -=-请输入未转换前数的进制:请输入该数:该数进制的结果是:13 该数进制的结果是:15该数进制的结果是:d -=-是否继续? 继续【1】or 退出【0】:请输入未转换前数的进制:请输入该数:该数进制的结果是:501 该数进制的结果是:111110101该数进制的结果是:1f5 -=-是否继续? 继续【1】or 退出【0】:请输入未转换前数的进制:请输入该数:该数进制的结果是:1011该数进制的结果是:13该数进制的结果是:b -=-是否继续? 继续【1】or 退出【0】:请输入未转换前数的进制:请输入该数:该数进制的结果是:1187 该数进制的结果是:10010100011该数进制的结果是:2243 -=-是否继续? 继续【1】or 退出【0】: /ds2.in 小数转换测试ds2.inds2.out21101.101118765.211011.1251164a3.20=数制转换器= -实现 2 8 10 16 进制数据之间的转换-| | 先输入未转换前数的数制类型 | 再输入未转换的数 | | 程序将输出该数的其他进制形式 | | -=-请输入未转换前数的进制:请输入该数:该数进制的结果是:13.687500 该数进制的结果是:15.54该数进制的结果是:d.b -=-是否继续? 继续【1】or 退出【0】:请输入未转换前数的进制:请输入该数:该数进制的结果是:501.250000 该数进制的结果是:111110101.01该数进制的结果是:1f5.4 -=-是否继续? 继续【1】or 退出【0】:请输入未转换前数的进制:请输入该数:该数进制的结果是:1011.001该数进制的结果是:13.1该数进制的结果是:b.2 -=-是否继续? 继续【1】or 退出【0】:请输入未转换前数的进制:请输入该数:该数进制的结果是:1187.125000 该数进制的结果是:10010100011.001该数进制的结果是:2243.1 -=-是否继续? 继续【1】or 退出【0】: /ds3.in 输入出错测试ds3.inds3.out92b1211018z.286711011.awd90.2511689ga6.50=数制转换器= -实现 2 8 10 16 进制数据之间的转换-| | 先输入未转换前数的数制类型 | 再输入未转换的数 | | 程序将输出该数的其他进制形式 | | -=-请输入未转换前数的进制:输入有误,请重新输入:请输入该数:输入有误,请重新输入:输入有误,请重新输入:该数进制的结果是:6 该数进制的结果是:6该数进制的结果是:6 -=-是否继续? 继续【1】or 退出【0】:请输入未转换前数的进制:请输入该数:输入有误,请重新输入:输入有误,请重新输入:该数进制的结果是:55 该数进制的结果是:110111该数进制的结果是:37 -=-是否继续? 继续【1】or 退出【0】:请输入未转换前数的进制:请输入该数:输入有误,请重新输入:输入有误,请重新输入:该数进制的结果是:1011010.01该数进制的结果是:132.2该数进制的结果是:5a.4 -=-是否继续? 继续【1】or 退出【0】:请输入未转换前数的进制:请输入该数:输入有误,请重新输入:该数进制的结果是:166.312500 该数进制的结果是:10100110.0101该数进制的结果是:246.24 -=-是否继续? 继续【1】or 退出【0】:4.6 用户使用说明 第一次输入:未转换前数的进制

温馨提示

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

评论

0/150

提交评论