プログラミング入門(金曜1・2限)講義資料(2008年後期)

課題の解答例

第2回

BMI:

このファイルをダウンロード ■ UNIX用(EUC版) ■ Windows用(SJIS版)
(上のどちらかのリンクを右ボタンでクリックして「リンク先を名前をつけて保存」して下さい)

public class BMI {
    public static void main(String[] args) {
	System.out.print("体重は(in Kg)? :");
	double weight = Keyboard.doubleValue();
	System.out.print("身長は(in m)? :");
	double height = Keyboard.doubleValue();
	double bmi = weight / ( height * height );

	System.out.println("BMI指数は" + bmi + "です");

	if (bmi < 20) {
	    System.out.println("やせている");
	} else if (bmi < 24) {
	    System.out.println("正常");
	} else if (bmi < 26.5) {
	    System.out.println("やや肥満");
	} else {
	    System.out.println("肥満");
	}
    }
}


うるう年:

このファイルをダウンロード ■ UNIX用(EUC版) ■ Windows用(SJIS版)
(上のどちらかのリンクを右ボタンでクリックして「リンク先を名前をつけて保存」して下さい)

// 課題2-2
public class LeapYear {
    public static void main(String[] args) {
	System.out.print("西暦を入力してください: ");
	int year = Keyboard.intValue();

	/*
	 * 方法1
	 */
	if (year % 400 == 0) {
	    System.out.println("西暦" + year + "年はうるう年です。");
	} else {
	    if (year % 100 == 0) {
		System.out.println("西暦" + year + "年はうるう年ではありません。");
	    } else {
		if (year % 4 == 0) {
		    System.out.println("西暦" + year + "年はうるう年です。");
		} else {
		System.out.println("西暦" + year + "年はうるう年ではありません。");
		}
	    }
        }

	/*
	 * 方法2
	 */
	if (year % 400 == 0) {
	    System.out.println("西暦" + year + "年はうるう年です。");
	} else if (year % 100 == 0){
	    System.out.println("西暦" + year + "年はうるう年ではありません。");
	} else if (year % 4 == 0){
	    System.out.println("西暦" + year + "年はうるう年です。");
	} else {
	    System.out.println("西暦" + year + "年はうるう年ではありません。");
	}

	/*
	 * 方法3
	 */
	// うるう年か判定
	if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) {
	    System.out.println("西暦" + year + "年はうるう年です。");
	} else {
	    System.out.println("西暦" + year + "年はうるう年ではありません。");
	}

	/*
	 * 方法4
	 */
	int judge = 0;

	//判定ルーチン
	if ((year % 400) == 0) {
	    judge = 1;
	} else if ((year % 100) == 0) {
	    judge = 0;
	} else if ((year % 4) == 0 ) {
	    judge = 1;
	} else {
	    judge = 0;
	}
	//結果を表示する

	System.out.print("西暦" + year + "年は");
	if (judge == 1) {
	    System.out.println("うるう年です");
	} else {
	    System.out.println("うるう年ではありません");
	}
    }
}


第3回

駐車料金:

このファイルをダウンロード ■ UNIX用(EUC版) ■ Windows用(SJIS版)
(上のどちらかのリンクを右ボタンでクリックして「リンク先を名前をつけて保存」して下さい)

// 駐車料金
public class ParkingCharge {
    public static void main(String[] args) {
	// 駐車時間を入力
	System.out.print("駐車時間(分): ");
	int park_time = Keyboard.intValue();

	// 1000円で,60分駐車可能
	int charge = 1000;
	park_time = park_time - 60;
	
	// まだ駐車するならば,600円加算して30分追加
	while (park_time > 0) {
	    charge = charge + 600;
	    park_time = park_time - 30;
	}
	System.out.println("料金は" + charge + "です");
    }
}



数当てゲーム:

このファイルをダウンロード ■ UNIX用(EUC版) ■ Windows用(SJIS版)
(上のどちらかのリンクを右ボタンでクリックして「リンク先を名前をつけて保存」して下さい)

// 数当てプログラム
public class Kazuate {
    public static void main(String[] args) {
	// まず,乱数を使って 0 〜 99 までの値を作る
	int answer = (int)(Math.random() * 100);
	// 入力した回数を覚えておくための変数を作る.
	int count = 0;

	System.out.println("0〜99の範囲で値を入れてください.");
	while (true) {
	    // キーボードから入力
	    System.out.print("Number: ");
	    int num = Keyboard.intValue();

	    // 入力した回数を増やす
	    count++;

	    // 正解?
	    if (answer == num) {
		break;
	    }
	    // ±1 なら惜しいと表示して数を変更する
	    if (answer == num + 1 || answer == num - 1) {
		System.out.println("惜しい! 正解は" + answer + "でした");
		// 再度乱数を使って計算する
		System.out.println("数を変更します.");
		answer = (int)(Math.random() * 100);
	    } else if (answer < num) {
		System.out.println(num + "より小さいです");
	    } else {
		System.out.println(num + "より大きいです");
	    }
	}
	// 入力した回数を表示.
	System.out.print(count);
	System.out.println("回目で正解!");
    }
}


