package j2.lesson03;
/**
* 課題1603 - 解答例.
* アラームつきの時計を表すクラス.
* @author arakawa
* @version $Id: AlarmClock_java.rps,v 1.1 2006/03/06 12:56:15 java2005 Exp $
*/
public class AlarmClock {
/** 時刻を秒で表す */
private int time;
/** アラームが有効かどうか. */
private boolean alarm;
/** アラームを鳴らすまでの秒数. */
private int alarmRest;
/**
* 初期時刻を指定してインスタンスを生成する。
* @param hour 時
* @param minute 分
* @param second 秒
*/
public AlarmClock(int hour, int minute, int second) {
this.time = hour * 3600 + minute * 60 + second;
}
/**
* アラームをセットする。
* すでにアラームがセットされていた場合、それは解除される。
* @param hour アラームを鳴らす時
* @param minute アラームを鳴らす分
* @param second アラームを鳴らす秒
*/
public void setAlarmFor(int hour, int minute, int second) {
int alarmTime = hour * 3600 + minute * 60 + second;
// 現在時刻よりも手前にあれば、明日に鳴らす
if (alarmTime < this.time) {
this.alarmRest = alarmTime - this.time + 86400;
}
else {
this.alarmRest = alarmTime - this.time;
}
this.alarm = true;
// 必要ならばすぐにアラーム
alarm();
}
/**
* n 秒だけ進める。
* @param n 進める秒数
*/
public void tick(int n) {
this.time += n;
this.time %= 86400;
// アラームの残り時間を減らして、必要ならば鳴らす
this.alarmRest -= n;
alarm();
}
/**
* 現在時刻を表示する。
*/
public void show() {
// 現在時刻の 時, 分, 秒 を h, m, s で表すとして
// print h + "時" + m + "分" + s + "秒", 改行
int h = this.time / 3600;
int m = (this.time / 60) % 60;
int s = this.time % 60;
System.out.println(h + "時" + m + "分" + s + "秒");
}
/**
* 必要ならばアラームを鳴らす。
*/
private void alarm() {
if (this.alarm && this.alarmRest <= 0) {
System.out.println("アラーム");
this.alarm = false;
}
}
/**
* テストプログラム。自由に作成してよい。
* @param args 無視される
*/
public static void main(String[] args) {
// 23時15分
AlarmClock clock = new AlarmClock(23, 15, 0);
clock.show();
// 現在の時刻にセット
clock.setAlarmFor(23, 15, 0);
// アラームが鳴るはず
// 5時にセット
clock.setAlarmFor(5, 0, 0);
// 2時間進める
clock.tick(2 * 3600);
clock.show();
// 2時間進める
clock.tick(2 * 3600);
clock.show();
// 2時間進める
clock.tick(2 * 3600);
// アラームが鳴るはず
clock.show();
}
}
|