課題 (09:ベーシック)

作業について

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

パッケージの名前
j1.lesson09

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

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

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

問題

1. 網羅的でないreturn文 (考察課題)

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

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

0から100までの得点を入力し、表示するプログラムを書いたつもりですがうまくいきません。

package j1.lesson09;

import javax.swing.JOptionPane;

public class BreakError {

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

    void start() {
        int score = getInput();
        JOptionPane.showMessageDialog(null, "入力された得点は" + score + "点です");
    }

    int getInput() {
        while (true) {
            String input = JOptionPane.showInputDialog(
                "0から100までの整数を入力してください");
            int value = Integer.parseInt(input);
            if (0 <= value && value <= 100) {
                break;
            }
            JOptionPane.showMessageDialog(null,
                "範囲外の値です: " + value);
        }
    }
}

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

  1. エラーの理由は何でしょうか
  2. どのように修正すれば正しく動作するでしょうか

2. アキュームレータ方式の電卓

作成するクラスの名前
Calculator

電卓は「電子式卓上計算機」の略で、1960年ごろにはすでに世の中で使われていました。この電卓の計算方法は学校で習う計算方法と少し異なり、「アキュームレータ方式」と呼ばれています。これは次のように計算を進めて行く方式です。

10   ; = 10
+ 20 ; = 30 (10 + 20)
– 6  ; = 24 (30 – 6)
/ 2  ; = 12 (24 / 2)

上記のように、計算式を左から右に順番していく形で、演算子を見つけたら「そこまでの計算結果」と「右側の数値」を処理していきます。このため、多くの電卓では「10 + 20 * 30」のように左から順番に計算できないような式に弱いという問題があります。

このアキュームレータ方式を使った簡単な電卓プログラムを作成してください。プログラムは途中まで作成してありますが、これは2項までしか計算できないようになっています。これを好きなだけ連続して計算できるように改良して、getOperatorメソッドで0(=)が入力されたら終わりにしてください。

package j1.lesson09;

import javax.swing.JOptionPane;

public class Calculator {

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

    void start() {
        double result = getNumber();
        int operation = getOperator(result);
        if (operation == 1) {
            result = result + getNumber();
        }
        else if (operation == 2) {
            result = result - getNumber();
        }
        else if (operation == 3) {
            result = result * getNumber();
        }
        else if (operation == 4) {
            result = result / getNumber();
        }
        JOptionPane.showMessageDialog(null, "結果は" + result);
    }

    double getNumber() {
        String input = JOptionPane.showInputDialog("実数を入力");
        double number = Double.parseDouble(input);
        return number;
    }

    int getOperator(double current) {
        String input = JOptionPane.showInputDialog(
            "どんな操作をしますか? (現在の値: " + current + ")\n" +
            "[0] =\n" +
            "[1] +\n" +
            "[2] -\n" +
            "[3] *\n" +
            "[4] /\n");
        int operator = Integer.parseInt(input);
        return operator;
    }
}

また、getOperatorメソッドで0, 1, 2, 3, 4のいずれでもない整数が入力された場合、「[0-4]を選択してください」と表示して再入力するようにしてください。

入力の例を示します。

  1. 100.0
  2. 1
  3. 200.0
  4. 3
  5. 5.0
  6. 0

上記は「100.0 + 200.0 * 5.0 =」というように解釈されます。このとき、足し算と掛け算の計算順序は無視して、「(100.0 + 200.0) * 5.0」という計算を行ってください。結果は「1500.0」となるはずです。

3. クラップス

作成するクラスの名前
Craps

クラップスというサイコロを作ったゲームのプログラムを作成してください。

このゲームは次のようなルールです (オリジナルのクラップスと多少違うところもあります)。

  1. まずあなたがサイコロを2個ふり、合計を計算します
    • サイコロの合計が7または11ならば即座にあなたの勝ちです
    • サイコロの合計が2または3または12ならば即座にあなたの負けです
    • 2, 3, 7, 11, 12のいずれでもなければ、その合計を「ポイント」として覚えておきます
  2. 次にコンピュータがサイコロを2個ふり、合計を計算します
    • サイコロの合計が7であればコンピュータの負けです
    • サイコロの合計が先ほどの「ポイント」と同じであればコンピュータの勝ちです
  3. 次にあなたがサイコロを2個ふり、合計を計算します
    • サイコロの合計が7であればあなたの負けです
    • サイコロの合計が先ほどの「ポイント」と同じであればあなたの勝ちです
  4. 2番に戻り、勝負がつくまで2, 3を繰り返します

以上のルールを元に、次の順番でプログラムを完成させてください。

  1. tossメソッドを完成させてください。
    このメソッドはTwoDicesクラスのインスタンスを作成し、
    first, secondフィールドにそれぞれ1から6までのランダムな値、
    totalフィールドにfirst, secondフィールドの合計を設定します。
    このインスタンスの内容と、サイコロを振った「あなた」または「コンピュータ」を表示したあと、作成したインスタンスを返します。
  2. loopメソッドを完成させてください。
    これは先ほどのルールのうち、2, 3, 4番の部分です。
package j1.lesson09;

import javax.swing.JOptionPane;

public class Craps {

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

    void start() {
        TwoDices dices = toss("あなた");
        if (dices.total == 7 || dices.total == 11) {
            JOptionPane.showMessageDialog(null, "あなたの勝ちです");
        }
        else if (dices.total == 2 || dices.total == 3 || dices.total == 12) {
            JOptionPane.showMessageDialog(null, "あなたの負けです");
        }
        else {
            loop(dices.total);
        }
    }

    TwoDices toss(String player) {

    }

    void loop(int point) {

    }
}

class TwoDices {
    int first;
    int second;
    int total;
}

余力がある人は、途中まで作成したプログラムを利用せずに一から作成してください。