解答例 - j2.lesson03.AlarmClock

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 / 6060;
        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(23150);
        clock.show();
        
        // 現在の時刻にセット
        clock.setAlarmFor(23150);
        // アラームが鳴るはず
        
        // 5時にセット
        clock.setAlarmFor(500);
        
        // 2時間進める
        clock.tick(3600);
        clock.show();
        
        // 2時間進める
        clock.tick(3600);
        clock.show();
        
        // 2時間進める
        clock.tick(3600);
        // アラームが鳴るはず
        clock.show();
    }
}