64,281
社区成员
发帖
与我相关
我的任务
分享
if(tag_B==0)
{
n=j-1;
for(j=0;i <=n;j++) //这里的i是不是j...
if(HBs_two[j].Hchar!=NULL)
cout < <HBs_two[j].Hchar;
else
cout < <HBs_two[j].Hint;
}
cout < <endl;
}
// 进制转化 cpp.cpp : Defines the entry point for the console application.
//
//说明:编写一个带有函数的程序,将用户输入的十进制的数转化为二,八,十六进制的数//
//////////////////////////////////////////////////////////////////////////////////
//版本:1.0 //
//时间:2009年3月20日 //
/////////////////////////
//#include "stdafx.h"
#include "iostream.h"
#define Max 20
struct BString //作为存储二进制数和八进制数的结构体
{
int Bstring[Max];
int last;
};
struct HString //作为存储十六进制数的结构体
{
int Hint; // 余数 <=9,时有数字表示。初始状态为-1
char Hchar; // 余数>9时,用字母表示。初始状态为空
};
void init(BString &p)
{
p.last=-1; //线性表初始化;
}
void initH(HString &q)
{
q.Hint=-1;
q.Hchar=NULL;
}
void OBinary( float decimal )
{
int Dwn; float Dfn; // int变量Dwn为十进制数整数部分,float变量Dfn为十进制数小数部分
int tag=1; int tag_B=1; //当tag为零时,求整数部分的二进制表示的循环结束。
BString OBs_one,OBs_two; //定义两个BString变量,用来存储二进制数,OBs_one用来存储整数部分,OBs_two用来存储小数部分
init(OBs_one);
init(OBs_two); //分别初始化
int i=0,j=0;
Dwn=int(decimal/1); //得到整数部分
Dfn=decimal-Dwn; //得到小数部分
while(tag)
{
OBs_one.Bstring[i]=Dwn%2; //将整数部分化为的二进制数由低位到高位的存进结构体中
i++;
OBs_one.last++;
Dwn=Dwn/2;
if(Dwn==0)
tag=0;
}
if (Dfn!=0) //当小数部分存在时才执行
{
while(tag_B)
{
OBs_two.Bstring[j]=int(Dfn*2/1);//将整数部分化为的二进制数由高位到低位的存进结构体中
Dfn=Dfn*2-int(Dfn*2/1);
j++;
OBs_two.last++;
if(Dfn==0)
tag_B=0;
}
}
for(i=OBs_one.last;i>=0;i--)
cout <<OBs_one.Bstring[i];
if(tag_B!=1) //当小数部分存在时才执行
{
cout <<".";
for(j=0;j <=OBs_two.last;j++)
cout <<OBs_two.Bstring[j];
}
cout <<endl;
}
void OOctal ( float decimal ) //输出八进制数
{
int Dwn; float Dfn; // int变量Dwn为十进制数整数部分,float变量Dfn为十进制数小数部分
int tag=1; int tag_B=1; //当tag为零时,求整数部分的二进制表示的循环结束。
BString OBs_one,OBs_two; //定义两个BString变量,用来存储八进制数,OBs_one用来存储整数部分,OBs_two用来存储小数部分
init(OBs_one);
init(OBs_two); //分别初始化
int i=0,j=0;
Dwn=int(decimal/1); //得到整数部分
Dfn=decimal-Dwn; //得到小数部分
while(tag)
{
OBs_one.Bstring[i]=Dwn%8; //将整数部分化为的八进制数由低位到高位的存进结构体中
i++;
OBs_one.last++;
Dwn=Dwn/8;
if(Dwn==0)
tag=0;
}
if (Dfn!=0) //当小数部分存在时才执行
{
while(tag_B)
{
OBs_two.Bstring[j]=int(Dfn*8/1);//将整数部分化为的八进制数由高位到低位的存进结构体中
Dfn=Dfn*8-int(Dfn*8/1);
j++;
OBs_two.last++;
if(Dfn==0)
tag_B=0;
}
}
for(i=OBs_one.last;i>=0;i--)
cout <<OBs_one.Bstring[i];
if(tag_B!=1) //当小数部分存在时才执行
{
cout <<".";
for(j=0;j <=OBs_two.last;j++)
cout <<OBs_two.Bstring[j];
}
cout <<endl;
}
void OHex (float decimal)
{
int Dwn; float Dfn; // int变量Dwn为十进制数整数部分,float变量Dfn为十进制数小数部分
int tag=1; int tag_B=1;int remainder; char Hremainder; int n; //循环结束标志
HString HBs_one[Max],HBs_two[Max]; //定义两个HString变量,用来存储十六进制数,OBs_one用来存储整数部分,OBs_two用来存储小数部分
int i=0,j=0;
Dwn=int(decimal/1); //得到整数部分
Dfn=decimal-Dwn; //得到小数部分
while (tag)
{
initH(HBs_one[i]);
remainder=Dwn%16;
if(remainder>9)
{
switch(remainder)
{
case 10 : Hremainder='A'; break;
case 11 : Hremainder='B'; break;
case 12 : Hremainder='C'; break;
case 13 : Hremainder='D'; break;
case 14 : Hremainder='E'; break;
case 15 : Hremainder='F'; break;
}
HBs_one[i].Hchar=Hremainder;
}
else
HBs_one[i].Hint=remainder;
i++;
Dwn=Dwn/16;
if(Dwn==0)
tag=0;
}
if(Dfn!=0)
{
while(tag_B)
{
initH(HBs_two[j]);
remainder=int(Dfn*16/1);
if(remainder>9)
{
switch(remainder)
{
case 10 : Hremainder='A'; break;
case 11 : Hremainder='B'; break;
case 12 : Hremainder='C'; break;
case 13 : Hremainder='D'; break;
case 14 : Hremainder='E'; break;
case 15 : Hremainder='F'; break;
}
HBs_two[j].Hchar=Hremainder;
}
else
HBs_two[j].Hint=remainder;
Dfn= Dfn*16-remainder;
j++;
if( Dfn==0)
tag_B=0;
}
}
for(i=i-1;i>=0;i--)
if(HBs_one[i].Hchar!=NULL)
cout <<HBs_one[i].Hchar;
else
cout <<HBs_one[i].Hint;
cout <<'.';
if(tag_B==0)
{
n=j-1;
for(j=0;j <=n;j++) //此处修改,应该是j <= n不是i
if(HBs_two[j].Hchar!=NULL)
cout <<HBs_two[j].Hchar;
else
cout <<HBs_two[j].Hint;
}
cout <<endl;
}
int main(int argc, char* argv[])
{
float Decimal;
cout <<"输入一个十进制数:";
cin>>Decimal;
cout <<endl <<"输入的十进制数转化为二进制数:";
OBinary( Decimal );
cout <<endl <<"输入的十进制数转化为八进制数:";
OOctal(Decimal);
cout <<endl <<"输入的十进制数转化为十六进制数:";
OHex(Decimal);
return 0;
}