C++第四次作业

Problem A: 时间类的拷贝和整体读写

Description

封装一个时间类Time,用于时间处理的相关功能,支持以下操作:

  1. Time::Time()无参构造方法。
  2. Time::Time(int,int,int)构造方法:传递时分秒的三个参数构造对象。
  3. Time::Time(const T&)拷贝构造方法。拷贝构造函数调用时输出“There was a call to the copy constructor : h,m,s”,“h,m,s”为所构造对象的时分秒数值,无需补0。
  4. 对象整体读写方法:
    Time::setTime(int,int,int)方法:传递时分秒三个参数修改Time对象的时分秒数。该方法返回修改后的对象。
    Time::setTime(const T&)方法:传递一个参数修改Time对象的时分秒数。该方法返回修改后的对象。
    Time::getTime()方法:返回对象自身的引用。其实,t.getTime()即t。
    仅在Time类中的Time::getTime()方法实在是多余,在组合或者继承关系时才会有机会用到。
  5. Time::showTime()方法:输出“hh:mm:ss”,不足两位的要前面补0。
    注意:在用Time对象传递参数时应传对象的引用而不是直接传对象,返回对象时同样返回引用,以免产生多余的对象拷贝。
    你设计一个时间类Time,使得main()函数能够正确运行。
    函数调用格式见append.cc
    append.cc中已给出main()函数。main()函数内容稍微繁复,仅为测试对象的各种调用情况。

Input
输入的第一个整数n,表示有n组测试数据,每组3个整数:hh,mm,ss,分别表示时、分、秒,其值都在合法的时间范围内。

Output
开始部分为由main()函数产生的固定输出,用于测试对象的某些方法的调用情况。输出“Test data output :”之后为测试数据对应的输出:
每组测试数据对应一组输出“hh:mm:ss”,不足两位的输出需要前面补0,格式见sample。

Sample Input
5
0 0 1
0 59 59
1 1 1
23 0 0
23 59 59
Sample Output
Copy constructor test output :
There was a call to the copy constructor : 0,0,0
There was a call to the copy constructor : 1,2,3

Test data output :
00:00:01
00:59:59
01:01:01
23:00:00
23:59:59

#include<bits/stdc++.h>
using namespace std;
class Time
{
private:
	int hour, minute, second;
public:
	Time()
	{
		hour = 0;
		minute = 0;
		second = 0;
	}
	Time(int _hour, int _minute, int _second)
	{
		hour = _hour;
		minute = _minute;
		second = _second;
	}
	Time(const Time& T)
	{
		hour = T.hour;
		minute = T.minute;
		second = T.second;
		cout << "There was a call to the copy constructor : " << hour << "," << minute << "," << second << endl;
	}
	Time& setTime(int a, int b, int c)
	{
		hour = a;
		minute = b;
		second = c;
		return *this;
	}
	Time& setTime(const Time& T)
	{
		hour = T.hour;
		minute = T.minute;
		second = T.second;
		return *this;
	}
	Time& getTime()
	{
		return *this;
	}
	void showTime()
	{
		cout << setw(2) << setfill('0') << hour << ":" << setw(2) << setfill('0') << minute << ":" << setw(2) << setfill('0') << second << endl;
	}
};
int main()
{
	cout << "Copy constructor test output :" << endl;
	Time t;
	Time tt(t);
	Time ttt(1, 2, 3);
	Time tttt(ttt.getTime());
	cout << "\nTest data output :" << endl;

	int cases;
	cin >> cases;
	for (int i = 1; i <= cases; ++i)
	{
		if (i % 2 == 0)
		{
			int hour, minute, second;
			cin >> hour >> minute >> second;
			t.setTime(hour, minute, second).showTime();
		}
		if (i % 2 == 1)
		{
			int hour, minute, second;
			cin >> hour >> minute >> second;
			Time tt(hour, minute, second);
			t.setTime(tt).showTime();
		}
	}
}

Problem B: 时间类的错误数据处理

Description

