c++的问题(调试错误)

酷豆 2009-03-29 06:44:28
// 进制转化 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;i<=n;j++)

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;
}
这段代码的十进制小数转化为十六进制数的时候能将真确的答案输出,但答案后会出现一段乱码,有请哪位高人将其运行一下,并希望能够指出错误之处!分不多,全部奉上!如果需要我愿加分。
...全文
327 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Paradin 2009-03-30
  • 打赏
  • 举报
回复



n=j-1;

for(j=0;i <=n;j++) //i->j
if(HBs_two[j].Hchar!=NULL)

cout < <HBs_two[j].Hchar;







feng4206yu 2009-03-30
  • 打赏
  • 举报
回复
比7楼慢了一步...
feng4206yu 2009-03-30
  • 打赏
  • 举报
回复

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;





}

coverallwangp 2009-03-30
  • 打赏
  • 举报
回复

// 进制转化 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;
}
sendto66 2009-03-30
  • 打赏
  • 举报
回复
mark
hndth 2009-03-30
  • 打赏
  • 举报
回复
mark
  • 打赏
  • 举报
回复
试了下,是转整数没问题,转小数就会出问题吧?
atgjplh 2009-03-30
  • 打赏
  • 举报
回复
太多了, 不想看, 你下次发的时候就说清楚, 发一小部份就行
要不太长了
酷豆 2009-03-30
  • 打赏
  • 举报
回复
感谢7楼 8楼 10楼,你们能那么认真且仔细读下来,真是感动啊,呵呵。那里的i确实应该是j,再次感谢,我的分不多,给你们意思一下吧!
mengde007 2009-03-29
  • 打赏
  • 举报
回复
这么多,只能帮顶了……
nobody@noone 2009-03-29
  • 打赏
  • 举报
回复
你把这些东西当字符串处理,想避免乱码,就在你的结果后面加个 '\0'

64,281

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