C语言进制转换课程设计.docx

上传人:b****1 文档编号:13332416 上传时间:2023-06-13 格式:DOCX 页数:32 大小:239.77KB
下载 相关 举报
C语言进制转换课程设计.docx_第1页
第1页 / 共32页
C语言进制转换课程设计.docx_第2页
第2页 / 共32页
C语言进制转换课程设计.docx_第3页
第3页 / 共32页
C语言进制转换课程设计.docx_第4页
第4页 / 共32页
C语言进制转换课程设计.docx_第5页
第5页 / 共32页
C语言进制转换课程设计.docx_第6页
第6页 / 共32页
C语言进制转换课程设计.docx_第7页
第7页 / 共32页
C语言进制转换课程设计.docx_第8页
第8页 / 共32页
C语言进制转换课程设计.docx_第9页
第9页 / 共32页
C语言进制转换课程设计.docx_第10页
第10页 / 共32页
C语言进制转换课程设计.docx_第11页
第11页 / 共32页
C语言进制转换课程设计.docx_第12页
第12页 / 共32页
C语言进制转换课程设计.docx_第13页
第13页 / 共32页
C语言进制转换课程设计.docx_第14页
第14页 / 共32页
C语言进制转换课程设计.docx_第15页
第15页 / 共32页
C语言进制转换课程设计.docx_第16页
第16页 / 共32页
C语言进制转换课程设计.docx_第17页
第17页 / 共32页
C语言进制转换课程设计.docx_第18页
第18页 / 共32页
C语言进制转换课程设计.docx_第19页
第19页 / 共32页
C语言进制转换课程设计.docx_第20页
第20页 / 共32页
亲,该文档总共32页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

C语言进制转换课程设计.docx

《C语言进制转换课程设计.docx》由会员分享,可在线阅读,更多相关《C语言进制转换课程设计.docx(32页珍藏版)》请在冰点文库上搜索。

C语言进制转换课程设计.docx

C语言进制转换课程设计

课程设计

进制转换

课程设计名称:

数据结构课程设计

专业班级:

学生姓名:

指导教师:

设计时间:

计算机专业课程设计任务书

学生姓名

专业班级学号

题目

进制转换

课题性质

A.工程设计

课题来源

D•自拟课题。

指导教师

同组姓名

主要内容

针对进制转换问题,选择、设计和实现合适的抽象数据类型;

进行进制转换分析,给出设计方案。

学习掌握并熟练运用C语言进行程序设计;

任务要求

这次课程设计不仅提升C语言理论知识,更重要的是能够提高自己的编程能力。

这个项目是用来实现进制转换的一些简单功能。

现过程中需要编制函数,依次实现各个功能。

也需要学会利用网络或其他工具来查找相关的资料解决问题,每解决一个问题,就会多一份收获,会不断培养自我学习的能力。

参考文献

[1]谭浩强.C程序设计(第三版).北京:

清华大学出版社.2005:

34

[2]李建忠.大学计算机基础.西安:

西北大学出版社.2005:

104

[3]谭浩强.C程序设计题解与上机指导(第三版).北京:

清华大学

出版社.2005:

68

[4]罗建军、朱丹军、顾刚.C++程序设计教程(第2版).北京:

高等教育出版社.2007:

76

审查意见

指导教师签字:

教研室主任签字:

2014年6月15日

、转换概述3....

1.需求分析3....

2.概要设计4....

3.详细设计8....

1.十进制转化为任意进制函数:

8..

2.任意进制转化十进制函数:

.9...

3.程序流程图11

4.运行环境12

5.开发工具和编程语言13

、数学原理14

十进制转二进制:

14

十进制转八进制:

15

十进制转十六进制:

15

二进制转十进制:

15

二进制转八进制:

16

二进制转十六进制:

16

八进制转十进制:

17

八进制转十六进制:

17

十六进制转二进制:

17

十六进制转八进制:

18

三、程序编码17

测试结果26

参考文献30

四、心得体会31

一、转换概述

1、需求分析

进制数制是人们利用符号进行计数的科学方法。

数制有很多种,在计算机中常用的数制有:

十进制,二进制、八进制和十六进制。

十六进制数有两个基本特点:

它由十六个字符

0〜9以及A,B,C,D,E,F组成(它们分别表示十进制数0〜15),十六进制数运算规律是逢十六进一。

要求:

(1)输入一个十进制数N,将它转换成R进制数输出,并可以进行逆转换。

(2)输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(2<=R<=16,R<>10)。

(3)为每个测试实例输出转换后的数,每个输出占一行。

如果R大于10,则对应的数字规则参考16进制(比如,10用A表示,等等)。

(4)界面友好。

2、概要设计

数制转换器程序是要求任意两种数间的相互转化,本次课程设计以任意进制间转换为中心实现二进制、八进制、十进制、十六进制、十八进制之间的相互转化。

对输入的任意进制的数字进行转换,实现常见进制间的转换以及用户自定义需要转换的目标进制数,这样大大提高了本程序的用途。