第4回

最大値と最小値:

このファイルをダウンロード ■ UNIX用(EUC版) ■ Windows用(SJIS版)
(上のどちらかのリンクを右ボタンでクリックして「リンク先を名前をつけて保存」して下さい)

// 最大値と最小値
public class MinAndMax {
    public static void main(String[] args) {
	// 5つの要素をもつ整数の配列 num を作る.
	int[] num = new int[5];

	// 整数を5つ入力する
	for (int i = 0 ; i < 5 ; i++) {
	    System.out.print("Number: ");
	    num[i] = Keyboard.intValue();
	}

	// 最小値を覚える変数をつくる.とりあえず最初の値を最小値とする.
	int min = num[0];
	// 最大値を覚える変数をつくる.とりあえず最初の値を最大値とする.
	int max = num[0];

	// min を num[1], num[2], num[3], num[4] と順番に比較していき,
	// 本当の最小値と最大値を見つける
	for (int i = 1 ; i < 5 ; i++) {
	    // 最小値より小さいものが見つかったら,そっちを覚える
	    if (num[i] < min) {
		min = num[i];
	    }
	    // 最大値より大きいものが見つかったら,そっちを覚える
	    if (num[i] > max) {
		max = num[i];
	    }
	}

	// 結果を表示
	System.out.println("最大: " + max);
	System.out.println("最小: " + min);
    }
}


ヒストグラム:

このファイルをダウンロード ■ UNIX用(EUC版) ■ Windows用(SJIS版)
(上のどちらかのリンクを右ボタンでクリックして「リンク先を名前をつけて保存」して下さい)

public class Hist {
    public static void main(String[] args) {
	// 0点台〜100点台の人数を覚える配列 hist をつくる
	int[] hist = new int[11];

	// 配列に点数を入力する
	while (true){
	    //数を入力する
	    System.out.print("点数: ");
	    int score = Keyboard.intValue();

	    // -1ならば繰り返しから抜ける
	    if (score  == -1) {
		break;
	    }
	    // 人数を増やす
	    hist[score / 10]++;
	}

	// 結果を出力する
	for (int x = 0; x < 11 ; x++) {
	    // 100点の時だけは "台" を表示しない
	    if (x == 10) {
		System.out.print("100点: ");
	    } else {
		System.out.print(x*10 + "点台: ");
	    }
	    for(int i = 0 ; i < hist[x] ; i++) {
		System.out.print("*");
	    }
	    System.out.println();
	}
    }
}


第5回

フラグ:

このファイルをダウンロード ■ UNIX用(EUC版) ■ Windows用(SJIS版)
(上のどちらかのリンクを右ボタンでクリックして「リンク先を名前をつけて保存」して下さい)

public class FlagExcercise {
    public static void main(String[] args) {
	double[] num = new double[5];

	//値の入力
	for (int i = 0; i < 5; i++) {
	    System.out.print("Number: ");
	    num[i] = Keyboard.doubleValue();
	}
	// ソートされているか判定
	boolean issorted = true;
	for (int i = 0; i < 4; i++) {
	    // 隣接する要素を比較
	    if (num[i] > num[i + 1]) {
		issorted = false;
		break;
	    }
	}
	// 結果表示
	if (issorted) {
	    System.out.println("ソートされています");
	} else {
	    System.out.println("ソートされていません");
	}
    }
}


金種計算:

このファイルをダウンロード ■ UNIX用(EUC版) ■ Windows用(SJIS版)
(上のどちらかのリンクを右ボタンでクリックして「リンク先を名前をつけて保存」して下さい)

// 金種計算
public class Kinshu {
    public static void main(String[] arg) {
	// 配列 kinshu[] に金種を入れておく
	int [] kinshu = {10000, 5000, 2000, 1000, 500, 100, 50, 10, 5, 1};
	// 金額を尋ねる
	System.out.print("金額: ");
	int kingaku = Keyboard.intValue();

	// 金額の大きな金種から順番に枚数を計算していく
	for (int i = 0 ; i < kinshu.length ; i++){
	    // kingaku を kinshu[i]で割った商が枚数
	    int maisu = kingaku / kinshu[i];
	    System.out.println(kinshu[i] + ": " + maisu + "枚");

	    // 残りの金額を計算
	    kingaku = kingaku % kinshu[i];
	    // kingaku = kingaku - (kinshu[i] * maisu); でも良い
	}
    }
}


