一、时钟-闹钟类
在时钟类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
功能基本要求:
闹钟类继承时钟类,闹钟的功能包括计时和闹铃。
- 设计AlarmClock(闹钟)类:
a) 增加表示闹铃时间的数据成员,闹铃时间精确到小时 : 分钟;
b) 构造函数构造新闹钟对象,初始化时钟时间和闹铃时间;
c) 成员函数Alarm()的功能是:当闹铃时间到时,增加实际的声音效果“嘀嘀嘀……”;
d) 成员函数SetAlarmTime(…)用来重新设置闹铃的时间值;
e) 重载Tick()函数,保持计时功能,增加判定是否到达闹铃时间的功能,如果到达闹铃时间则响铃(Alarm());
(3)主程序
使用AlarmClock类。
a)创建AlarmClock类的对象,给它初始时间值(比如:23:59:30),闹铃时间值(比如: 00:01 表示0点1分)和它要走的时长(比如:2分15秒),发出启动命令后,让它一秒一秒地走起来,并且显示它的每个时间值(包含时:分:秒)。
b)当到达闹铃时间时,增加实际的声音效果“嘀嘀嘀……”。
c)等到预订的时长完成时,输出计时结束信息。
d)以上的计时过程可以重复多次。
(4)输入输出样例:
请输入初始时间(时 分 秒):23 59 45(回车)
请输入闹铃时间(时 分) :0 1 (回车)
请输入计时时长(分 秒) :2 30(回车)
23:59:45 //(这里在相同的位置显示从23时59分45秒到0时2分15秒)
//(其中,在00:01:00到00:01:59期间,增加声音“嘀嘀嘀......” )
计时结束,还要继续吗(Y/N)?Y(回车)
请输入初始时间(时 分 秒):2 5 3(回车)
请输入闹铃时间(时 分) :2 6 (回车)
请输入计时时长(分 秒) :2 15(回车)
02:05:03 //(这里在相同的位置显示从2时5分3秒到2时7分18秒)
//(其中,在02:06:00到02: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;
}