读书人

运算符重载有关问题马上给分

发布时间: 2012-02-27 10:00:22 作者: rapoo

运算符重载问题,马上给分!
编写Time类,使得输入时间时可以以hh-mm-ss的方式输入,且h,m,s既可一位输入也可二位输入,输出以hh:mm:ss的方式输出。因此重载> > , < <函数,但却出现不会输出的问题,不知原因何在,请高手指点,谢谢!!在线等,马上给分!!
//13.6.h
class Time
{
friend ostream &operator < <(ostream &,Time &);
friend istream &operator> > (istream &,Time &);
public:
Time(int h=0,int m=0,int s=0);

private:
int hour,minute,second;
};

#include <iostream.h>
#include <string.h>
#include "13.6.h "
istream &operator> > (istream &in,Time &it)
{
char ss[9];
cin> > ss;

ss[strlen(ss)]= '\0 ';

int temp[7],i=0,j=0,m=0;

while(*(ss+i)!= '\0 ')
{
int n=0;
while(*(ss+i)!= '- '&&*(ss+i)!= '\0 ')
{
temp[j++]=(*(ss+i));
++i;
++n;//用来判断小时、分钟等输入的位数
//cout < <temp[0] < <endl;
}
//cout < <temp[0] < <temp[1];
++m;//用来判断给哪个数据成员赋值
if(m==1)
{
if(n%2)
{
it.hour=temp[j-n]-48;

}

else
{
it.hour=(temp[j-n]-48)*10+temp[j-n+1]-48;
//cout < <temp[j-n] < <temp[j-n+1] < <endl;
}
}
else if(m==2)
{
if(n%2)
it.minute=temp[j-n]-48;
else
{
it.minute=(temp[j-n]-48)*10+temp[j-n+1]-48;
//cout < <temp[j-n] < <temp[j-n+1] < <endl;
}
}
else
{
if(n%2)
{
it.second=temp[j-n]-48;
cout < <temp[j-n]-48 < <endl;
}

else
{
it.second=(temp[j-n]-48)*10+temp[j-n+1]-48;
//cout < <temp[j-n]-48 < <temp[j-n+1]-48 < <endl;
}
}
++i;
//cout < <i < <endl;

}

return in;
}

ostream &operator < <(ostream &out,Time &ot)
{
out < <ot.hour < < ": " < <ot.minute < < ": " < <ot.second < <endl;
return out;
}


Time::Time(int h,int m,int s)
{
hour=h;
minute=m;
second=s;
}

int main()
{
Time tt;
cout < < "input the time: ";
cin> > tt;

cout < <tt;
return 0;
}

