Homework9_ch7 继承和派生(2)

该博客主要讨论了C++中时钟类Clock和闹钟类AlarmClock的设计,包括时间显示、计时、闹钟设置和声音效果。同时,还介绍了日期时间类CMyDateTime的实现,包括日期、时间的设置、显示、转换和日期时间的递增操作。通过多个示例展示了类的使用,涉及多文件组织和输入输出操作。
摘要由CSDN通过智能技术生成

一、时钟-闹钟类

在时钟类Clock的基础上派生闹钟类AlarmClock

1)时钟类Clock

Clock类设计如下,请实现成员函数。

class  Clock

{ private:

     int Hour, Minute, Second;            //24小时制的时间数据

 public:

     Clock(int hour, int minute, int second);       

     void ShowTime();                       //显示时间功能

       void Tick();                                //计时功能,每一次Tick,时间向前走1

       void SetTime(int NewH, int NewM, int NewS);          //重新设定时间值

 };

2)闹钟类AlarmClock

功能基本要求:

闹钟类继承时钟类,闹钟的功能包括计时闹铃

  1. 设计AlarmClock(闹钟)类:

a) 增加表示闹铃时间的数据成员,闹铃时间精确到小时 : 分钟

b) 构造函数构造新闹钟对象,初始化时钟时间和闹铃时间;

c) 成员函数Alarm()的功能是:当闹铃时间到时,增加实际的声音效果“嘀嘀嘀……”;

d) 成员函数SetAlarmTime(…)用来重新设置闹铃的时间值;

e) 重载Tick()函数,保持计时功能,增加判定是否到达闹铃时间的功能,如果到达闹铃时间则响铃(Alarm());

3)主程序

使用AlarmClock类。

a)创建AlarmClock类的对象,给它初始时间值(比如:235930),闹铃时间值(比如: 0001 表示01分)和它要走的时长(比如:215秒),发出启动命令后,让它一秒一秒地走起来,并且显示它的每个时间值(包含时:分:秒)。

b)当到达闹铃时间时,增加实际的声音效果“嘀嘀嘀……”。

c)等到预订的时长完成时,输出计时结束信息。

d)以上的计时过程可以重复多次。

4)输入输出样例:

请输入初始时间(时 秒):23 59 45(回车)

请输入闹铃时间(时 分)  0 1 (回车)

请输入计时时长(分 秒)  2 30(回车)

23:59:45        //(这里在相同的位置显示从235945秒到0215秒)

                     //(其中,在00:01:0000:01:59期间,增加声音“嘀嘀嘀...... )

计时结束,还要继续吗(Y/N)?Y(回车)

请输入初始时间(时 秒):2 5 3(回车)

请输入闹铃时间(时 分)  2 6 (回车)

请输入计时时长(分 秒)  2 15(回车)

02:05:03        //(这里在相同的位置显示从253秒到2718秒)

                     //(其中,在02:06:0002:06:59期间,增加声音“嘀嘀嘀...... )

计时结束,还要继续吗(Y/N)?Y(回车)

……..                                 //(以上过程重复)

计时结束,还要继续吗(Y/N)?N(回车)

Press any key to continue

(5) 本程序请使用多文件组织

clock.h   clock.cpp

alarm.h   alarm.cpp

main.cpp

(6)编程提示:

  a字符’\7’ (响铃)可以让计算机发出“嘀”声,例如:

cout << '\7' << '\7' << '\7';   

b)字符’\r’ (回车)可以控制输出的内容在同样的位置

函数“Sleep()”可以让程序暂停,参见以下代码

       #include <iostream>

#include<windows.h>

using namespace std;

int main()

{     for(int i=0;i<10;i++)

       {     cout<<i<<"    "<<'\r';

              Sleep(1000);

       }

       return 0;

}

(c)设置输出格式的相关操作:

setw(int)可以设置输出内容的宽度;

setfill(char)可以设置前导符号;

这些格式设置操作的使用要求包含头文件<iomanip>

例:

char s[5]=”abc”;

cout<<setw(10)<<setfill('%')<<s<<endl;

将输出:

%%%%%%%abc