封装一个时间类Time,用于时间处理的相关功能,支持以下操作:

  1. Time::Time()无参构造方法。
  2. Time::Time(int,int,int)构造方法:传递时分秒的三个参数构造对象。
  3. Time::Time(const T&)拷贝构造方法。
  4. 成员读函数:
    Time::hour() :返回Time的小时数;
    Time::minute():返回Time的分钟数;
    Time::second():返回Time的秒数。
  5. 成员写函数:
    Time::hour(int) :传参修改Time的小时数;
    Time::minute(int):传参修改Time的分钟数;
    Time::second(int):传参修改Time的秒数。
  6. 对象整体读写方法:
    Time::setTime(int,int,int)方法:传递时分秒三个参数修改Time对象的时分秒数。该方法返回修改后的对象。
    Time::setTime(const T&)方法:传递一个参数修改Time对象的时分秒数。该方法返回修改后的对象。
    Time::getTime()方法:返回对象自身的引用。其实,t.getTime()即t。
    仅在Time类中的Time::getTime()方法实在是多余,在组合或者继承关系时才会有机会用到。
  7. Time::inputTime()方法:按格式从标准输入读取数据修改Time对象的时分秒数值。该方法返回修改后的对象。
  8. Time::showTime()方法:输出“hh:mm:ss”,不足两位的要前面补0。如果对象不是合法的时间,则输出“Time error”。
    你设计一个时间类Time,使得main()函数能够正确运行。
    函数调用格式见append.cc
    append.cc中已给出main()函数。main()函数内容稍微繁复,仅为测试对象的各种调用情况。

Input
输入的第一个整数n,表示有n组测试数据,每组3个整数:hh,mm,ss,分别表示时、分、秒,其值都在int范围内。

Output
每组测试数据对应一组输出“hh:mm:ss”,不足两位的输出需要前面补0。如果输入的时间不合法,则输出“Time error”。格式见sample。

Sample Input
6
0 0 1
0 59 59
1 1 60
23 0 0
23 59 59
24 1 0
Sample Output
00:00:01
00:59:59
Time error
23:00:00
23:59:59
Time error
HINT

输出格式用头文件中流操作算子:

setw(w) :设置数据的输出宽度为w个字符

setfill©:设置用字符c作为填充字符

#include<bits/stdc++.h>
using namespace std;
class Time
{
private:
	int h, m, s;
public:
	Time()
	{
		h = 0;
		m = 0;
		s= 0;
	}
	Time(int _hour, int _minute, int _second)
	{
		h = _hour;
		m = _minute;
		s = _second;
	}
	Time(const Time& T)
	{
		h = T.h;
		m = T.m;
		s = T.s;
		cout << "There was a call to the copy constructor : " << h << "," << m << "," << s << endl;
	}
	int hour()
	{
		return h;
	}
	int minute()
	{
		return m;
	}
	int second()
	{
		return s;
	}
	void hour(int _hour)
	{
		h= _hour;
	}
	void minute(int _minute)
	{
		m = _minute;
	}
	void second(int _second)
	{
		s = _second;
	}
	Time& setTime(int a, int b, int c)
	{
		h = a;
		m = b;
		s = c;
		return *this;
	}
	Time& setTime(const Time& T)
	{
		h = T.h;
		m = T.m;
		s = T.s;
		return *this;
	}
	Time& getTime()
	{
		return *this;
	}
	Time& inputTime() { cin >> h >> m >> s;   return *this; }
	void showTime()
	{
		if (h * 3600 + m * 60 + s >= 24 * 3600 || m > 59 || s > 59 || h < 0 || s < 0 || m < 0)
		{
			cout << "Time error" << endl;
		}
		else
		{
			cout << setw(2) << setfill('0') << h << ":" << setw(2) << setfill('0') << m << ":" << setw(2) << setfill('0') << s << endl;
		}
	}
};
int main()
{
	Time t;
	int cases;
	cin >> cases;
	for (int i = 1; i <= cases; ++i)
	{
		if (i % 4 == 0)
		{
			int hour, minute, second;
			cin >> hour >> minute >> second;
			Time tt(hour, minute, second);
			tt.showTime();
		}
		if (i % 4 == 1)
		{
			int hour, minute, second;
			cin >> hour >> minute >> second;
			t.setTime(hour, minute, second).showTime();
		}
		if (i % 4 == 2)
			t.inputTime().showTime();
		if (i % 4 == 3)
		{
			int hour, minute, second;
			cin >> hour >> minute >> second;
			t.hour(hour);
			t.minute(minute);
			t.second(second);
			t.showTime();
		}
	}
}

Problem C: 时间类的常量

Description

