楼主的问题我想过了,并写出了代码,供楼主参考
#include<iostream.h>
#include<fstream.h>
#include<string.h>
#include<math.h>
/*******************************************************************************
declare class Radix
*******************************************************************************/
class Radix //定义处理结果的累
{
private:
ostream& out; //该类有两个数据成员,一个输入流和一个输出流
istream& in;
char max(char*); //找出数中最大的数,将从文件中读取的数看成是字符串,以便处理
int toInteger(char); /*将字符转换成整数,如字符'1'(ASCII为49)换成整数1,'A'(ASCII为65)
转换成10*/
int toDecimal(char*,int base);/*将给定的字符序列转换成以base为基数的整形值,如12如果以
3为基数其值为10进制的5*/
int adjust(char*,char*,int&,int&);/*对两个给定的字符序列进行基数调整,直到他们在某两个
基数下相等*/
public:
Radix(ostream&,istream&); //构造函数
void process(); //对一个文件中的所有数对进行处理
};
/*******************************************************************************
define the function of class Radix
*******************************************************************************/
Radix::Radix(ostream& outP,istream& inP):out(outP),in(inP)
{
}
char Radix::max(char* p)
{
int len=strlen(p);
char ch=p[0];
for(int i=1;i<len;i++)
if(p[i]>ch)
ch=p[i];
return ch;
}
int Radix::toInteger(char ch) /*将字符转换成整数,如字符'1'(ASCII为49)换成整数1,'A'(ASCII为65)
转换成10*/
{
int result;
if(ch>=48&&ch<=57)
result=ch-48;
else if(ch>=65&&ch<=80)
result=ch-55;
else if(ch>=97&&ch<=122)
result=ch-87;
else
result=-1;
return result;
}
int Radix::toDecimal(char* p,int base)/*将给定的字符序列转换成以base为基数的整形值,如12如果以
3为基数其值为10进制的5*/
{
int len,result=0,temp,i,j;
len=strlen(p);
for(i=len-1,j=0;i>=0;i--,j++)
{
temp=toInteger(p[i]);
result=result+(int)(temp*pow(base,j));
}
return result;
}
int Radix::adjust(char* p1,char* p2,int& base1,int& base2)/*对两个给定的字符序列进行基数调整,
直到他们在某两个基数下相等*/
{
int value1,value2;
char max1=max(p1);
char max2=max(p2);
base1=toInteger(max1)+1;
base2=toInteger(max2)+1;
if(strlen(p1)==1)
{ value1=toInteger(max1);
if(strlen(p2)==1)
value2=toInteger(max2);
else
{
value2=toDecimal(p2,base2);
while(value1!=value2)
{
if(value1<value2)
break;
base2++;
value2=toDecimal(p2,base2);
}
}
}
else if(strlen(p2)==1)
{
value2=toInteger(max2);
value1=toDecimal(p1,base1);
while(value1!=value2)
{
if(value2<value1)
break;
base1++;
value1=toDecimal(p1,base1);
}
}
else
{
value1=toDecimal(p1,base1);
value2=toDecimal(p2,base2);
yang: if(value1<value2)
{
while(value1!=value2&&base1<35)
{
base1++;
value1=toDecimal(p1,base1);
if(value1>value2)
goto hui;
}
}
else if(value1>value2)
{
hui: while(value1!=value2&&base2<35)
{
base2++;
value2=toDecimal(p2,base2);
if(value2>value1)
goto yang;
}
}
}
if(value2==value1)
return 0;
return 1;
}
void Radix::process() //对文件中的所有数对处理
{
char *p1,*p2;
p1=new char[10];
p2=new char[10];
int base1,base2;
in>>p1>>p2;
while(!in.eof())
{
if(!adjust(p1,p2,base1,base2))
out<<p1<<"(radix "<<base1<<")="<<p2<<"(radix "<<base2<<")\n";
else
out<<p1<<"is never equal to:"<<p2<<endl;
in>>p1>>p2;
}
delete p1,p2;
}
/*******************************************************************************
main function
*******************************************************************************/
void main()
{
ifstream in("F:\\study\\base.in"); //打开文件输入流
ofstream out("base.out"); //打开文件输出流
if(in.fail())
{
cout<<"can't open file"<<endl;
return;
}
Radix base(out,in); //创建处理对象
base.process();//让该对象对文件进行处理,将结果放入输出流中
}
不知道注释写的明白与否?