C语言课程设计进制转换.docx
《C语言课程设计进制转换.docx》由会员分享,可在线阅读,更多相关《C语言课程设计进制转换.docx(20页珍藏版)》请在冰豆网上搜索。
C语言课程设计进制转换
C语言
课程设计报告
设计题目:
进制转换
学生姓名:
学生学号:
20101010110
专业班级:
数学与应用数学一班
学院名称:
数学与计量经济学院
同组人姓名:
指导老师:
2011年6月16日
目录
1.需求分析........................................................1
1.1问题描述....................................................1
1.2输入数据的要求..............................................1
1.3输出数据的要求..............................................1
1.4开发环境和工具..............................................1
1。
.5成员分工...................................................1
2.总体设计........................................................2
2.1设计思路...................................................3
2。
.2模块结构图...............................................4
3.详细设计........................................................7
3.1数据类型的定义...............................................7
3.2总的实现......................................................8
4.系统测试........................................................9
5.总结...........................................................·10
6.参考文献及附录............................................11
1需求分析
1.1问题描述
设计一个程序,将命令中的数字串转换为指定进制的数字串,并输出。
当输入BD时将数字串从二进制转换成十进制,当输入DB时将数字串从十进制转换成二进制,当输入BO时将二进制转换成八进制,当输入OB时将八进制转换成二进制。
转换前转换后的数字串都必须用字符数组存放,且不能直接用%d,%o输出,用命令提示符去运行程序。
输入数据要求
以命令行方式运行程序时所带参数,用户从键盘输入要转换的数据。
输入两个个字符,并且字符之间必须用空格隔开,输入第一个字符之前应先空格。
第一个是字符是表示转换的类型,第三个字符是需要转换的数字串。
如
BD10101010
是将二进制数转换成十进制数。
输出数据要求
根据输入数据,输出转换后的数字。
若输入正确,则如图1所示。
当输入数据之前没有空格的话,如图2,界面会提示“不是内部或外部命令,也不是可运行的程序或批处理文件”如果没有区分大小写,,界面会显示“IuputError!
”,如图3所示。
1
2
3
开发环境和工具
开发环境:
windows2007.
开发工具:
c-free5.0
成员分工
凌语蓉:
总体设计、查询模块、排序模块、……
黄子珊:
系统测试、主调模块、更新模块、……
2总体设计
2.1.总体设计思路
1.设计思路
实现数制转换,将数值在二进制与十进制,二进制与八进制之间实现相互转换。
根据进制转换的特点,以是十进制作为进制转换的中介站。
无论哪种转换形式,先转换成十进制,再利用数学方法转换成相应的进制。
所以,二进制与十进制之间直接通过一个算法能进行转换,二进制与八进制之间需要先转换成十进制再进行转换。
因此设计了两个算法,一个是将原来的进制转换成十进制,一个是将转换成十进制后得到的数转换成目标进制。
主函数里有两个形式参数,运行程序时操作系统将命令行参数传给mian函数的形式参数。
并且,十进制以上的进制中会出现字母,为了以后程序的改进,我们考虑了将字符转换成数字。
2.数据存储
所有的数字存放在字符类型的数组里面。
有两个字符数组,一个接受进制转换类型,一个储存数字串。
例如,如果储存的是BD,则将后面字符储存的数字从二进制转换成十进制;如果储存的是DB,则将后面字符储存的数字从十进制转换成二进制;如果储存的是BO,则将后面字符储存的数字从二进制转换成八进制;如果储存的是OB,则将后面字符储存的数字从八进制转换成二进制。
2.2模块结构图
1)source_to_decimal:
将数字串转换成十进制的。
2)decimal_to_object:
将十进制的数字串转换成目标进制。
3)output:
将转换后的数字串输出。
4)其中source_to_decimal,decimal_to_object模块
划分为如下两个子模块。
1)num_to_char:
将数字转换成字符。
2)char_to_num:
将字符转换成数字。
2.3模块说明
1.source_to_decimal:
函数原型:
longsource_to_decimal(chartemp[],intsource)
功能:
将数字串转换成十进制的
输入参数:
temp[]——字符数组,暂时存放输入的数字串。
source——整型类型,表示存放的数字串是几进制的。
输出参数:
decimal_num——长整型,表示是转换成十进制的数字串。
2.decimal_to_object
函数原型:
intdecimal_to_object(chartemp[],longdecimal_num,intobject)
功能:
将十进制的数字转换成目标进制
输入参数:
temp[]——字符数组,转换后的数字存放在temp[]数组中。
decimal_num——长整型,判断循环是否结束。
Object——整型,目标进制。
输出参数:
i——转换后目标进制数的长度。
3.Output
函数原型:
voidoutput(chartemp[],intlength)
功能:
输出字符
输入参数:
temp[]——字符数组,存放转换后数字串。
Length——整型,字符的长度。
输出参数:
temp[]——转换后的数字串。
4.num_to_char
函数原型charnum_to_char(intnum)
功能:
将数字转换为字符
输入参数:
num——整型,代表字符数组元素。
输出参数:
num——字符,转换后的字符
5.char_to_num
函数原型char_to_num(charch)
功能:
将字符转换为数字
输入参数:
char——字符,代表字符数组元素。
输出参数:
char——数字,转换后的数字。
3.详细设计
3.1数据类型的定义。
intmain(intargc,char*argv[])
{
intlength;//转换后的数字的长度
longdecimal_num;//转化为十进制后的数
intflag=1;//是否再次运行标识
}
intchar_to_num(charch)
{
charch;//将字符转换成数字。
十进制以上的进制中会出现字母。
}
charnum_to_char(intnum)
{
Intnum;//将数字转换成字符。
十进制以上的进制中会出现字母。
}
longsource_to_decimal(chartemp[],intsource)
{
longdecimal_num=0;//转换成十进制后的数值。
intlength;//获得原数字的长度。
inti;//控制循环。
chartemp[];//暂时存放转换前的数字串。
intsource;//用户输入的数字。
}
intdecimal_to_object(chartemp[],longdecimal_num,intobject)
{
inti=0;
chartemp[];//转换计算,转换后的数字存放在temp[]数组中
i++;
longdecimal_num;//转换计算的中介数。
intobject;//表示目标进制数
}
3.2总的实现
1.source_to_decimal模块的实现
算法思想:
1。
用一个char型的temp[]来暂时存放输入的数字串。
利用循环结构用i作下标,根据循环停止条件,得出数字串的长度,并且存储在int型的length中。
2.由数学知识可知,将一个m进制的数转换成十进制的数,要从最后一位开始算,依次列为第0、1、2...位第n位的数(0或1)乘以m的n次方,得到的结果相加就是答案。
所以我们先读取第一个数字利用循环机构将其连续乘以m(length-1)次,以此类推,最后一个数字直接加上。
如二进制01101011=十进制107
具体实现:
longsource_to_decimal(chartemp[],intsource)
{for(i=0;temp[i]!
='\0';i++);
length=i;//获得数字的长度
for(i=0;i<=length-1;i++)
decimal_num=(decimal_num*source)+char_to_num(temp[i]);//转换计算
returndecimal_num;//返回转换成十进制后的数值
}
2.decimal_to_object模块的实现
算法思想:
1。
将转换后的数字串暂时存放在temp[i]中。
2.十进制转化成n进制,就是把十进制数除以n取余,再除以n取余,直到商为0。
然后把所有的余数倒着取过来,就是对应的n进制数
比如十进制数90
90/2=45……0
45/2=22……1
22/2=11……0
11/2=5……1
5/2=2……1
2/2=1……0
1/2=0……1
所以十进制数90=二进制数1011010
具体实现:
intdecimal_to_object(chartemp[],longdecimal_num,intobject)
while(decimal_num)
{
temp[i]=num_to_char(decimal_num%object);
decimal_num=decimal_num/object;//转换计算,转换后的数字存放在temp[]数组中
i++;
}
3.output模块的实现
算法思想:
利用循环结构将字符数组元素从后至前逐个输出
具体实现:
voidoutput(chartemp[],intlength)
{
inti;
for(i=length-1;i>=0;i--)
printf("%c",temp[i]);
printf("\n");
}
.4。
num_to_char模块的实现
算法思想:
利用ASCII的差数将数字转换成字符。
具体实现:
charnum_to_char(intnum)
{
if(num>=0&&num<=9)
return(char)('0'+num-0);
else
return(char)('A'+num-10);
}
5.char_to_num模块的实现
算法思想:
利用ASCII的差数将字符转换成数字。
具体实现:
intchar_to_num(charch)
{
if(ch>='0'&&ch<='9')
returnch-'0';
else
returnch-'A'+10;
}
4.系统测试
1.转换类型
输入
输出
BD
110010
50
DB
42
101010
BO
110010
62
OB
342
11100010
2.BD
100010
34
DB
81
1010001
BO
11100
34
OB
531
101011001
3.BD
101011
43
DB
62
111110
BO
10110
26
BO
85
1000101
可以看到截图中输出的数据和上表是一样的
1.
2.
3.
5.总结
1.总结问题及解决方法:
我们在做这个进制转化时,首先我们应该明确最重要的两点。
一是如何仍将输入函数转化为十进制函数的问题,一是将十进制函数转化为目标进制。
在当将输入函数转化为十进制的时候注意是将进制用一个char型的temp[]来暂时存放输入的数字串。
利用循环结构用i作下标,根据循环停止条件,得出数字串的长度,并且存储在int型的length中。
由数学知识可知,将一个m进制的数转换成十进制的数,要从最后一位开始算,依次列为第0、1、2...位第n位的数(0或1)乘以m的n次方,得到的结果相加就是答案。
所以我们先读取第一个数字利用循环机构将其连续乘以m(length-1)次,以此类推,最后一个数字直接加上。
如二进制01101011=十进制107
二是将十进制转化为目标进制数的问题,将转换后的数字串暂时存放在temp[i]中。
.十进制转化成n进制,就是把十进制数除以n取余,再除以n取余,直到商为0。
然后把所有的余数倒着取过来,就是对应的n进制数比如十进制数9090/2=45……045/2=22……122/2=11……011/2=5……15/2=2……12/2=1……01/2=0……1所以十进制数90=二进制数1011010。
这两个算法是进制转化的核心。
三是我们将推广时,考虑进了十六进制的问题,这使得解决方案得到了推广
四是我们的设计结构中运用了循环结构的知识,ifelseif等的判断语句,将我们学过的知识依次加以运用,因此我们满足了从几个不同进制之间相互的要求。
五是命令行参数作为形式参数的一种,有着的相同的特点,也有着独特之处,相同点是满足形式参数的特点,独特之处是运行程序时操作系统将命令行参数传给main函数的形式参数。
对于这个进制转化的改进方案是,当我们的输入格式错误,不符合输入格式的要求,如要求输入是二进制,结果输入的是1334这样的数时,我们怎么改进,对此,我们提出的方案是,我们对于输入数据,算法是每一位的数字不断除以进制数,判断商来判断,如果商大于等于一,则输入错误。
参考文献:
《C语言程序设计》清华大学出版社谭浩强著
附录:
include
#include
intchar_to_num(charch);
charnum_to_char(intnum);
longsource_to_decimal(chartemp[],intsource);
intdecimal_to_object(chartemp[],longdecimal_num,intobject);
voidoutput(chartemp[],intlength);
charstr1[50];
charstr2[100];
//主方法,接受参数根据参数不同调用方法。
intmain(intargc,char*argv[])
{
intlength;//转换后的数字的长度
longdecimal_num;//转化为十进制后的数
strcpy(str1,argv[1]);
strcpy(str2,argv[2]);
if(str1[0]=='B'&&str1[1]=='D')
{
decimal_num=source_to_decimal(str2,2);//调用函数将str2由二进制
//转换成十进制
length=decimal_to_object(str2,decimal_num,10);//调用函数将str2
//由十进制转换成十进制
output(str2,length);
}
elseif(str1[0]=='D'&&str1[1]=='B')//判断命令是否为十进制->二进制
{
decimal_num=source_to_decimal(str2,10);//调用函数将str2由十进制
//转换成十进制
length=decimal_to_object(str2,decimal_num,2);//调用函数将str2由
//十进制转换成二进制
output(str2,length);
}
elseif(str1[0]=='B'&&str1[1]=='O')//判断命令是否为二进制->八进制
{
decimal_num=source_to_decimal(str2,2);//调用函数将str2由2进制转
//换成十进制
length=decimal_to_object(str2,decimal_num,8);//调用函数将str2由
//十进制转换成八进制
output(str2,length);
}
elseif(str1[0]=='O'&&str1[1]=='B')//判断命令是否为八进制->二进制
{
decimal_num=source_to_decimal(str2,8);//调用函数将str2由八进制
//转换成十进制
length=decimal_to_object(str2,decimal_num,2);//调用函数将str2由
//十进制转换成二进制
output(str2,length);
}
elseprintf("InputError!
\n");//如果输入转换类型有误,提示错误
return0;
}
//将字符转换成数字。
十进制以上的进制中会出现字母。
intchar_to_num(charch)
{
if(ch>='0'&&ch<='9')
returnch-'0';
else
returnch-'A'+10;
}
//将数字转换成字符。
十进制以上的进制中会出现字母。
charnum_to_char(intnum)
{
if(num>=0&&num<=9)
return(char)('0'+num-0);
else
return(char)('A'+num-10);
}
//将原数制转换成十进制。
longsource_to_decimal(chartemp[],intsource)
{
longdecimal_num=0;
intlength;
inti;
//获得数字长度
for(i=0;temp[i]!
='\0';i++);
length=i;
for(i=0;i<=length-1;i++)
decimal_num=(decimal_num*source)+char_to_num(temp[i]);//转换计算
returndecimal_num;//返回转换成十进制后的数值
}
//将十进制转换成目标进制
intdecimal_to_object(chartemp[],longdecimal_num,intobject)
{
inti=0;
while(decimal_num)
{
temp[i]=num_to_char(decimal_num%object);
decimal_num=decimal_num/object;//转换计算,转换后的数字存放在temp[]数组中
i++;
}
temp[i]='\0';
returni;
}
//输出字符串temp
voidoutput(chartemp[],intlength)
{
inti;
for(i=length-1;i>=0;i--)
printf("%c",temp[i]);
printf("\n");
}