封装一个时间类Time,用于时间处理的相关功能,支持以下操作:

  1. Time::Time()无参构造方法。
  2. Time::Time(int,int,int)构造方法:传递时分秒的三个参数构造对象。
  3. Time::Time(const T&)拷贝构造方法。
  4. 成员读函数:
    Time::hour() :返回Time的小时数;
    Time::minute():返回Time的分钟数;
    Time::second():返回Time的秒数。
  5. 成员写函数:
    Time::hour(int) :传参修改Time的小时数;
    Time::minute(int):传参修改Time的分钟数;
    Time::second(int):传参修改Time的秒数。
  6. 对象整体读写方法:
    Time::setTime(int,int,int)方法:传递时分秒三个参数修改Time对象的时分秒数。该方法返回修改后的对象。
    Time::setTime(const T&)方法:传递一个参数修改Time对象的时分秒数。该方法返回修改后的对象。
    Time::getTime()方法:返回对象自身的引用。其实,t.getTime()即t。
    仅在Time类中的Time::getTime()方法实在是多余,在组合或者继承关系时才会有机会用到。
  7. Time::inputTime()方法:按格式从标准输入读取数据修改Time对象的时分秒数值。该方法返回修改后的对象。
  8. Time::showTime()方法:输出“hh:mm:ss”,不足两位的要前面补0。如果对象不是合法的时间,则输出“Time error”。
    注意:为了保证Time类的常量对象能够正确的调用Time类的方法,那些不修改对象数据成员的函数都应该是常量成员函数,在返回对象自身的引用时也应返回常量引用。
    你设计一个时间类Time,使得main()函数能够正确运行。
    函数调用格式见append.cc
    append.cc中已给出main()函数。main()函数内容稍微繁复,仅为测试对象的各种调用情况。

Input
输入的第一个整数n,表示有n组测试数据,每组3个整数:hh,mm,ss,分别表示时、分、秒,其值都在int范围内。

Output
开始部分为由main()函数产生的固定输出,用于测试对象的某些方法的调用情况。输出“Test data output :”之后为测试数据对应的输出:
每组测试数据对应一组输出“hh:mm:ss”,不足两位的输出需要前面补0。如果输入的时间不合法,则输出“Time error”。格式见sample。

Sample Input
6
0 0 1
0 59 59
1 1 60
23 0 0
23 59 59
24 1 0
Sample Output
Constant test output :
00:00:00
01:02:03
Time error

Test data output :
00:00:01
00:59:59
Time error
23:00:00
23:59:59
Time error

#include<bits/stdc++.h>
using namespace std;
class Time
{
private:
	int h, m, s;
public:
	Time()
	{
		h = 0;
		m = 0;
		s = 0;
	}
	Time(int _hour, int _minute, int _second)
	{
		h = _hour;
		m = _minute;
		s = _second;
	}
	Time(const Time& T)
	{
		h = T.h;
		m = T.m;
		s = T.s;
		cout << "There was a call to the copy constructor : " << h << "," << m << "," << s << endl;
	}
	int hour()const
	{
		return h;
	}
	int minute()const
	{
		return m;
	}
	int second()const
	{
		return s;
	}
	void hour(int _hour)
	{
		h = _hour;
	}
	void minute(int _minute)
	{
		m = _minute;
	}
	void second(int _second)
	{
		s = _second;
	}
	Time &setTime(int a, int b, int c)
	{
		h = a;
		m = b;
		s = c;
		return *this;
	}
	Time &setTime(Time& T)
	{
		h = T.h;
		m = T.m;
		s = T.s;
		return *this;
	}
	const Time &getTime()const
	{
		return *this;
	}
	Time& inputTime()
	{ 
		int a, b, c; 
		cin >> a >> b >> c; 
		h = a;
		m = b; 
		s = c;   
		return *this; 
	}
	void showTime()const
	{
		if (h * 3600 + m * 60 + s >= 24 * 3600 || m > 59 || s > 59 || h < 0 || s < 0 || m < 0)
		{
			cout << "Time error" << endl;
		}
		else
		{
			cout << setw(2) << setfill('0') << h << ":" << setw(2) << setfill('0') << m << ":" << setw(2) << setfill('0') << s << endl;
		}
	}
};
int main()
{
	cout << "Constant test output :" << endl;
	const Time c;
	const Time cc(1, 2, 3);
	const Time ccc(23, 60, 60);
	cout << setw(2) << setfill('0') << c.hour() << ":";
	cout << setw(2) << setfill('0') << c.minute() << ":";
	cout << setw(2) << setfill('0') << c.second() << endl;
	cc.getTime().showTime();
	ccc.showTime();

	cout << "\nTest data output :" << endl;
	Time t;
	int cases;
	cin >> cases;
	for (int i = 1; i <= cases; ++i)
	{
		if (i % 4 == 0)
		{
			int hour, minute, second;
			cin >> hour >> minute >> second;
			Time tt(hour, minute, second);
			tt.showTime();
		}
		if (i % 4 == 1)
		{
			int hour, minute, second;
			cin >> hour >> minute >> second;
			t.setTime(hour, minute, second).showTime();
		}
		if (i % 4 == 2)
			t.inputTime().showTime();
		if (i % 4 == 3)
		{
			int hour, minute, second;
			cin >> hour >> minute >> second;
			t.hour(hour);
			t.minute(minute);
			t.second(second);
			t.showTime();
		}
	}
}

