Java 1801, 1802, 1803, 1804
2006年11月14日
同学校の人向け。
Prism
package j2.lesson05;PrismAction
public class Prism {
//底面
private final Polygon base;
//高さ
private final double height;
//コンストラクタ
public Prism(Polygon base, double height){
this.base = base;
this.height = height;
}
//この直角柱の体積を計算する。
//直角柱の体積は、底面積 * 高さで計算できる。
public double volume(){
return base.area() * height;
}
//この直角柱の表面積を計算する。
//直角柱の表面積は、底面積 * 2 + 底面の各辺の長さ * 高さ で計算できる
public double surfaceArea(){
return base.area() * 2 + base.perimeter() * height;
}
//この直角柱の文字列表現を取得する。
//文字列の形式は "Prism(" + base + "," + height + ")"
public String toString(){
return "Prism(" + base + "," + height + ")";
}
}
package j2.lesson05;AlarmClock18
import java.io.*;
public class PrismAction {
//メインメソッド
public static void main(String[] args) throws IOException{
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
// type = 0
int type = 0;
// while type が 1 でも 2 でもない
while(type != 1 && type != 2){
// print "底面の図形を入力(1-三角形,2-長方形):"
System.out.print("底面の図形を入力(1-三角形,2-長方形):");
// type = コンソール入力 (int)
type = Integer.parseInt(reader.readLine());
}
// Polygon 型で base を宣言
Polygon base = new Polygon();
// if 三角形が選択された (type = 1)
if(type ==1){
// print "三角形が選択されました。", 改行
System.out.println("三角形が選択されました。");
// print "三角形の辺aの長さを入力:"
System.out.print("三角形の辺aの長さを入力:");
// a = コンソール入力 (double)
double a = Double.parseDouble(reader.readLine());
// print "三角形の辺bの長さを入力:"
System.out.print("三角形の辺bの長さを入力:");
// b = コンソール入力 (double)
double b = Double.parseDouble(reader.readLine());
// print "三角形の辺cの長さを入力:"
System.out.print("三角形の辺cの長さを入力:");
// c = コンソール入力 (double)
double c = Double.parseDouble(reader.readLine());
// base = 辺 a, b, c を持つ新しい三角形インスタンス
base = new Triangle(a,b,c);
}
// else
else{
// print "長方形が選択されました。", 改行
System.out.println("長方形が選択されました。");
// print "長方形の底辺の長さを入力:"
System.out.print("長方形の底辺の長さを入力:");
// width = コンソール入力 (double)
double width = Double.parseDouble(reader.readLine());
// print "長方形の高さを入力:"
System.out.print("長方形の高さを入力:");
// height = コンソール入力 (double)
double height = Double.parseDouble(reader.readLine());
// base = width, height を持つ新しい長方形インスタンス
base = new Rectangle(width,height);
}
// print "角柱の高さを入力:"
System.out.print("角柱の高さを入力:");
// height = コンソール入力 (double)
double height = Double.parseDouble(reader.readLine());
// prism = base, height を持つ新しい角柱インスタンス
Prism prism = new Prism(base, height);
// print prism, 改行
System.out.println(prism);
// print "体積は" + prism.volume(), 改行
System.out.println("体積は" + prism.volume());
// print "表面積は" + prism.surfaceArea(), 改行
System.out.println("表面積は" + prism.surfaceArea());
}
}
package j2.lesson05;TrackTurtle
public class AlarmClock18 extends Clock {
//アラーム設定時間(秒)
private int atime;
//アラームの状態 セットor解除
private boolean aset;
public AlarmClock18(int hour, int minute, int second) {
//現在時刻を秒に変換
super(hour,minute,second);
//アラーム解除
this.aset = false;
}
public void setAlarmFor(int hour, int minute, int second) {
//アラームセット
this.aset = true;
//秒に変換してアラームセット
this.atime = (hour * 3600 + minute * 60 + second)%86400;
//丁度現在の時刻と同じならばアラーム発動
if(getTimeAsSec() == atime && this.aset)
alarm();
}
public void tick(int n){
//現時刻よりアラーム時刻が前ならば、アラーム時刻に1日分加算する
int timebefore = getTimeAsSec();
if(timebefore > this.atime){
this.atime += 86400;
}
//n秒進めて日付が変わるかどうか先に調べる
boolean nextDay = false;
if(getTimeAsSec() + n >= 86400)
nextDay = true;
//時間を進める
super.tick(n);
//判定用変数time2に現在時刻を取得
int time2 = getTimeAsSec();
//tick(n)によって日付が変わっていればtime2に1日分加算
if(nextDay)
time2 += 86400;
//アラームがセットされていれば
if(this.aset){
//tick(n)前はアラーム時刻を越えておらず、tick(n)後に越えていればアラーム発動
if(time2 >= atime && timebefore < this.atime){
alarm();
}
//この時点でアラームが発動しなければアラーム時刻を正常に戻す
else{
if(this.atime >= 86400)
this.atime -= 86400;
}
}
}
public void alarm(){
System.out.println("アラーム");
//アラーム解除
this.aset = false;
}
// アラーム時刻を表示する(テスト用)
public final void showAtime() {
// 現在時刻の 時, 分, 秒 を h, m, s で表すとして
// print h + "時" + m + "分" + s + "秒", 改行
int h = this.atime / 3600;
int m = (this.atime / 60) % 60;
int s = this.atime % 60;
System.out.println("アラーム時刻:" + h + "時" + m + "分" + s + "秒");
}
//メインメソッド サンプルプログラム
public static void main(String args[]){
}
}
package j2.lesson05;
public class TrackTurtle extends Turtle {
//足跡を残せるフィールド15*15
boolean[][] field = new boolean[15][15];
//足跡を残すかどうか
boolean trackOn = false;
public TrackTurtle(){
//スーパーコンストラクタ 初期座標:(0,0), 向き:北
super();
//初期座標を(7,7)に変更したい
//北向きで y=7 に
for(int i=0; i<7; i++){
move();
}
//東向きにして x=7 に
turnRight();
for(int i=0; i<7; i++){
move();
}
//北向きに戻す
turnLeft();
}
public Turtle move() {
//現在向いている方向に1だけ進む。その際、足跡を残す設定ならば、この操作によって移動する前の位置に足跡を残す。
//ただし、足跡を残せる領域から外れていた場合は、足跡を残す設定であっても足跡を残さずに移動する。
//すでに足跡が残っている場所にさらに足跡を残しても変化はない
//オーバーライド: クラス Turtle 内の move
//戻り値: 自分自身 (this)
if(isTrackable()){
if(getX()>=0 && getX()<=14 && getY()>=0 && getY()<=14)
field[getX()][getY()] = true;
}
super.move();
return this;
}
public void setTrackable(boolean b){
//move() を実行した際に足跡を残すかどうかを設定する。
//turn~() はこの設定に関係なく足跡を残さない
//パラメータ: b - true ならば足跡を残す設定にする
trackOn = b;
}
public boolean isTrackable(){
//足跡を残すかどうか調べる。
//戻り値: 足跡を残す設定ならば true
//コンストラクタを呼び出した直後にこのメソッドが呼び出されると、
//false を返す (初期状態では足跡を残さない設定)
return trackOn;
}
//現在の足跡情報を表示(*1)する。足跡が残っている場所には"@"を表示し、
//残っていない場所には" "(半角スペース)を表示する。
public void show(){
// for y を 0 から 14 まで
for(int y=0; y<=14; y++){
// for x を 0 から 14 まで
for(int x=0; x<=14; x++){
// if (map(x, y))
if(map(x,y))
// print "@"
System.out.print("@");
// else
else
// print " " // 半角スペース
System.out.print(" ");
}
// print 改行
System.out.println("");
}
}
//(x, y) における足跡の状態
public boolean map(int x, int y){
// if (x, y) に足跡がある
if(field[x][y])
// return true
return true;
// else
else
// return false
return false;
}
//メインメソッド サンプルプログラム
public static void main(String args[]){
TrackTurtle turtle = new TrackTurtle();
// 北西へ
turtle.move().move().move().move().move().move().move();
turtle.turnLeft().move().move().move().move().move().move().move();
// 足跡開始
turtle.setTrackable(true);
// 渦巻き
int n=14;
for (int i = 0; i < 14; i++) {
turtle.turnLeft();
for (int j = 0; j < n; j++) {
turtle.move();
}
n--;
}
turtle.show();
}
}
old « 無条件バトン | メイン | ちまちまやってます。 » new