課題 (05:ベーシック)

作業について

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

パッケージの名前
j1.lesson05

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

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

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

問題

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

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

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

3つの整数を入力し、その中で最大のものを表示するプログラムを書いたつもりですがうまくいきません。

package j1.lesson05;

import javax.swing.JOptionPane;

public class Max3Error {

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

    void start() {
        String input1 = JOptionPane.showInputDialog("1つ目の入力");
        String input2 = JOptionPane.showInputDialog("2つ目の入力");
        String input3 = JOptionPane.showInputDialog("3つ目の入力");
        int a = Integer.parseInt(input1);
        int b = Integer.parseInt(input2);
        int c = Integer.parseInt(input3);
        int result = max(a, b, c);
        JOptionPane.showMessageDialog(null, "最大は" + result);
    }

    int max(int a, int b, int c) {
        if (a > b) {
            if (a > c) {
                return a;
            }
            else {
                return c;
            }
        }
        else {
            if (b > c) {
                return b;
            }
        }
    }
}

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

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

2. 温度の単位変換

作成するクラスの名前
ConvertCelsius

日本では温度を表す際に摂氏(℃)という単位を主に使っています。世界にはほかにも温度を表す単位があり、たとえば華氏やケルビンなどが有名です。

今回は、摂氏の温度から華氏の温度とケルビンを計算して表示するプログラムを作成してください。ただし、摂氏の温度から華氏の温度を計算する部分や、摂氏の温度からケルビンを計算する部分はそれぞれメソッドとして作成してください。

なお、それぞれの温度の関係は次のように表せます。

  • 摂氏に 273.15 を足すとケルビンになる
  • ケルビンに1.8を掛けて459.67を引くと華氏になる

3. 問題を3問出題し、最後に正答数を表示するプログラム

作成するクラスの名前
QuizTotal

クイズを3問連続して出題し、最後に正解した回数を表示するプログラムを作成してください。ただし、1問も正解しなかった場合には「1問も正解しませんでした」と表示するようにしてください。

ヒント

これまでのクイズを出題するメソッドでは「正解です」や「不正解です」などのメッセージを表示して終わっていましたが、代わりに「正解かどうか」という情報を返してやることもできます。

4. メソッドの利用

作成するクラスの名前
Calculator

メソッドは一連の手続きをひとまとめにして、起動するだけで複雑な命令を利用できるようにしたものです。下記のプログラムにはcalculateという名前のメソッドを用意しました。

package j1.lesson05;

import javax.swing.JOptionPane;

public class Calculator {

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

    void start() {

    }

    int calculate(String expression) {
        StringBuilder buf = new StringBuilder();
        for (char c : expression.toCharArray()) {
            if (Character.isWhitespace(c) == false) {
                buf.append(c);
            }
        }
        buf.append("$");
        int result = additive(buf);
        if (consumeJust(buf, '$') == '$') {
            return result;
        }
        throw new IllegalArgumentException(buf.toString());
    }

    int additive(StringBuilder buffer) {
        int left = multiplicative(buffer);
        while(true) {
            char op = consumeEither(buffer, '+', '-');
            if (op == 0) {
                break;
            }
            int right = multiplicative(buffer);
            if (op == '+') {
                left = left + right;
            }
            else {
                left = left - right;
            }
        }
        return left;
    }

    int multiplicative(StringBuilder buffer) {
        int left = term(buffer);
        while(true) {
            char op = consumeEither(buffer, '*', '/');
            if (op == 0) {
                break;
            }
            int right = term(buffer);
            if (op == '*') {
                left = left * right;
            }
            else {
                left = left / right;
            }
        }
        return left;
    }

    int term(StringBuilder buffer) {
        if (consumeJust(buffer, '(') == '(') {
            int expr = additive(buffer);
            if (consumeJust(buffer, ')') == ')') {
                return expr;
            }
        }
        else if (consumeJust(buffer, '-') == '-') {
            return -term(buffer);
        }
        else if (buffer.length() >= 1) {
            return number(buffer);
        }
        throw new IllegalArgumentException(buffer.toString());
    }

    int number(StringBuilder buffer) {
        int numbers = 0;
        for (int i = 0, n = buffer.length(); i < n; i++) {
            char c = buffer.charAt(i);
            if (c < '0' || '9' < c) {
                numbers = i;
                break;
            }
        }
        if (numbers == 0) {
            throw new IllegalArgumentException(buffer.toString());
        }
        int result = Integer.parseInt(buffer.substring(0, numbers));
        buffer.delete(0, numbers);
        return result;
    }

    char consumeJust(StringBuilder buffer, char op) {
        if (buffer.length() == 0) {
            throw new IllegalArgumentException(buffer.toString());
        }
        if (buffer.charAt(0) == op) {
            buffer.deleteCharAt(0);
            return op;
        }
        return 0;
    }

    char consumeEither(StringBuilder buffer, char op1, char op2) {
        if (consumeJust(buffer, op1) == op1) {
            return op1;
        }
        return consumeJust(buffer, op2);
    }
}

これは整数の四則演算に関する式を文字列として渡すと、それを計算して結果の整数を返すメソッドです。今回はこのcalculateメソッドを利用して計算機プログラムを作成してください。

calculateメソッドの引数に渡せる文字列には、たとえば次のようなものがあります。

  • 10
  • 10 + 20 – 30 * 40 / 50
  • – (10 + 20) * (30 – 40)

なお、calculateメソッドやそこからさらに起動するメソッドは、ここまでに紹介した範囲外の命令を使っています。メソッドの中身を知らなくてもメソッドは起動できますので、calculateメソッドの結果だけを意識してください。