Problem D: 时间类的12小时制输出

Description

封装一个时间类Time,用于时间处理的相关功能,支持24小时制和12小时制,支持以下操作:

  1. Time::Time()无参构造方法。
  2. Time::Time(int,int,int)构造方法:传递时分秒的三个参数构造对象。
  3. Time::Time(const T&)拷贝构造方法。
  4. 成员读函数:
    Time::hour() :返回Time的小时数;
    Time::minute():返回Time的分钟数;
    Time::second():返回Time的秒数。
  5. 成员写函数:
    Time::hour(int) :传参修改Time的小时数;
    Time::minute(int):传参修改Time的分钟数;
    Time::second(int):传参修改Time的秒数。
  6. 对象整体读写方法:
    Time::setTime(int,int,int)方法:传递时分秒三个参数修改Time对象的时分秒数。该方法返回修改后的对象。
    Time::setTime(const T&)方法:传递一个参数修改Time对象的时分秒数。该方法返回修改后的对象。
    Time::getTime()方法:返回对象自身的引用。其实,t.getTime()即t。
    仅在Time类中的Time::getTime()方法实在是多余,在组合或者继承关系时才会有机会用到。
  7. Time::inputTime()方法:按格式从标准输入读取数据修改Time对象的时分秒数值。该方法返回修改后的对象。
  8. Time::showTime()方法:输出“hh:mm:ss”,不足两位的要前面补0。如果对象不是合法的时间,则输出“Time error”。
  9. Time::showTime12Hour()方法:输出12小时制的时间:上午输出“hh:mm:ss a.m.”、下午输出“hh:mm:ss p.m.”。如果对象不是合法的时间,则输出“Time error”。注意:该函数仅显示12小时制时间,并不修改对象的数据成员,对象依然存储24小时制时间。
    12小时制以数字12、1、2、3、4、5、6、7、8、9、10、11依次序表示每个时段的。
    24小时制的00:00~00:59,是12小时制的12:00 a.m.~12:59 a.m.;
    24小时制的1:00~11:59是十二小时制的1:00 a.m.~11:59 a.m.。
    24小时制的12:00~12:59,是12小时制的12:00 p.m.~12:59 p.m.;
    24小时制的13:00~23:59是十二小时制的1:00 p.m.~11:59 p.m.。
    你设计一个时间类Time,使得main()函数能够正确运行。
    函数调用格式见append.cc
    append.cc中已给出main()函数。main()函数内容稍微繁复,仅为测试对象的各种调用情况。

Input
输入的第一个整数n,表示有n组测试数据,每组3个整数:hh,mm,ss,分别表示时、分、秒,其值都在int范围内。

Output
开始部分为由main()函数产生的固定输出,用于测试对象的某些方法的调用情况。输出“Test data output :”之后为测试数据对应的输出:
每组测试数据对应一组输出,奇数行的输入对应输出24小时制时间“hh:mm:ss”,偶数行的输入对应输出12小时制时间:上午输出“hh:mm:ss a.m.”、下午输出“hh:mm:ss p.m.”,不足两位的输出需要前面补0。如果输入的时间不合法,则输出“Time error”。格式见sample。

Sample Input
6
0 0 1
0 59 59
1 1 60
23 0 0
23 59 59
24 1 0
Sample Output
Constant test output :
11:59:58 a.m.
12:00:01 p.m.
11:59:58
12:00:01

Test data output :
00:00:01
12:59:59 a.m.
Time error
11:00:00 p.m.
23:59:59
Time error