バブルソート:

このファイルをダウンロード ■ UNIX用(EUC版) ■ Windows用(SJIS版)
(上のどちらかのリンクを右ボタンでクリックして「リンク先を名前をつけて保存」して下さい)

// バブルソート
public class Sort {
    public static void main(String[] args) {
	//配列xを作る
	int[] x = new int[10];
	//数値を10個入力する
	System.out.println("数値を10個入力してください");
	for (int i = 0 ; i < 10 ; i++) {
	    System.out.print(i + ": ");
	    x[i] = Keyboard.intValue();
	}
	//最大値を寄せる処理を繰り返す
	for (int n = x.length - 1 ; n >= 1 ; n--) {
	    // x[n]とx[n+1]を比較し、x[n] > x[n+1] ならばx[n]と x[n+1]の中身を
	    // 入れ替える
	    for (int i = 0 ; i < n ; i++) {
		// 隣り合う2つの要素を比較し,順序関係が乱れていたら直す
		if (x[i] > x[i+1]){
		    //x[i]をtempに覚えさせる
		    int temp = x[i];
		    //x[i]にx[i+1]を代入
		    x[i] = x[i+1];
		    //x[i+1]にtempを代入
		    x[i+1] = temp;
		}
	    }
	}
	// 結果を出力する
	System.out.println("ソート結果")
	for (int i = 0 ; i < 10 ; i++){
	    System.out.println(x[i]);
	}
    }
}


第6回

電卓:

このファイルをダウンロード ■ UNIX用(EUC版) ■ Windows用(SJIS版)
(上のどちらかのリンクを右ボタンでクリックして「リンク先を名前をつけて保存」して下さい)

// 大きい値が扱える電卓 BigCalc

// java.math.BigIntegerを使うのでimportしておく
import java.math.*;

public class BigCalc {
    public static void main(String[] args) {
	while(true) {
	    // 値を2つ入力する
	    System.out.print("値1は? ");
	    String val1 = Keyboard.stringValue();
	    System.out.print("値2は? ");
	    String val2 = Keyboard.stringValue();
	    
	    // それぞれ BigInteger に変換する
	    BigInteger bigval1 = new BigInteger(val1);
	    BigInteger bigval2 = new BigInteger(val2);

	    // 答を入れるオブジェクト変数.
	    BigInteger answer = null;
	    
	    // 計算の種類を入力する
	    System.out.print("計算の種類は?(+,-,*,/): ");
	    String op = Keyboard.stringValue();
			
	    // 計算の種類に応じて計算する
	    if (op.equals("+")) {
		// 結果を表すBigIntegerオブジェクトは add メソッドの中で
		// 作られている.つまり,add メソッドの中で new されている.
		// 他も同じ.
		answer = bigval1.add(bigval2);
	    } else if (op.equals("-")) {
		answer = bigval1.subtract(bigval2);
	    } else if (op.equals("*")) {
		answer = bigval1.multiply(bigval2);
	    } else if (op.equals("/")) {
		answer = bigval1.divide(bigval2);
	    } else {
		System.out.println("Error!");
	    }

	    // +-*/のいずれかが入力された時だけ結果を表示する
	    if (answer != null) {
		System.out.println(bigval1 + op + bigval2 + "=" + answer);
	    }
	}
    }
}


第7回

演習(ファイルを逆順に表示):

このファイルをダウンロード ■ UNIX用(EUC版) ■ Windows用(SJIS版)
(上のどちらかのリンクを右ボタンでクリックして「リンク先を名前をつけて保存」して下さい)

import java.io.*;

public class ReverseLine {
    // throws Exception が加わっていることに注意!!
    public static void main(String[] args) throws Exception {
	// ファイル名は args[0] に入っている
	// ファイルをオープンする
	BufferedReader in = new BufferedReader(new FileReader(args[0]));
	// 中身を読み取って、配列 s に入れる (ファイルの終わりに到達するまで)
	String[] s = new String[100];

	int i = 0;
	while (true) {
	    String line = in.readLine();  // 1行読み取って、
	    if (line == null) {		  // nullが来たらbreakする
		break;
	    }
	    s[i] = line;		  // 配列 s に入れる
	    i++;
	}
	in.close();			  // ファイルをクローズする

	// この時点で,iの値は配列sの(使用されている最大の添字+1)に
	// なっていることに注意
	for (i-- ; i >= 0 ; i--) {
	    System.out.println(s[i]);  // 配列sの中身を逆順に表示する
	}
    }
}