//clock.h
#pragma once
class Clock {
public:
	Clock(int hour, int minute, int second);
	void ShowTime();
	void Tick();
	void SetTime(int NewH, int NewM, int NewS);
	int getHour() {
		return Hour;
	}
	int getMin() {
		return Minute;
	}
private:
	int Hour, Minute, Second;
	void Standard();
};
//alarmclock.h
#pragma once
#include"clock.h"
class AlarmClock: public Clock {
public:
	AlarmClock(int, int, int, int, int);
	void Alarm();
	void SetAlarmTime(int, int);
	void Tick();
private:
	int AlarmHour, AlarmMin;
};
//clock.cpp
#include"clock.h"
#include<iostream>
#include<iomanip>
using namespace std;
void Clock::Standard()
{
	Minute += Second / 60;
	Second %= 60;
	Hour += Minute / 60 ;
	Minute %= 60;
	Hour %= 24;
}
Clock::Clock(int hour, int minute, int second)
{
	Hour = hour;
	Minute = minute;
	Second = second;
	this->Standard();
}
void Clock::ShowTime()
{
	cout << setw(2) << setfill('0') << Hour << ":" << setw(2) << setfill('0') << Minute << ":" << setw(2) << setfill('0') << Second << ends;
}
void Clock::Tick()
{
	Second++;
	this->Standard();
}
void Clock::SetTime(int NewH, int NewM, int NewS)
{
	Hour = NewH;
	Minute = NewM;
	Second = NewS;
	this->Standard();
}
//alarmclock.cpp
#include"alarmclock.h"
#include<iostream>
using namespace std;
AlarmClock::AlarmClock(int a, int b, int c, int d, int e):Clock(a,b,c)
{
	AlarmHour = d;
	AlarmMin = e;
}
void AlarmClock::Alarm()
{
	cout << "\a" << ends;
}
void AlarmClock::SetAlarmTime(int a, int b)
{
	AlarmHour = a;
	AlarmMin = b;
}
void AlarmClock::Tick()
{
	this->Clock::Tick();
	if (AlarmHour == this->getHour() && AlarmMin == this->getMin()) {
		this->Alarm();
	}
	this->ShowTime();
}
//main.cpp
#include"alarmclock.h"
#include"clock.h"
#include<iostream>
#include<Windows.h>
using namespace std;
int main() {
	char op;
	do {
		int h, m, s;
		cout << "请输入初始时间(时 分 秒):";
		cin >> h >> m >> s;
		int ah, am;
		cout << "请输入闹钟时间(时 分):";
		cin >> ah >> am;
		AlarmClock a(h, m, s, ah, am);
		int cm, cs, t;
		cout << "请输入计时时长(分 秒):";
		cin >> cm >> cs;
		t = cm * 60 + cs;
		while (t--) {
			a.Tick();
			cout << "\r";
			Sleep(1000);
		}
		cout << "计时结束,还要继续吗(Y/N)?";
		cin >> op;
	} while (op == 'Y' || op == 'y');
	return 0;
}


 

 

二(上机思考题)、日期时间类CMyDateTime

1)设计日期类CMyDate . 描述年、月、日,设计构造函数、Set函数、Next函数(表示明天)、Display函数等。

2)设计时间类CMyTime . 描述小时、分钟、秒,设计构造函数、Set函数、Next函数(表示下1秒)、Display函数等。

3)设计日期时间类CMyDateTime, 日期时间类继承日期类和时间类。日期时间类的数据有:年、月、日、小时、分钟、秒,设计构造函数、Set函数、Next函数(表示下1秒)、Display函数等。

4)输入输出样例:

       开始日期时间类的测试:

请输入日期时间值(年 秒):2015 5 6 10 29 30

       现在的日期时间值是:2015-05-06 10:29:30

       下一个日期时间值是:2015-05-06 10:29:31

       继续吗?(Y/N):Y

       请输入日期时间值(年 秒):2015 5 6 10 29 59

现在的日期时间值是:2015-05-06 10:29:59

       下一个日期时间值是:2015-05-06 10:30:00

       继续吗?(Y/N):Y

       请输入日期时间值(年 秒):2015 5 6 23 59 59

现在的日期时间值是:2015-05-06 23:59:59

       下一个日期时间值是:2015-05-07 00:00:00

       继续吗?(Y/N):Y

       请输入日期时间值(年 秒):2015 5 31 23 59 59

现在的日期时间值是:2015-05-31 23:59:59

       下一个日期时间值是:2015-06-01 00:00:00

       继续吗?(Y/N):Y

       请输入日期时间值(年 秒):2015 12 31 23 59 59

现在的日期时间值是:2015-12-31 23:59:59

       下一个日期时间值是:2016-01-01 00:00:00

       继续吗?(Y/N):N

       Press any key to continue……