#include<bits/stdc++.h>
using namespace std;
class Time
{
private:
	int h, m, s;
public:
	Time()
	{
		h = 0;
		m = 0;
		s = 0;
	}
	Time(int _hour, int _minute, int _second)
	{
		h = _hour;
		m = _minute;
		s = _second;
	}
	Time(const Time& T)
	{
		h = T.h;
		m = T.m;
		s = T.s;
		cout << "There was a call to the copy constructor : " << h << "," << m << "," << s << endl;
	}
	int hour()const
	{
		return h;
	}
	int minute()const
	{
		return m;
	}
	int second()const
	{
		return s;
	}
	void hour(int _hour)
	{
		h = _hour;
	}
	void minute(int _minute)
	{
		m = _minute;
	}
	void second(int _second)
	{
		s = _second;
	}
	Time& setTime(int a, int b, int c)
	{
		h = a;
		m = b;
		s = c;
		return *this;
	}
	Time& setTime(Time& T)
	{
		h = T.h;
		m = T.m;
		s = T.s;
		return *this;
	}
	const Time& getTime()const
	{
		return *this;
	}
	Time& inputTime()
	{
		int a, b, c;
		cin >> a >> b >> c;
		h = a;
		m = b;
		s = c;
		return *this;
	}
	void showTime()const
	{
		if (h * 3600 + m * 60 + s >= 24 * 3600 || m > 59 || s > 59 || h < 0 || s < 0 || m < 0)
		{
			cout << "Time error" << endl;
		}
		else
		{
			cout << setw(2) << setfill('0') << h << ":" << setw(2) << setfill('0') << m << ":" << setw(2) << setfill('0') << s << endl;
		}
	}
	void showTime12Hour()const
	{
		if (h * 3600 + m * 60 + s >= 24 * 3600 || m > 59 || s > 59 || h < 0 || s < 0 || m < 0)
		{
			cout << "Time error" << endl;
		}
		else if (h == 0)
		{
		    cout << setw(2) << setfill('0') << 12 << ":" << setw(2) << setfill('0') << m << ":" << setw(2) << setfill('0') << s << " a.m." << endl;
		}
		else if (h >= 1 && h < 12)
		{
			cout << setw(2) << setfill('0') << h << ":" << setw(2) << setfill('0') << m << ":" << setw(2) << setfill('0') << s << " a.m." << endl;
		}
		else if (h >= 12 && h < 13)
		{
			cout << setw(2) << setfill('0') << h << ":" << setw(2) << setfill('0') << m << ":" << setw(2) << setfill('0') << s << " p.m." << endl;
		}
		else if (h >= 13)
		{
			cout << setw(2) << setfill('0') << h-12 << ":" << setw(2) << setfill('0') << m << ":" << setw(2) << setfill('0') << s << " p.m." << endl;
		}
	}
};
int main()
{
	cout << "Constant test output :" << endl;
	const Time c(11, 59, 58);
	const Time cc(12, 0, 1);
	c.showTime12Hour();
	cc.showTime12Hour();
	c.showTime();
	cc.showTime();

	cout << "\nTest data output :" << endl;
	Time t;
	int cases;
	cin >> cases;
	for (int i = 1; i <= cases; ++i)
	{
		if (i % 4 == 0)
		{
			int hour, minute, second;
			cin >> hour >> minute >> second;
			Time tt(hour, minute, second);
			tt.showTime12Hour();
		}
		if (i % 4 == 1)
		{
			int hour, minute, second;
			cin >> hour >> minute >> second;
			t.setTime(hour, minute, second).showTime();
		}
		if (i % 4 == 2)
			t.inputTime().showTime12Hour();
		if (i % 4 == 3)
		{
			int hour, minute, second;
			cin >> hour >> minute >> second;
			t.hour(hour);
			t.minute(minute);
			t.second(second);
			t.showTime();
		}
	}
}


Problem E: 时间类的静态成员计数

Description

封装一个时间类Time,用于时间处理的相关功能,支持以下操作:

  1. Time::Time()无参构造方法。
  2. Time::Time(int,int,int)构造方法:传递时分秒的三个参数构造对象。
  3. Time::Time(const T&)拷贝构造方法。
  4. 对象整体读写方法:
    Time::setTime(int,int,int)方法:传递时分秒三个参数修改Time对象的时分秒数。该方法返回修改后的对象。
    Time::setTime(const T&)方法:传递一个参数修改Time对象的时分秒数。该方法返回修改后的对象。
    Time::getTime()方法:返回对象自身的引用。其实,t.getTime()即t。
    仅在Time类中的Time::getTime()方法实在是多余,在组合或者继承关系时才会有机会用到。
  5. Time::showTime()方法:输出“hh:mm:ss”,不足两位的要前面补0。如果对象不是合法的时间,则输出“Time error”。
  6. 静态成员方法:
    Time::getNumber()方法:返回程序中已创建的Time对象总数。
    Time::displayNumber()方法:输出程序中已创建的Time对象总数。
    注意:在用Time对象传递参数时应传对象的引用而不是直接传对象,返回对象时同样返回引用,以免产生多余的对象拷贝。多余的拷贝构造会引起对象计数的错误。
    你设计一个时间类Time,使得main()函数能够正确运行。
    函数调用格式见append.cc
    append.cc中已给出main()函数。main()函数内容稍微繁复,仅为测试对象的各种调用情况。

