課題 (07:ベーシック)

作業について

今回の課題は以下のパッケージに作成してください。

パッケージの名前
j1.lesson07

作成するクラスの名前は問題ごとに指示があります。下記を参照してください

課題の提出方法については下記を参照してください。

また、別のコンピューター上に移動する際には、下記を参考にプログラムを持ち帰ってください。

問題

1. 配列を逆順に表示する (考察課題)

作成するファイルの名前
Reverse.txt

ファイルの作成方法については下記を参照してください。

下記は配列を逆順に表示するプログラムです。

package j1.lesson07;

import javax.swing.JOptionPane;

public class Reverse {

    public static void main(String[] args) {
        new Reverse().start();
    }

    void start() {
        String[] messages = new String[5];
        messages[0] = "おはよう";
        messages[1] = "こんにちは";
        messages[2] = "こんばんは";
        messages[3] = "さようなら";
        messages[4] = "おやすみなさい";
        for (int i = messages.length - 1; i >= 0; i = i - 1) {
            JOptionPane.showMessageDialog(null, messages[i]);
        }
    }
}

次の問題に答えて下さい。

  1. プログラム中のfor文で、変数iはどのように変化していくでしょうか
  2. プログラム中のfor文を、表示する順番を変えずに次の形式に書きなおしてください
for (int i = 0; i < array.length; i++) {
    ...
}

ヒント

  • 4 = 5 – 1 – 0
  • 3 = 5 – 1 – 1
  • 2 = 5 – 1 – 2
  • 1 = 5 – 1 – 3
  • 0 = 5 – 1 – 4

2. 特定の条件を満たす値を数えるプログラム

作成するクラスの名前
Count

複数の整数をカンマ区切りで入力して、それらに含まれる60未満のものと80以上のものを数え上げて表示するプログラムを作成してください。

下記はその途中まで作成したプログラムです。

package j1.lesson07;

import javax.swing.JOptionPane;

public class Count {

    public static void main(String[] args) {
        new Count().start();
    }

    void start() {
        String input = JOptionPane.showInputDialog("カンマ区切りの整数を入力");
        int[] values = toIntArray(input);
        JOptionPane.showMessageDialog(null, "60未満は" + countLower(values));
        JOptionPane.showMessageDialog(null, "80以上は" + countUpper(values));
    }

    int[] toIntArray(String input) {
        String[] fields = input.split(",");
        int[] values = new int[fields.length];


        return values;
    }


}

ただし、1個も整数が入力されなかった場合は考えなくてかまいません。

3. 最大、最小を計算するプログラム

作成するクラスの名前
Bound

複数の整数をカンマ区切りで入力して、それらの最大、最小を表示するプログラムを作成してください。

下記はその途中まで作成したプログラムです。

package j1.lesson07;

import javax.swing.JOptionPane;

public class Bound {

    public static void main(String[] args) {
        new Bound().start();
    }

    void start() {
        String input = JOptionPane.showInputDialog("カンマ区切りの整数を入力");
        int[] values = toIntArray(input);
        JOptionPane.showMessageDialog(null, "最大は" + max(values));
        JOptionPane.showMessageDialog(null, "最小は" + min(values));
    }

    int[] toIntArray(String input) {
        String[] fields = input.split(",");
        int[] values = new int[fields.length];


        return values;
    }

    int max(int[] values) {
        int max = values[0];
        for (int i = 0; i < values.length; i++) {
            if (values[i] > max) {
                max = values[i];
            }
        }
        return max;
    }
}

ただし、1個も整数が入力されなかった場合は考えなくてかまいません。

4. high or low ゲーム

作成するクラスの名前
HighOrLow

High or Lowは52枚のトランプを順番にめくっていって、現在のカードより次にめくるカードの数が大きいか小さいかを当てるゲームです。正解した場合は、現在のカードをわきに置いて、次のカードに対してさらにその次のカードが大きいか小さいかを当てていきます。トランプ52枚で51回連続して正解するか、途中で間違えたらゲームは終了し、そこまでに正解した回数を競うゲームです。今回はこのゲームを作ってみましょう。

今回はプログラムを簡単にするため、52枚のトランプのうち、同じマークの13枚だけを使うものとします。つまり、現在のカードと次のカードが同じ数になることはありません。また、トランプの1はA(エース)といって特別な扱いをすることがありますが、このカードについてもどのように扱ってもかまいません。

下記のプログラムはhigh or lowゲームを途中まで作ったものです。playメソッドを追加してプログラム全体を完成させて下さい。ただし、playメソッドの引数には1から13までの値が、それぞれ1回ずつ含まれる13要素の配列が渡されます。このメソッドは正解した回数を返すようにプログラミングしてください。

package j1.lesson07;

import javax.swing.JOptionPane;

public class HighOrLow {

    public static void main(String[] args) {
        new HighOrLow().start();
    }

    void start() {
        int[] deck = createDeck();
        int victories = play(deck);
        if (victories == 0) {
            JOptionPane.showMessageDialog(null, "1回も当たりませんでした");
        }
        else {
            JOptionPane.showMessageDialog(null, victories + "回当たりました");
        }
    }

    int[] createDeck() {
        // 52枚のカードを作る
        int[] deck = new int[13];
        for (int i = 0; i < 13; i++) {
            deck[i] = i + 1;
        }
        // シャッフルする
        for (int i = 0; i < deck.length; i++) {
            // 0..12の乱数を生成
            int random = (int) (Math.random() * deck.length);

            // 現在のカードと乱数の位置のカードを入れ替え
            int card = deck[i];
            deck[i] = deck[random];
            deck[random] = card;
        }
        return deck;
    }



    boolean checkHigh(int current, int next) {
        if (next > current) {
            JOptionPane.showMessageDialog(null, "次のカードは" + next + "\n" +
                "正解です");
            return true;
        }
        else {
            JOptionPane.showMessageDialog(null, "次のカードは" + next + "\n" +
                "不正解です");
            return false;
        }
    }

    boolean checkLow(int current, int next) {
        if (next < current) {
            JOptionPane.showMessageDialog(null, "次のカードは" + next + "\n" +
                "正解です");
            return true;
        }
        else {
            JOptionPane.showMessageDialog(null, "次のカードは" + next + "\n" +
                "不正解です");
            return false;
        }
    }
}

ヒント

間違えた場合には即座にreturn文を使ってメソッドを終了させると楽です。また、普通にfor文を書くと、繰り返し変数と正解数は一致するはずです。

なお、12連勝するのは非常に大変ですが、繰り返し回数はカードの枚数よりも1少ない数でないと12連勝したあとに14枚目を使おうとしてしまうので注意が必要です。