1、1专业基础综合课程设计设 计 说 明 书进制转换的实现学 生 姓 名 赵 玲学 号 1018033008班 级 计 专 101 班成 绩指 导 教 师 余 冬 梅数学与计算机科学学院2012 年 6 月 29 日2专业基础综合设计 课程设计评阅书题目 进制转换的实现学生姓名 赵玲 学号 1018033008指导教师评语及成绩指导教师签名:年 月 日答辩评语及成绩答辩教师签名:年 月 日教研室意见总成绩:室主任签名:年 月 日3 课程设计任务书20112012 学年第 2 学期专业:计算机科学与技术 学号: 1018033008 姓名: 赵玲 课程设计名称:数据结构课程设计 设计题目: 进制转换
2、的实现 完成期限:自 2012 年 6 月 18 日至 2012 年 6 月 29 日共 2 周设计依据、要求及主要内容(可另加附页):计算机中数据的存储形式是 0,1 代码,也就是以二 进制的形式 进行存储.运用 C 或 VC+结合数据结构等基础知识,按以下要求 编程实现各种进制的转换。任务要求:1)阐述设计思想,画出流程图;2 )能完成用户输入的十进制数转换为二进制、八 进制、十六进制及其他进制数,以及将任意的 进制数转换为十进制的功能; 3)除十进制以外的其他进制间的相互转换功能的实现;4)将用户的输入及要求的结果能对应打印输出;5)应有较好的界面设计, 说明程序测试方法;6)按照格式要
3、求完成课程设计说明书。设计要求:1)问题分析和任务定义:根据设计题目的要求,充分地分析和理解 问题,明确 问题要求做什么?(而不是怎么做?)限制条件是什么?确定问题的输入数据集合。2)逻辑设计:对问题描述中涉及的操作对象定义相应的数据类型,并按照以数据结构为中心的原则划分模块,定义主程序模块和各抽象数据 类型。 逻辑设计的 结果应写出每个抽象数据类型的定义(包括数据结构的描述和每个基本操作的功能说明),各个主要模块的算法,并画出模 块之间的调用关系图;3)详细设计:定义相应的存储结构并写出各函数的伪码算法。在这个过程中,要 综合考虑系统功能,使得系统结构清晰、合理、简单 和易于调试,抽象数据类
4、型的实现尽可能做到数据封装,基本操作的规格说明尽可能明确具体。详细设计 的结果是对数据结构和基本操作做出 进一步的求精,写出数据存 储结构的类型定义,写出函数形式的算法框架;4)程序编码:把详细设计的结果进一步求精为程序设计语言程序。同时加入一些注解和断言,使程序中逻辑概念清楚;5)程序调试与测试:能够熟练掌握调试工具的各种功能, 设计测试 数据确保程序正确。 调试正确后,认真整理源程序及其注释,形成格式和 风格良好的源程序清 单和结果;6)结果分析:程序运行结果包括正确的输入及其输出结果和含有错误的输入及其输出结果。算法的时间、空间复杂性分析;7)编写课程设计报告;以上要求中前三个阶段的任务
5、完成后,先将 设计说明书的草稿交指 导老师面审, 审查合格后方可进入后续阶段的工作。设计工作结束后,经指导老师验收合格后将 设计说明书打印装订,并进行答辩。指导教师(签字): 教研室主任(签字): 批准日期: 年 月 日4 摘要本次课程设计设计了一个任意进制之间转换的软件程序系统,依据对计算机的发展要求,常见的二进制、八进制、十进制及十六进制数也相应得到广泛使用,从最基本十进制向各个转换以及各进制内部转换相对应用较多,随即出现多种进制数,针对此现实,开发本系统,解决任意进制之间的相互转换,系统主要有以下几个模块:任意进制转换为十进制、十进制转换为任意进制以及两者组合实现任意进制间的相互转换。本
6、软件程序系统在 windows 2000/XP 系统下,以 Microsoft Visual C+ 6.0为运行软件环境,采用 C/C+语言进行编写,操作简单明了,实际解决各进制数之间的转换。关键词:二 进 制 ; 进 制 数 ; 任 意 进 制 ; 相 互 转 换5 目 录1 课题描述 72 问题分析和任务定义 .83 逻辑设计 8程序流程图 .93.1 主函数 main() 113.2 主菜单 list2() .113.3 常见进制转换菜单 list1() .123.4 十进制转换为任意进制函数 ten_ANY () 133.5 任意进制转换为十进制函数 ANY _ten() 143.6
7、任意进制转换为任意进制函数 ANY _ch() .154 详细设计 .164.1 任意进制转十进制函数 .164.2 十进制转任意进制函数 .165 程序编码 .186 程序测试和运行结果 23总结 .25参考文献 .256 1 课题描述使 用 计 算 机 的 人 每 时 每 刻 都 在 与 数 打 交 道 , 在 计 算 机 内 部 , 数 是 以 二 进 制 表 示 的 , 而 我 们 习惯 上 使 用 的 是 十 进 制 数 , 所 以 计 算 机 从 我 们 这 里 接 收 到 十 进 制 数 后 , 要 经 过 翻 译 , 把 十 进 制 数 转换 为 二 进 制 数 才 能 进 行
8、 处理,这个过程是由计算机自动完成的。但是对程序员来说,有时需要把十进制数转换为二进制数、十六进制数和 八 进 制 数 , 或 者 把 十 六 进 制 数 转 换 为 十 进 制 数 等 , 这 都 不 是一 件 轻 松 的 工 作 , 为 了 使 这 项 工 作 变 得 轻 松 愉 快 现 在 我 们 用 C 语 言 来 编 写 这 个 程 序 , 该 系 统 能够 根 据 用 户 的 要 求 , 实 现 二 进 制 、 八 进 制 、 十 进 制 、 十 六 进 制 之 间 的 相 互 转 化 , 以 及 任 意 进 制 间的 相 互 转 换 。系 统 开 发 基 于 Windows200
9、0/Xp 平 台 , 以 Visual C+6.0 等 作 为 开 发 工 具 。7 2 问题分析和任务定义数 制 转 换 器 程 序 是 要 求 任 意 两 种 数 间 的 相 互 转 化 , 本 次 课 程 设 计 以 任 意 进 制 间 转 换 为 中 心 实现 二 进 制 、 八 进 制 、 十 进 制 、 十 六 进 制 、 十 八 进 制 之 间 的 相 互 转 化 。对 输 入 的 任 意 进 制 的 数 字 进 行 转 换 , 实 现 常 见 进 制 间 的 转 换 以 及 用 户 自 定 义 需 要 转 换 的 目 标进 制 数 , 这 样 大 大 提 高 了 本 程 序 的
10、 用 途 。 常 见 的 二 进 制 、 八 进 制 、 十 进 制 、 十 六 进 制 、 十 六 进 制之 间 的 固 定 转 换 , 其 转 黄 方 式 大 同 小 异 , 从 低 进 制 数 向 高 进 制 数 转 换 进 行 乘 数 累 加 , 反 之 则 逐 步求 余 , 最 终 进 行 分 布 计 算 得 到 想 要 的 结 果 , 对 以 上 思 想 进 行 扩 展 , 使 其 不 仅 仅 局 限 于 那 些 常 见 进制 间 的 转 换 , 更 多 的 应 用 到 任 意 进 制 之 间 的 转 换 。本 次 系 统 程 序 , 主 要 有 两 大 模 块 组 成 , 即 任
11、 意 进 制 转 换 为 十 进 制 、 十 进 制 转 换 为 任 意 进 制 ,这 两 部 分 共 同 组 成 了 对 任 意 进 制 数 的 转 换 的 实 现 , 通 过 菜 单 选 择 , 让 用 户 实 现 自 己 想 要 的 结 果 ,同 时 也 在 程 序 的 简 洁 上 有 所 压 减 , 达 到 简 洁 的 应 用 程 序 实 现 相 对 较 复 杂 的 功 能 。最 后 打 印 输 出 结 果 , 清 屏 执 行 下 次 任 务 。8 3 逻 辑 设 计竖 直 转 换 器 系 统 , 包 括 七 个 子 函 数 模 块 , 其 中 菜 单 函 数 模 块 定 义 为 整
12、型 , 其 余 字 符 转 换 函 数处 理 模 块 都 根 据 函 数 所 需 定 义 数 据 类 型 。 数 制 转 换 器 处 理 系 统 中 用 数 组 来 储 存 处 十 进 制 以 外 的 数 ,将 一 个 指 定 进 制 的 数 , 从 低 到 低 高 一 位 一 位 取 出 , 并 计 算 出 每 位 的 十 进 制 值 , 然 后 乘 以 其 数 基 的特 定 幂 指 数 , 得 出 这 一 位 数 的 十 进 制 值 , 将 所 有 各 位 的 十 进 制 值 相 加 得 出 这 个 数 的 十 进 制 值 , 然后 再 将 该 十 进 制 数 转 换 为 指 定 数 制
13、的 数 , 此 过 程 采 用 求 余 法 进 行 , 用 这 个 十 进 制 数 作 为 被 除 数 ,用 指 定 的 数 基 作 除 数 , 连 续 求 余 , 得 出 的 余 数 依 次 由 个 位 到 十 位 等 的 顺 序 组 成 新 数 , 即 得 指 定 数制 的 数 。逻 辑 设 计 如 图 所 示 。 图 3.1 系统模块图9 图 系统模块图开始主菜单判断调用程序退出程序自定义进制转换常见进制转换二进制转十六进制二进制转八进制十进制转十六进制十进制转二进制 十六进制转十进制 八进制转十进制返回主菜单十进制转八进制二进制转十进制 结束10 程序流程图3,1 主 函 数 main
14、()该功能设计思想是:调用一个函数 list2()实现该模块功能。流 程 图 如 图 4.1 所 示 :开始结束调用函数 l i s t 2 ( )图 4.1 main()函数流程图3.2 主 菜 单 list2()该功能设计思想是:为了打印出可供客户选择的主菜单,以及客户自主选择模式,运用了 do-while 语句及 switch 语句,最终实现该模块功能流 程 图 如 图 4.2 所 示 :开始定义整形 b打印主菜单 ;输入 b ;b = 1调用函 l i s t 1 ( ) ;b r e a k ;b = 2b = 0调用函 A N Y _ c h ( ) ;b r e a k ;E x
15、 i t ( 0 ) ,b r e a k ;打印提示用语g e t c h a r ( )b 0NNNYYYYN结束图 4.2 list2()函数流程图11 3.3 常 见 进 制 转 换 菜 单 list1()该功能设计思想是:打印出几种常见的进制之间固定转换的菜单,客户从中自主选择模式,该模块运用了 for , if-else 语句,switch 语句以及 do-while 语句等。函 数 流 程 图 如 图 4.3 所 示:开始定义整型i , a , m , n u mg e t c h a r ( )a ! = 0 i + + ;f c l o s e ( ) ;i = 0输出 a
16、r r i 的值b r e a k ;i - -输出 a r r i + 5 5 的值输出提示信息n u m = = 0i + +a r r i = 1 0换行NYYNN YYN结束图 4.4 十进制转换为任意进制函数 ten_ANY ()函数流程图13 3.5 任 意 进 制 转 换 为 十 进 制 函 数 ANY _ten()该功能设计思想是:模 块 运 用 for 语 句 及 if-else 语 句 , 最 终 实 现 任 意 进 制 数 转 化 成 十 进 制 的功 能 , 。函 数 流 程 图 , 如 图 4.5 所 示 :定义整形变量 i , j = 0i = 1n u m ! =
17、 0n u m % 1 0 ( x - 1 )j = 1 ;b r e a k ;i * = xs + = ( n u m % 1 0 ) * i打印提示用语j = = 1返回 s 的值输出十进制的值NYNYNY开始结束图 4.5 任意进制转换为十进制函数 ANY_ten ()函数流程图14 3.6 任 意 进 制 转 换 为 任 意 进 制 函 数 ANY _ch()该功能设计思想是:调用 ANY-ten(),将输入的进制数转化成十进制,在选择是否继续转化,若是,则运用 swich 语句将目标进制数输出。函 数 流 程 图 , 如 图 4.6 所 示 :定义整形变量a , m , x , y
18、 , n u ma = 1输出转换的目标进制数b r e a k ;a = 2输出提示用语b r e a k ;输出提示用语b r e a k ;g e t c h a r ( ) ;NNYY开始结束图 4.6 任意进制数之间的转换 ANY_ch()函数流程图15 4 详细设计4.1 任意进制转十进制函数十 进 制 整 数 num 转 换 为 任 意 ( x) 进 制 整 数 采 用 “除 x 取 余 , 逆 序 排 列 法 。 具 体 做 法 是 : 用x 去 除 十 进 制 整 数 , 可 以 得 到 一 个 商 和 余 数 ; 再 用 x 去 除 商 , 又 会 得 到 一 个 商 和
19、余 数 , 如 此 进 行 ,直 到 商 为 一 时 为 止 , 然 后 把 先 得 到 的 余 数 作 为 x 进 制 数 的 低 位 有 效 位 , 后 得 到 的 余 数 作 为 x 进制 数 的 高 位 有 效 位 。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;elses+=(num%10)*i;num=num/10;if(j=1)printf(“原数据出错!请重新输入:n“);elseprintf(“转换为十进制:%dnn“,s);return s;4
20、.2 十进制转任意进制函数从 最 后 一 位 开 始 算 , 依 次 列 为 第 0、 1、 2.位 第 n 位 的 数 乘 以 任 意 进 制 数 y 的 n 次 方 得 到的 结 果 相 加 。void ten_ANY(int num,int y)int i;int arr30;for(i=0;i+)16 arri=num%y;num=num/y;if(num=0)break;printf(“转换为 %d 进制:“,y);for(;i=0;i-)if(arri=10)printf(“%c“,arri+55);else printf(“%d“,arri); printf(“nn“);17 5
21、 程序编码#include#include#includelist2();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;elses+=(num%10)*i;num=num/10;if(j=1)printf(“原数据出错!请重新输入:n“);elseprintf(“转换为十进制:%dnn“,s);return s;void ten_ANY(int num,int y)int i;int arr30;for(i=0;i+)arri=num%y;num=num/y;if
22、(num=0)18 break;printf(“转换为 %d 进制:“,y);for(;i=0;i-)if(arri=10)printf(“%c“,arri+55);else printf(“%d“,arri); printf(“nn“);void list1()int i,a,m,num;char ch100;FILE *f;dogetchar();system(“cls“);printf(“ *n“);printf(“ * *n“);printf(“ * 数制转换器 *n“);printf(“ * *n“);printf(“ * 1 - 十进制转二进制 *n“);printf(“ * 2
23、- 十进制转八进制 *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“,if(a!=0void ANY_ch()in
24、t a,m,x,y,num;printf(“请输入进制数: “);scanf(“%d“,20 printf(“输入该 %d 进制数:“,x);scanf(“%d“,m=ANY_ten(x,num);printf(“ 是否将当前十进制数进一步转换: 1.是 2.否n“);printf(“ 请选择: “);loop2:scanf(“%d“,switch(a)case 1:printf(“转换的目标进制数为: “);scanf(“%d“,ten_ANY(m,y);break;case 2:printf(“t 转换结束!“);break;default:printf(“选择有误! 请重选: “);go
25、to loop2;break;getchar();int list2()int b;doprintf(“ *n“);printf(“ * 欢迎访问: 二十进制内任意进制转换 ! *n“);printf(“ *n“);printf(“tt 按 Enter 进入主菜单!“);getchar();system(“cls“);printf(“ *n“);printf(“ * 【主菜单】 *n“);printf(“ * *n“);printf(“ * 模式选择 *n“);printf(“ * *n“);printf(“ * 1 - 常见进制转换 *n“);printf(“ * 2 - 自定义进制数转换
26、*n“);printf(“ * 0 - 退出 *n“);printf(“ * *n“);printf(“ *n“);loop1:printf(“ 请选择要执行的模式: “);scanf(“%d“,21 switch(b)case 1: list1();break; /*常见进制转换菜单*/case 2: ANY_ch();break; /*任意进制数之间转换*/case 0: exit(0);break;default: printf(“n 您的输入有误,请重新选择!nn“);goto loop1;break;getchar();while(b0);return 0;void main()li
27、st2();22 6 程序测试和运行结果图 6.1 数制转换器函数调试结果按 Enter 键 进 入 主 菜 单 , 如 图 6.2 所 示 :图 6.2 主菜单选 择 1, 进 入 常 见 进 制 转 换 菜 单 , 如 图 6.3 所 示 :图 6.3 常 见 进 制 转 换 菜 单任 选 一 项 , 例 如 选 择 3, 十 进 制 转 换 为 十 六 进 制 函 数 , 输 入 59,结 果 如 图 6.4 所 示 :23 图 6.4 十进制转换为十六进制选 择 0, 返 回 主 菜 单 如 图 6.5 所 示 :图 6.5 返回主菜单选 择 2, 自 定 义 进 制 转 换 , 输
28、入 进 制 数 为 2, 数 字 为 110101, 选 择 1.是 , 结 果 如 图 6.6 所示 :图 6.6 自定义进制转换输 入 不 合 法 数 值 , 结 果 如 图 6.7 所 示 :图 6.7 输入不合法数值24 总 结在 本 次 课 程 设 计 中 , 所 完 成 的 数 制 转 换 器 系 统 实 现 了 二 进 制 、 八 进 制 、 十 六 进 制 和 十 进 制 之间 转 换 等 功 能 , 同 时 也 实 现 了 二 十 进 制 内 任 意 进 制 之 间 的 转 化 功 能 。 其 中 有 关 数 字 太 大 无 法 实 现转 化 的 问 题 , 主 要 是 因
29、为 数 字 超 过 了 定 义 的 长 度 时 , 无 法 实 现 两 个 数 制 转 化 。 除 此 之 外 不 能 实 现小 数 的 转 化 等 问 题 。 加 入 了 对 输 入 数 字 的 判 定 是 否 符 合 要 求 , 对 输 入 不 合 法 字 符 检 验 并 提 示 。希 望 以 后 可 以 实 现 上 述 两 个 问 题 , 首 先 是 改 进 程 序 , 是 其 能 实 现 小 数 的 转 化 , 其 次 改 进 定 义的 长 度 问 题 , 使 其 能 够 转 化 更 大 的 数 。这 次 课 程 设 计 使 我 对 C 语 言 知 识 进 行 了 系 统 的 、 有
30、条 理 的 复 习 , 对 许 多 知 识 点 都 加 强 了 记 忆 。在 开 始 编 写 程 序 时 , 我 遇 到 了 许 多 问 题 , 但 通 过 看 书 、 查 资 料 、 向 老 师 请 教 , 最 后 将 问 题 一 一 化解 。 同 时 这 次 课 程 设 计 的 制 作 , 将 为 我 毕 业 设 计 的 制 作 打 下 坚 定 的 基 础 。25 参考文献1 罗 建 军 , 朱 丹 军 , 顾 刚 , C+程 序 设 计 教 程 ( 第 2 版 ) .高 等 教 育 出 版 社 .20072 谭 浩 强 , C 程 序 设 计 ( 第 三 版 ) .北 京 .清 华 大 学 出 版 社 .20053 李 建 忠 , 大 学 计 算 机 基 础 .西 安 .西 北 大 学 出 版 社 .20054 谭 浩 强 , C 程 序 设 计 题 解 与 上 机 指 导 ( 第 三 版 ) .北 京 .清 华 大 学 出 版 社 .2005