Input
输入为多行,每行为一组测试数据,每组3个整数:hh,mm,ss,分别表示时、分、秒,其值都在int范围内。

Output
开始部分为由main()函数产生的固定输出,用于测试对象的某些方法的调用情况。输出“Test data output :”之后为测试数据对应的输出:
每组测试数据对应一组输出“hh:mm:ss”,不足两位的输出需要前面补0。如果输入的时间不合法,则输出“Time error”。格式见sample。
最后一行输出一个整数n,表示有n组测试数据输入。

Sample Input
0 0 1
0 59 59
1 1 60
23 0 0
23 59 59
24 1 0
Sample Output
Static member test output :
Now, There is 0 object of Time.
Now, There is 1 object of Time.
There was a call to the copy constructor : 0,0,0
Now, There is 2 object of Time.
Now, There is 3 object of Time.
There was a call to the copy constructor : 1,2,3
Now, There is 4 object of Time.

Test data output :
00:00:01
00:59:59
Time error
23:00:00
23:59:59
Time error
6

#include<bits/stdc++.h>
using namespace std;
class Time
{
private:
	int h, m, s;
	static int num;
public:
	Time()
	{
		h = 0;
		m = 0;
		s = 0;
		num++;
	}
	Time(int _hour, int _minute, int _second)
	{
		h = _hour;
		m = _minute;
		s = _second;
		num++;
	}
	Time(const Time& T)
	{
		h = T.h;
		m = T.m;
		s = T.s;
		cout << "There was a call to the copy constructor : " << h << "," << m << "," << s << endl;
		num++;
	}
	int hour()const
	{
		return h;
	}
	int minute()const
	{
		return m;
	}
	int second()const
	{
		return s;
	}
	void hour(int _hour)
	{
		h = _hour;
	}
	void minute(int _minute)
	{
		m = _minute;
	}
	void second(int _second)
	{
		s = _second;
	}
	Time& setTime(int a, int b, int c)
	{
		h = a;
		m = b;
		s = c;
		return *this;
	}
	Time& setTime(Time& T)
	{
		h = T.h;
		m = T.m;
		s = T.s;
		return *this;
	}
	const Time& getTime()const
	{
		return *this;
	}
	void showTime()const
	{
		if (h * 3600 + m * 60 + s >= 24 * 3600 || m > 59 || s > 59 || h < 0 || s < 0 || m < 0)
		{
			cout << "Time error" << endl;
		}
		else
		{
			cout << setw(2) << setfill('0') << h << ":" << setw(2) << setfill('0') << m << ":" << setw(2) << setfill('0') << s << endl;
		}
	}
	static int getNumber()
	{
		return num;
	}
	static void displayNumber()
	{
		cout << "Now, There is " << num << " object of Time." << endl;
	}
};
int Time::num = 0;
int main()
{
	cout << "Static member test output :" << endl;
	Time::displayNumber();
	Time t;
	t.displayNumber();
	Time tt(t);
	tt.displayNumber();
	Time ttt(1, 2, 3);
	ttt.displayNumber();
	Time tttt(ttt.getTime());
	tttt.displayNumber();
	int non_cases = Time::getNumber();

	cout << "\nTest data output :" << endl;
	int hour, minute, second;
	while (cin >> hour >> minute >> second)
	{
		Time t;
		t.setTime(hour, minute, second).showTime();
	}
	cout << t.getNumber() - non_cases << endl;
}


Problem F: 时间类的加、减法赋值运算

Description

