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

上传人:仙*** 文档编号:28101362 上传时间:2021-08-23 格式:DOC 页数:19 大小:248.63KB
返回 下载 相关 举报
数制转换 C 数据结构课程设计_第1页
第1页 / 共19页
数制转换 C 数据结构课程设计_第2页
第2页 / 共19页
数制转换 C 数据结构课程设计_第3页
第3页 / 共19页
点击查看更多>>
资源描述
福建农林大学计算机与信息学院计算机类课程设计报告课程名称:数据结构课程设计课程设计题目:数制转换问题姓 名: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 用户使用说明 第一次输入:未转换前数的进制(只能输入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.
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸下载 > CAD图纸下载


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!