常见的二进制、八进制、十进制、十六进制、十六进制之间的固定转换,其转换方式大同小异,从低进制数向高进制数转换进行乘数累加,反之则逐步求余,最终进行分布计算得到想要的结果,对以上思想进行扩展,使其不仅仅局限于那些常见进制间的转换,更多的应用到任意进制之间的转换。

本次系统程序,主要有两大模块组成,即任意进制转换为十进制、十进制转换为任意进制,这两部分共同组成了对任意进制数的转换的实现,通过菜单选择,让用户实现自己想要的结果,同时也在程序的简洁上有所压减,达到简洁的应用程序实现相对较复杂的功能。

最后打印输出结果,清屏执行下次任务。

该程序包括七个子函数模块,其中菜单函数模块定义为整型,其余字符转换函数处理模块都根据函数所需定义数据类型。

数制转换器处理系统中用数组来储存处十进制以外的数,将一个指定进制的数,从低到低高一位一位取出,并计算出每位的十进制值,然后乘以其数基的特定幕指数,得出这一位数的十进制值,将所有各位的十进制值相加得出这个数的十进制值,然后再将该十进制数转换为指定数制的数,此过程采用求余法进行,用这个十进制数作为被除数,用指定的数基作除数,连续求余,得出的余数依由个位到十位等的顺序组成新数,即得指定数制的数。

(1)逻辑设计如图所示:

开始

主菜单

判断调用程序

图2.1

(2)程序中各函数简单说明见如表1、1函数说明所示:

表2.1

返回值

函数名

参数表

函数说明

int

main

void

主函数

void

intANY_ten()

intx,intnum

任意进制转换为

十进制

void

Intten_ANY()

intnum,inty

十进制转换为任

意进制9

void

ten_ANY()

num,2

十进制转换为一

进制

void

list1()

num

进制转换采单

void

list2()

num

主菜单

void

ANY_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");

else

printf("转换为十进制:

%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所示:

Iist2();

图3.1main函数流程图

(2)主菜单list2()流程图,如图3.2所示:

N

图3.2list2()函数流程图

 

(3)常见进制转换菜单Iist1()函数流程图,如图3.3所示:

 

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余0

151/2

=75余1

75/2

=37余1

37/2

=18余1

18/2

=9余0

9/2

=4余1

4/2

=2余0

2/2

=1余0

所以302转换为2进制,结果:

100101110

十进制转八进制:

十进制数转换成八进制的方法和转换为二进制的方法类似,唯一变化:

除数由2变成8。

例如:

120/8=15余0

15/8=1余7

1/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*2A0=0

第1位:

1*2八1=2

第2位:

0*2八2=0

第3位:

1*2A3=8

所以1010转换成十进制数结果:

0+2+0+8=10.

二进制转八进制:

利用421,从后往前每三位一组,缺位补0,然后按十进制方法进行转换。

女口:

(11001)001=101仁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*8A0=7

第1位:

0*8A仁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*16A0=5

第1位:

F*16A1=240

第2位:

A*16A3=2560

第3位:

2*16A4=8192

所以转换成十进制数为:

10997.

三、程序编码

#include

#include

#include

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");

else

printf("转换为十进制:

%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;

}

}

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("

**********

1-十进制转二进制

********

**\n");

printf("

**********

2-十进制转八进制

********

**\n");

printf("

**********

3-十进制转十六进制**********\n");

printf("

**********

4-二进制转十进制

********

**\n");

printf("

********

**\n");

printf("

**********

6-

十六进制转十进制

**********\n");

printf("

**********

7-

二进制转八进制

**********\n");

printf("

8-

**********\n");

二进制转十六进制

**********

5-八进制转十进制

**********

********

printf("

0-返回

**\n");

printf("

**********

*********

**\n");

printf("

******************************************

**\n");

 

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;

else

printf("输入有误!

请输入数字:

");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);

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{

**\n");

n**********************************************

 

printf("***

二十进制内任意进制转换

***\n"

);

 

printf(

n**********************************************

**\n");

 

 

printf("\t\t按Enter进入主菜单!

");

getchar();

printf("

********************************************\n");

loop1:

printf("

请选择要执行的模式:

");

**\n");

system("cls");

printf("

**********

【主菜单】

**********\n")

printf("

**********

**********\n")

printf("

**********

模式选择

**********\n")

printf("

**********

**********\n")

printf("

**********

1-

常见进制转换

**********\n");

printf("

**********

2-

自定义进制数转换

**********\n");

printf("

**********

0-

退出

**********\n");

printf("

******************************************

**\n");

********

scanf("%d",&b);

switch(b)

{

case1:

list1();break;/*常见进制转换菜单*/

case2:

ANY_ch();break;/*任意进制数之间转换*/case0:

exit(0);break;

default:

printf("\n您的输入有误,请重新选择!

\n\n");gotoloop1;break;

gefchaoThi-e(bvo)八refurn0八voidmain()

=會

 

测试结果

按Enter键进入主菜单,如图3.1所示:

 

[主菜单】

wiotwatwK豪豪豪

模式选择

■_■*■_■■■'・■n.■■■・■・■i_■'■■

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2