old « Java 1525 | メイン | テイルズの広告 » new

Java 1603,1604

2006年10月20日

同学校の人向け。

16週の課題出来たので参考にどうぞ。

課題3は無駄がありそうな気もしますが一応テスト通ってるのでOKと言うことで。
ちなみに難易度は課題3>課題4です。

課題4はヒントを参考にしてboolean型配列を使ってます。
int型を使う場合は全く参考にならないので自力でどうぞ。
int型でやるよりboolean型でやった方が多分遥かに簡単かと。

AlarmClock

package j2.lesson03;

import java.io.*;

public class AlarmClock {

//現在の時刻(秒)
private int time;
//アラーム設定時間(秒)
private int atime;
//アラームの状態 セットor解除
private boolean aset;

public AlarmClock(int hour, int minute, int second){
this.time = (hour * 3600 + minute * 60 + second)%86400;
this.aset = false;
}

public void setAlarmFor(int hour, int minute, int second){
this.aset = true;
//秒に変換してアラームセット
this.atime = (hour * 3600 + minute * 60 + second)%86400;
//丁度現在の時刻と同じならばアラーム発動
if(this.time == atime && this.aset)
alarm();
}

public void tick(int n){
//時間を進めるか戻すか
boolean plus;
if(n >= 0)plus = true;
else plus = false;

//現時刻よりアラーム時刻が前ならば、アラーム時刻に1日分加算する
int timebefore = this.time;
if(timebefore > this.atime)
this.atime += 86400;

this.time += n;

//アラームがセットされていれば
if(this.aset){
//進める場合
if(this.time >= atime && plus && timebefore < this.atime)
alarm();
//戻す場合
else if(this.time <= atime && !plus && timebefore > this.atime)
alarm();
}

//1日(86400秒)以上の秒数を除去
this.time %= 86400;
}

public void show(){
int h = this.time / 3600;
int m = (this.time / 60) % 60;
int s = this.time % 60;
System.out.println(h + "時" + m + "分" + s + "秒");
}

public void alarm(){
System.out.println("アラーム");
//アラーム解除
this.aset = false;
}

public static void main(String[] args) throws IOException {


}
}

IntegerSet

package j2.lesson03;

public class IntegerSet {

//boolean配列
private boolean[] a;

//0から100までの値を格納できる整数の集合を作成する
public IntegerSet(){
a = new boolean[101];
for(int i =0; i<=a.length-1; i++){
a[i] = false;
}
}

//この集合に値を追加する。すでに指定した値が存在する場合は何もしない。
public void add(int n){
a[n] = true;
}

//この集合から値を取り除く。指定した値が存在しない場合は何もしない。
public void remove(int n){
a[n] = false;
}

//この集合に指定した値が存在するかどうか調べる。
public boolean contains(int n){
return a[n];
}

//この集合に格納されている値の個数を返す。初期状態では 0, 最大で101
public int size(){
int count = 0;
for(int i=0; i<=a.length-1; i++){
if(a[i])count++;
}
return count;
}

//この集合と引数に与えられた集合の和集合(*1)を新しく作成する。この操作によってもとの集合に副作用はない。
public IntegerSet union(IntegerSet other){
IntegerSet b = new IntegerSet();
for(int i=0; i<=other.a.length-1; i++){
if(this.a[i] || other.a[i])
b.a[i] = true;
}
return b;
}

//この集合と引数に与えられた集合の積集合(*1)を新しく作成する。この操作によってもとの集合に副作用はない。
public IntegerSet intersection(IntegerSet other){
IntegerSet b = new IntegerSet();
for(int i=0; i<=other.a.length-1; i++){
if(this.a[i] && other.a[i])
b.a[i] = true;
}
return b;
}

//この集合を整数型の配列に変換して返す。この集合に含まれる値が返される配列に昇順に格納される。返される配列の長さは this.size() に等しい。
public int[] toIntArray(){
int[] x = new int[this.size()];
int index = 0;
for(int i=0; i<=this.a.length-1; i++){
if(this.a[i]){
x[index] = i;
index++;
}
}
return x;
}
}
このエントリーをはてなブックマークに追加

old « Java 1525 | メイン | テイルズの広告 » new

トラックバックURL

このエントリーのトラックバックURL:
http://blog.hp-improve.com/mt/mt-tb.cgi/121

コメントする