[解决办法]
VC6吧?
class Time
{
friend ostream &operator < <(ostream &,Time &)
{
....
}
....
[解决办法]
友元问题...
[解决办法]
//包含头文件 <stdio.h>
//istream &operator> > () 改为以下形式
istream &operator> > (istream &in,Time &it)
{
scanf( "%d-%d-%d ", &it.hour, &it.minute, &it.second);
return in;
}
试试
[解决办法]
//要么这样,好像对点
istream &operator> > (istream &in,Time &it)
{
in> > it.hour;
getchar();
in> > it.minute;
getchar();
in> > it.second;
return in;
}

[解决办法]
我修改了下你的程序,对hh-mm-ss格式的可以正确显示,其他格式没有做纠错检查

#include "stdafx.h "
#include <iostream.h>
#include <string.h>

enum{TYPE_NULL, SET_HOUR, SET_MINUTE, SET_SECOND};
class MyTime
{
friend ostream& operator < <(ostream&, MyTime&);
friend istream& operator> > (istream&, MyTime&);
public:
MyTime();
private:

char m_Hour[5];
char m_Minute[5];
char m_Second[5];
//int hour,minute,second;
};

MyTime::MyTime()
{

}


istream& operator> > (istream& in, MyTime& it)
{
char Temp[20];
cin > > Temp;
int iPos = 0; //Temp当前指针位置
int iStart = 0; //计算m_Hour等的下标
int iType = SET_HOUR; //区分类型
int iLen = strlen(Temp);
for (int i = 0; i < iLen; i++)
{
if (iType != SET_SECOND && Temp[i] == '- ')
{
switch(iType)
{
case SET_HOUR:
for (; iPos < i; iPos++) //循环赋值
{
it.m_Hour[iStart] = Temp[iPos];
iStart++;
}
it.m_Hour[iStart] = '\0 ';//设置结束符
iType = SET_MINUTE;
iPos++; //iPos指向 '- '的下一个位置
break;
case SET_MINUTE:
for (iStart = 0; iPos < i; iPos++)
{
it.m_Minute[iStart] = Temp[iPos];
iStart++;
}
it.m_Minute[iStart] = '\0 ';
iType = SET_SECOND;
iPos++;
break;
}
}
else if (iType == SET_SECOND)
{
for (iStart = 0; iPos < iLen; iPos++)
{
it.m_Second[iStart] = Temp[iPos];
iStart++;
}
it.m_Second[iStart] = '\0 ';
iType = TYPE_NULL;
}
}
return in;
}

ostream &operator < <(ostream &out,MyTime &ot)
{
out < < ot.m_Hour < < ": " < < ot.m_Minute < < ": " < < ot.m_Second < < endl;
return out;
}

int main()
{
MyTime tt;
cout < < "input the time: ";
cin> > tt;

cout < <tt;
return 0;
}
[解决办法]
if(n%2)
{
it.second=temp[j-n]-48;
cout < <temp[j-n]-48 < <endl;
}

else
{
it.second=(temp[j-n]-48)*10+temp[j-n+1]-48;
//cout < <temp[j-n]-48 < <temp[j-n+1]-48 < <endl;
}

[解决办法]
it.second 赋值完后加个
break; 不然死循环
[解决办法]
istream &operator> > (istream &in,Time &it)
{
char ss[9];
cin> > ss;

ss[strlen(ss)]= '\0 ';

int temp[7],i=0,j=0,m=0;

while(*(ss+i)!= '\0 ')
{
int n=0;
while(*(ss+i)!= '- '&&*(ss+i)!= '\0 ')
{
temp[j++]=(*(ss+i));
++i;
++n;//用来判断小时、分钟等输入的位数
//cout < <temp[0] < <endl;
}
//cout < <temp[0] < <temp[1];
++m;//用来判断给哪个数据成员赋值
if(m==1)
{
if(n%2)
{
it.hour=temp[j-n]-48;

}

else
{
it.hour=(temp[j-n]-48)*10+temp[j-n+1]-48;
//cout < <temp[j-n] < <temp[j-n+1] < <endl;


}
}
else if(m==2)
{
if(n%2)
it.minute=temp[j-n]-48;
else
{
it.minute=(temp[j-n]-48)*10+temp[j-n+1]-48;
//cout < <temp[j-n] < <temp[j-n+1] < <endl;
}
}
else
{
if(n%2)
{
it.second=temp[j-n]-48;
cout < <temp[j-n]-48 < <endl;
}

else
{
it.second=(temp[j-n]-48)*10+temp[j-n+1]-48;
//cout < <temp[j-n]-48 < <temp[j-n+1]-48 < <endl;
}
break;
}
++i;
//cout < <i < <endl;

}

return in;
}

[解决办法]
ss[strlen(ss)]= '\0 '; ----> ss[strlen(ss)+1]= '\0 ';
[解决办法]
原来对的,楼上错的
[解决办法]
不改变数据类型? 获得字符串后转为int就可以了

------------

#include "stdafx.h "
#include <iostream.h>
#include <string.h>
#include <stdlib.h>

enum{TYPE_NULL, SET_HOUR, SET_MINUTE, SET_SECOND};
class MyTime
{
friend ostream& operator < <(ostream&, MyTime&);
friend istream& operator> > (istream&, MyTime&);
public:
MyTime();
private:
int m_Hour;
int m_Minute;
int m_Second;
};

MyTime::MyTime()
{
m_Hour = m_Minute = m_Second = 0;
}


istream& operator> > (istream& in, MyTime& it)
{
char Temp[20];
cin > > Temp;
char Value[5];
int iPos = 0; //Temp当前指针位置
int iStart = 0; //计算m_Hour等的下标
int iType = SET_HOUR; //区分类型
int iLen = strlen(Temp);
for (int i = 0; i < iLen; i++)
{
if (iType != SET_SECOND && Temp[i] == '- ')
{
switch(iType)
{
case SET_HOUR:
for (; iPos < i; iPos++) //循环赋值
{
Value[iStart] = Temp[iPos];
iStart++;
}
Value[iStart] = '\0 ';//设置结束符
it.m_Hour = atoi(Value);
iType = SET_MINUTE;
iPos++; //iPos指向 '- '的下一个位置
break;
case SET_MINUTE:
for (iStart = 0; iPos < i; iPos++)
{
Value[iStart] = Temp[iPos];
iStart++;
}
Value[iStart] = '\0 ';
it.m_Minute = atoi(Value);
iType = SET_SECOND;
iPos++;
break;
}
}
else if (iType == SET_SECOND)
{
for (iStart = 0; iPos < iLen; iPos++)
{
Value[iStart] = Temp[iPos];
iStart++;
}
Value[iStart] = '\0 ';
it.m_Second = atoi(Value);
iType = TYPE_NULL;
}
}
return in;
}

ostream &operator < <(ostream &out,MyTime &ot)
{
// 如果小于10的要显示为0X格式,对值进行判断在输出
out < < ot.m_Hour < < ": " < < ot.m_Minute < < ": " < < ot.m_Second < < endl;
return out;
}

int main()
{
MyTime tt;
cout < < "input the time: ";
cin> > tt;

cout < <tt;
return 0;
}

[解决办法]
else
{
--i; //应该在这里将i减1
if(n%2)
{
it.second=temp[j-n]-48;


cout < <temp[j-n]-48 < <endl;
}

else
{
it.second=(temp[j-n]-48)*10+temp[j-n+1]-48;
//cout < <temp[j-n]-48 < <temp[j-n+1]-48 < <endl;
}
break;
}

[解决办法]
否则会跳过最后一个\0字符
[解决办法]
tortiose() :否则会跳过最后一个\0字符
-------------------------------------------
那个不用减,读完second后直接跳出循环就不用判断了

读书人网 >C++

热点推荐