5)本程序使用多文件组织

       如:

       mydate.h              mydate.cpp

       mytime.h              mytime.cpp

       mydatetime.h        mydatetime.cpp

       testdatetime.cpp

//cmydate.h
#pragma once
class CMyDate {
public:
	CMyDate(int, int, int);
	void Set(int, int, int);
	void Next();
	void Display();
private:
	int Day;
	int Mouth;
	int Year;
	const int M[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
	int R;   //闰年标记
};
//cmydate.cpp
#include"cmydate.h"
#include<iostream>
#include<iomanip>
using namespace std;
CMyDate::CMyDate(int d, int m, int y)
{
	Day = d;
	Mouth = m;
	Year = y;
	if ((Year / 4 == 0 && Year / 100 != 0) || Year / 400 == 0) R = 1;
}
void CMyDate::Set(int d, int m, int y) {
	Day = d;
	Mouth = m;
	Year = y;
	if ((y / 4 == 0 && y / 100 != 0) || y / 400 == 0) R = 1;
}
void CMyDate::Next() {
	Day++;
	if (Mouth == 2&&Day>M[Mouth]+R) {
		Mouth++;
		Day -= M[Mouth] + R;
	}
	else if (Day > M[Mouth]) {
		Day -= M[Mouth];
		Mouth++;
		if (Mouth > 12) {
			Year++;
			Mouth -= 12;
		}
	}
}
void CMyDate::Display()
{
	cout << Year << '-' << setw(2) << setfill('0') << Mouth << "-" << setw(2) << setfill('0') << Day;
}
//cmytime.h
#pragma once
class CMyTime {
public:
	CMyTime(int, int, int);
	void Set(int, int, int);
	bool Next();
	void Display();
private:
	int Second;
	int Minute;
	int Hour;
	bool Standard();
};
//cmytime.cpp
#include"cmytime.h"
#include<iostream>
#include<iomanip>
using namespace std;
bool CMyTime::Standard()
{
	Minute += Second / 60;
	Second %= 60;
	Hour += Minute / 60;
	Minute %= 60;
	if (Hour == 24) {
		Hour %= 24; return true;
	}
	return false;
}
CMyTime::CMyTime(int h, int m, int s)
{
	Hour = h;
	Minute = m;
	Second = s;
	this->Standard();
}
void CMyTime::Set(int h, int m, int s)
{
	Hour = h;
	Minute = m;
	Second = s;
	this->Standard();
}
bool CMyTime::Next()
{
	Second++;
	if(this->Standard()) return true;
	return false;
}
void CMyTime::Display()
{
	cout << setw(2) << setfill('0') << Hour << ':' << setw(2) << setfill('0') << Minute << ':' << setw(2) << setfill('0') << Second;
}
//CMyDateTime.h
#pragma once
#include"cmytime.h"
#include"cmydate.h"
class CMyDateTime : public CMyDate, public CMyTime {
public:
	CMyDateTime(int, int, int, int, int, int);
	void Display();
	void Set(int, int, int, int, int, int);
	void Next();
};
//CMyDateTime.cpp
#include"CMyDateTime.h"
#include<iostream>
using namespace std;
CMyDateTime::CMyDateTime(int y, int m, int d, int h, int mi, int s):CMyDate(d,m,y), CMyTime(h,mi,s)
{
}
void CMyDateTime::Display()
{
	this->CMyDate::Display();
	cout << " ";
	this->CMyTime::Display();
}
void CMyDateTime::Set(int y, int m, int d, int h, int mi, int s)
{
	this->CMyDate::Set(d, m, y);
	this->CMyTime::Set(h, mi, s);
}
void CMyDateTime::Next()
{
	if (this->CMyTime::Next()) {
		this->CMyDate::Next();
	}
}
//main.cpp
#include<iostream>
#include"CMyDateTime.h"
using namespace std;
int main() {
	cout << "开始日期时间类的测试" << endl;
	char op;
	do {
		int y, m, d, h, mi, s;
		cout << "请输入日期时间值(年 月 日 时 分 秒):";
		cin >> y >> m >> d >> h >> mi >> s;
		CMyDateTime DT(y, m, d, h, mi, s);
		cout << "现在的日期时间值是:";
		DT.Display();
		cout << endl;
		DT.Next();
		cout << "下一个日期时间值是:";
		DT.Display();
		cout << endl;
		cout << "继续吗?(Y/N):";
		cin >> op;
	} while (op == 'Y' || op == 'y');
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值