封装一个时间类Time,在类上重载以下运算符,使得main()函数能够正确运行。

  1. Time::Time()无参构造方法。
  2. Time::inputTime()方法:按格式从标准输入读取数据修改Time对象的时分秒数值。该方法返回修改后的对象。
  3. Time::showTime()方法:输出“hh:mm:ss”,不足两位的要前面补0。如果对象不是合法的时间,则输出“Time error”。
  4. 运算符
    加法赋值运算符“+=”和减法赋值运算符“-=”:把一个整数m加到Time对象自身,并且仅对合法的时间操作,不会产生不合法的时间,比如:
    若原时间对象为“00:00:00”,减去2后的对象为“23:59:58”;
    若原时间对象为“23:59:59”,加上1后的对象为“00:00:00”;
    若原时间对象为“24:60:60”,加减后的对象仍为“24:60:60”
    函数调用格式见append.cc
    append.cc中已给出main()函数

Input
输入的第一个整数n,表示有n组测试数据,每组4个整数,前三个整数为:hh,mm,ss,分别表示时、分、秒,其值都在int范围内,最后一个整数为m。

Output
每个输入对应两行输出,分别为时间“hh,mm,ss”加上m秒和减去m秒后的值。错误的时间输出“Time error”

Sample Input
6
0 0 1 2
0 59 59 1
1 1 60 10
23 0 0 60
23 59 59 100
24 1 0 3
Sample Output
00:00:03
23:59:59
01:00:00
00:59:58
Time error
Time error
23:01:00
22:59:00
00:01:39
23:58:19
Time error
Time error

#include<bits/stdc++.h>
using namespace std;
class Time
{
private:
	int h, m, s,k;
public:
	Time() { h = 0; m = 0; s = 0; }
	Time(int _h, int _m, int _s) { h = _h; m = _m; s = _s; }
	Time(const Time& T) { h = T.h; m = T.m; s = T.s; }
	~Time(){}
	Time& inputTime()
	{
		int a, b, c;
		cin >> a >> b >> c;
		h = a; m = b; s = c;
		return *this;
	}
	void showTime()
	{
		if (h * 3600 + m * 60 + s >= 24 * 3600 || m > 59 || s > 59 || h < 0 || s < 0 || m < 0)
		{
			cout << "Time error" << endl;
		}
		else
		{
			cout << setw(2) << setfill('0') << h << ":" << setw(2) << setfill('0') << m << ":" << setw(2) << setfill('0') << s << endl;
		}
	}
	Time& operator +=(int t)
	{
		if (h * 3600 + m * 60 + s >= 24 * 3600 || m > 59 || s > 59 || h < 0 || s < 0 || m < 0)
			return *this;
		else
		{
			k = (h * 3600 + m * 60 + s + t) % (24 * 3600);
			h = k / 3600;
			m = (k - h * 3600) / 60;
			s = k - h * 3600 - m * 60;
			return *this;
		}
	}
	Time& operator -=(int t)
	{
		if (h * 3600 + m * 60 + s >= 24 * 3600 || m > 59 || s > 59 || h < 0 || s < 0 || m < 0)
			return *this;
		else
		{
			k = (h * 3600 + m * 60 + s - t + 24 * 3600) % (24 * 3600);
			h = k / 3600;
			m = (k - h * 3600) / 60;
			s = k - h * 3600 - m * 60;
			return *this;
		}
	}
};
int main()
{
	int cases;
	cin >> cases;
	for (int i = 1; i <= cases; ++i)
	{
		Time t;
		t.inputTime();
		Time tt(t);
		int num;
		cin >> num;
		t += num;
		t.showTime();
		tt -= num;
		tt.showTime();
	}
}


Problem G: 时间类的流插入、提取和递增、递减运算

Description

封装一个时间类Time,在类上重载以下运算符,使得main()函数能够正确运行。
流插入操作符“>>”,按照输入格式从标准输入读取三个整数:hh,mm,ss,分别表示时、分、秒,其值在int范围内。
流提取操作符“<<”;按照“hh:mm:ss”输出Time类的对象,不合法的时间输出“error!!!”。
前置自增运算符“++”:把时间对象的秒数加1并返回。
前置自减运算符“–”:把时间对象的秒数减1并返回。
后置自增运算符“++”:把时间对象的秒数加1,返回原值。
后置自减运算符“–”:把时间对象的秒数减1,返回原值。
以上4个自增、自减仅对合法的时间操作,并且不会产生不合法的时间。比如:
若原时间对象为“00:00:00”,自减运算后的对象为“23:59:59”;
若原时间对象为“23:59:59”,自增运算后的对象为“00:00:00”;
若原时间对象为“24:60:60”,自增或自减运算后对象仍为“24:60:60”。
函数调用格式见append.cc
append.cc中已给出main()函数

Input
输入的第一个整数n,表示有n组测试数据,每组3个整数:hh,mm,ss,分别表示时、分、秒,其值都在int范围内。