格言:

このファイルをダウンロード ■ UNIX用(EUC版) ■ Windows用(SJIS版)
(上のどちらかのリンクを右ボタンでクリックして「リンク先を名前をつけて保存」して下さい)

// 格言を作る

import java.io.*;
public class Maxim {
    public static void main(String[] args) throws Exception {
	int meishi_num = 0;	// 名詞の数を覚えておくための変数
	int doushi_num = 0;	// 動詞の数を覚えておくための変数

	// 名詞をファイルから取得して配列に格納する
	String[] meishi = new String[100];
	BufferedReader in = new BufferedReader(new FileReader("meishi.txt"));
	while (true) {
	    meishi[meishi_num] = in.readLine();
	    if (meishi[meishi_num] == null) {
		break;
	    }
	    meishi_num++;
	}
	in.close();

	// 動詞をファイルから取得して配列に格納する
	String[] doushi = new String[100];
	in = new BufferedReader(new FileReader("doushi.txt"));
	while (true) {
	    doushi[doushi_num] = in.readLine();
	    if (doushi[doushi_num] == null) {
		break;
	    }
	    doushi_num++;
	}
	in.close();

	// maxim.txt というファイルに書き込む
	PrintWriter out = new PrintWriter(new FileWriter("maxim.txt"));

	// 格言を10個作る
	for (int i = 0 ; i < 10 ; i++) {
	    // 名詞・動詞を無作為に抽出
	    int d = (int)(Math.random() * doushi_num);
	    int m1 = (int)(Math.random() * meishi_num);
	    int m2 = (int)(Math.random() * meishi_num);

	    // 書き込み
	    out.println(meishi[m1] + "とは" + doushi[d] +
			meishi[m2] + "である。");
	}
	out.close();
    }
}


第8回

簡易版弁当屋さん経営ゲーム:

このファイルをダウンロード ■ UNIX用(EUC版) ■ Windows用(SJIS版)
(上のどちらかのリンクを右ボタンでクリックして「リンク先を名前をつけて保存」して下さい)

// 弁当ゲーム
// 人間プレイヤーのためのクラス

public class Player {
    private int money = 40000;	// 所持金
    private int zaiko;		// 弁当の在庫

    // 仕入れ価格や販売価格を変数にしておくと,後で価格を変えるのが楽.
    // これらはオブジェクト毎に異なる必要はないのでクラス変数にしている.
    private static int genka = 400; // 仕入れ価格
    private static int baika = 500; // 販売価格

    // 弁当の準備をする
    public void prepareBento(int kousui) {
	int maxbento = money / genka;

	// 降水確率を表示する
	System.out.println("天気予報: 明日の降水確率は " + kousui + "%");

	// いくつ弁当を作るか決める(キーボードから入力して貰う)
	// 作ると決めた数を zaiko に入れる
	while (true) {
	    System.out.print("いくつ弁当を作りますか?(" + maxbento + "個まで): ");
	    zaiko = Keyboard.intValue();
	    if (zaiko <= maxbento) {
		break;
	    }
	    System.out.print("そんなに作れません!");
	}
	System.out.println("あなたの店は" + zaiko + "個作ります");

	// money を原価 * zaiko だけ減らす.
	money = money - genka * zaiko;
    }

    // 弁当の在庫を売る
    // 最大幾つ売れるかは天気次第なので,引数の tenki (0 = 晴れ,1 = 曇り,
    // 2 = 雨)で決定する.
    public int sellBento(int tenki) {
	// 天気によって幾つ売れるかを保持している配列.
	// (tenki を添字にする)
	int[] max = {100, 300, 500};
	// 最大幾つ売れるかを計算
	int maxsell = max[tenki];

	// 売れる数を sold に入れる.在庫より多くは売れない.
	// zaikoとmaxsellの小さいほうが売れる数.
	// if文で書いても良いが,Mathクラスのminメソッドを使うと楽.
	int sold = Math.min(zaiko, maxsell);

	// if文で書くならこんな感じ.
	// if (zaiko > maxsell) {
	//    sold = maxsell;
	// } else {
	//    sold = zaiko;
	// }

	// 所持金を売れた分だけ増やす
	money = money + baika * sold;
	// 在庫はなくなる
	zaiko = 0;

	// 弁当が売れた数を返す
	return sold;
    }

    // 所持金を返す
    public int getMoney() {
	return money;
    }
}