Output
输出一张表:每列8个字符宽,两列之间有一个空格。
首先,输出一个表头:“++t --t t t-- t++ t ”,
其次,对应每组测试数据在一行内依次以下内容:
前置++、前置–、原值、后置–、后置++、原值。
若输入的日期合法,输出格式为“hh:mm:ss”,不足两位的输出需要前面补0。如果输入的时间不合法,则输出“error!!!”。格式见sample。

Sample Input
6
0 0 1
0 59 59
1 1 60
23 0 0
23 59 59
24 1 0
Sample Output
++t --t t t-- t++ t
00:00:02 00:00:01 00:00:01 00:00:01 00:00:00 00:00:01
01:00:00 00:59:59 00:59:59 00:59:59 00:59:58 00:59:59
error!!! error!!! error!!! error!!! error!!! error!!!
23:00:01 23:00:00 23:00:00 23:00:00 22:59:59 23:00:00
00:00:00 23:59:59 23:59:59 23:59:59 23:59:58 23:59:59
error!!! error!!! error!!! error!!! error!!! error!!!

#include <iostream>
#include <iomanip>
using namespace std;
class Time
{
private:
	int h, m, s;
	int flag;
public:
	friend istream& operator >> (istream& is, Time& t)
	{
		is >> t.h >> t.m >> t.s;
		if (t.h > 23 || t.h < 0 || t.m>59 || t.m < 0 || t.s>59 || t.s < 0)
			t.flag = 1;
		else t.flag = 0;
		return is;
	}
	friend ostream& operator << (ostream & os, const Time & t)
	{
		if (t.h * 3600 + t.m * 60 + t.s >= 24 * 3600 || t.h < 0 || t.s < 0 || t.m < 0 || t.m>59 || t.s>59) { os << "error!!!"; }
		else { os << setw(2) << setfill('0') << t.h << ":" << setw(2) << t.m << ":" << setw(2) << t.s; }
		return os;
	}
	Time& operator ++ ()
	{
		if (h * 3600 + m * 60 + s >= 24 * 3600 || h < 0 || s < 0 || m < 0 || m>59 || s>59)
			return *this;
		else
		{
			flag = ((h * 3600 + m * 60 + s) + 1) % (24 * 3600);
			h = flag / 3600;
			m = (flag - h * 3600) / 60;
			s = flag - h * 3600 - m * 60;
			return *this;
		}
	}
	Time & operator --()
	{
		if (h * 3600 + m * 60 + s >= 24 * 3600 || h < 0 || s < 0 || m < 0 || m>59 || s>59)
			return *this;
		else
		{
			flag = ((h * 3600 + m * 60 + s) - 1 + 24 * 3600) % (24 * 3600);
			h = flag / 3600;
			m = (flag - h * 3600) / 60;
			s = flag - h * 3600 - m * 60;
			return *this;
		}
	}
	Time operator ++ (int)
	{
		Time t = (*this);
		if (h * 3600 + m * 60 + s >= 24 * 3600 || h < 0 || s < 0 || m < 0 || m>59 || s>59)
			return t;
		else
		{
			flag = ((h * 3600 + m * 60 + s) + 1) % (24 * 3600);
			h = flag / 3600;
			m = (flag - h * 3600) / 60;
			s = flag - h * 3600 - m * 60;
			return t;
		}
	}
	Time operator --(int)
	{
		Time t = (*this);
		if (h * 3600 + m * 60 + s >= 24 * 3600 || h < 0 || s < 0 || m < 0 || m>59 || s>59)
			return t;
		else
		{
			flag = ((h * 3600 + m * 60 + s) - 1 + 24 * 3600) % (24 * 3600);
			h = flag / 3600;
			m = (flag - h * 3600) / 60;
			s = flag - h * 3600 - m * 60;
			return t;
		}
	}
};

int main()
{
	Time t;
	int cases;
	cin >> cases;
	cout << setw(8) << left << "++t" << " ";
	cout << setw(8) << left << "--t" << " ";
	cout << setw(8) << left << "t" << " ";
	cout << setw(8) << left << "t--" << " ";
	cout << setw(8) << left << "t++" << " ";
	cout << setw(8) << left << "t" << right << endl;
	for (int i = 1; i <= cases; ++i)
	{
		cin >> t;
		cout << (++t) << " ";
		cout << (--t) << " ";
		cout << t << " ";
		cout << t-- << " ";
		cout << t++ << " ";
		cout << t << endl;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值