1.クラスの作成①

以下のクラスを作成しなさい。

クラス名:Rectangle

フィールド:double width, double hight

コンストラクタ:幅と高さを与えてフィールドを初期化する

メソッド:長方形の面積を返すgetRectangularArea() ※引数はなし

テストクラス:

package p09;

public class Q01 {
    public static void main(String[] args) {
        Rectangle r1 = new Rectangle(20.3, 12.5);
        System.out.println(r1.getRectangularArea());
    }
}

<結果>

253.75

2.クラスの作成②

以下のクラスを作成しなさい。なお、特に指定のない項目については各自で名前を考えること。

クラス名:Parrot

フィールド:String name

コンストラクタ:フィールドnameを初期化する

メソッド:メッセージを受け取って自己紹介してからそのメッセージをオウム返しするtalk

テストクラス:

package p09;

public class Q02 {
    public static void main(String[] args) {
        Parrot p1 = new Parrot("P-chan");
        Parrot p2 = new Parrot("Q-chan");
        p1.talk("こんにちは");
        p2.talk("您好");
    }
}

<結果>

Hello, I'm P-chan
こんにちは
Hello, I'm Q-chan
您好

3.クラスの作成③

以下のクラスを作成しなさい。なお、特に指定のない項目については各自で名前を考えること。

クラスの概要:配列の統計値を計算してくれるクラス

クラス名:StatisticsCalculator

フィールド:doulbe[] numbers

コンストラクタ:フィールドを初期化する

メソッド:合計、平均、最大値、最小値、を返す合計4つのメソッド

テストクラス:

package p09;

public class Q03 {
    public static void main(String[] args) {
        StatisticsCalculator s = new StatisticsCalculator(new double[]{19.8, 33.4, 95.32, 644.2});
        System.out.println(s.getSum());
        System.out.println(s.getAverage());
        System.out.println(s.getMax());
        System.out.println(s.getMin());
    }
}

<結果>

792.72
198.18
644.2
19.8

余裕があれば最頻値(Mode)、標準偏差(Standard Deviation)などの統計値も計算できるようにすること。

4.インスタンス変数をstaticメソッドから参照する

次のコードは実行できません。

それはなぜでしょうか?

package p09;

public class Q04 {
    int num1 = 10;
    int num2 = 20;
    public static void main(String[] args) {
        System.out.println(num1 + num2);
    }
}

5.インスタンス変数のスコープ

以下のプログラムはサイコロ(6面)を模した(つもりの)DiceクラスとそのテストクラスQ05から構成されています。

しかし、RuntimeExceptionが発生し意図した通りの動きをしません。

numberをローカル変数からフィールド(インスタンス変数)に変えることでこの問題に対処しなさい。

また、この例から複数のインスタンスメソッドで使うデータはフィールドにしたほうが良いことを学び取ってください。

package p09;
import java.util.Random;
class Dice{
    
    Random random;
    
    Dice(){
        random = new Random();
        int number = 0;
        roll();
    }
    
    void roll(){
        number = random.nextInt(6)+1;
        System.out.println(number);
        }
    }
}

public class Q05 {
    public static void main(String[] args) {
        Dice d = new Dice();
        d.roll();
    }
}

<期待される結果の例>

5
3

6.クラスをメインメソッドでインスタンス化して利用する

以下のプログラムはチームメンバー全員の自己紹介をするためのプログラムです。

以下の NewComer1 (新入社員)クラスを使用して、プログラムを作成しなさい。

class NewComer1{
    private String name;
    public void setName( String nm ){
        name = nm;
    }
    public void showProfile() {
        System.out.println( "私の名前は、" + name + "です。" );
    }
}

(1)Q06クラスにmainメソッドを追加しインスタンスを生成する。
(2)setName メソッドであなたの名前を設定する。
(3)showProfile メソッドであなたの名前を表示する。

<結果の例>

私の名前は、今井です。

7.インスタンスメソッドの作成と変更

前問の NewComer1 クラスに、次の内容を追加して新たなクラスNewComer2を作りなさい。
(1)年齢を保持する int 型のフィールドを追加する。
(2)年齢を設定するインスタンスメソッド、setAgeを追加する。
(3)mainメソッド内で自分の年齢(サバ読み可)を設定する。
(4)showProfile メソッドで名前、年齢を表示するように変更する。
(5)Q07クラスにインスタンスを生成し、名前と年齢を設定してからプロフィールを表示する。

<結果の例>

私の名前は今井です。
年齢は40歳です。

8.オブジェクト型の配列とメソッド

前問の NewComer2 クラスを再利用して次のプログラムを作成しなさい。
(1)オブジェクト配列を使い、メンバー全員分のNewComer クラスのインスタンスを作成しなさい。
(2)すべてのインスタンスに名前、年齢を設定する。
(3)すべてのインスタンスのプロフィールを表示する。

<結果の例>

出力例

私の名前は今井です。
年齢は40歳です。
---------------------
私の名前は山田です。
年齢は37歳です。
---------------------
(以下省略)

9.コンストラクタの作成

前問の NewComer2 クラスに、名前と年齢を初期化するコンストラクタを追加してNewComer3とし、次のプログラムを作成しなさい。
なお、Eclipseの「ソース」→「フィールドを使用してコンストラクタを生成」機能を使わないパターンと、使うパターン両方試すこと。

(1)オブジェクト配列を使い、メンバー全員分のNewComer クラスのインスタンスを1文で作成する。
(2)すべてのインスタンスのプロフィールを表示する。

<結果の例>

私の名前は今井です。
年齢は22歳です。
--------------
私の名前は山田です。
年齢は23歳です。

(中略)

10.インスタンスメソッドの利用

前問の NewComer3クラスに、次の内容を追加してNewComer4クラスとしなさい。
(1)趣味を保持するフィールド( hobby:String 型)を追加する。
(2)コンストラクタを名前、年齢、趣味を設定する引数を持つように変更する。
(3)ShowProfile メソッドを名前、年齢、趣味を表示するように変更する。
(4)一つ年をとるgetOlderメソッド(引数無し、戻り値年齢)を追加する。
(5)NewComer クラスのインスタンスをチームメンバー数だけ作成する。
(6)全員のプロフィールを表示する。
(7)getOlderメソッドで全員1歳年をとらせてから同様にプロフィールを表示する。
  (ここでは戻り値を使っていない、戻り値を捨てていることに注意)

<結果の例>

私の名前は今井です。
年齢は22歳です。
趣味は釣りです。
--------------

(中略)


私の名前は篠原です。
年齢は22歳です。
趣味はドローンです。
--------------


私の名前は今井です。
年齢は23歳です。
趣味は釣りです。
--------------

(中略)


--------------
私の名前は篠原です。
年齢は23歳です。
趣味はドローンです。
--------------

11.数あてゲーム再々来

あなたが卒業課題で作成した数あてゲームが以下の通りだったとします。

import java.util.Random;
import java.util.Scanner;

public class Q11 {
    public static void main(String[] args) {
        System.out.println("レベルを選んで下さい (1)0~9 (2)0~99 (3)0~999 ");
        Scanner scanner = new Scanner(System.in);
        Random random = new Random();
        int answer = 0;
        int level = 0;
        while (level < 1 || 3 < level) {
            level = scanner.nextInt();
            switch (level) {
                case 1:
                    answer = random.nextInt(10);
                    break;
                case 2:
                    answer = random.nextInt(100);
                    break;
                case 3:
                    answer = random.nextInt(1000);
                    break;
                default:
                    System.out.println("もう一度レベルを選んでください (1)0~9 (2)0~99 (3)0~999 ");
            }
        }
        System.out.println("秘密の答え:" + answer);
        System.out.println("5回以内に数を当ててね。3回以内ならすごいことだよ。");
        long start = System.currentTimeMillis();
        int cnt;
        int[] history = {-1, -1, -1, -1, -1};
        for (cnt = 0; cnt < 5; cnt++) {
            System.out.println("キーボードから数値を入力してください");
            
            int inputted = scanner.nextInt();
            
            history[cnt] = inputted;
            if (answer == inputted) {
                break;
            } else if (answer > inputted) {
                System.out.println("もっと大きいよ");
            } else {
                System.out.println("もっと小さいよ");
            }
        }
        if (cnt < 3) {
            System.out.println("大あたり!すごいことだよ!");
        } else if (cnt < 5) {
            System.out.println("あたり。まあまあすごいよ。");
        } else {
            System.out.println("5回以内に答えられなかったのでゲーム終了");
        }
        long end = System.currentTimeMillis();
        System.out.println((end - start) / 1000 + "秒かかったよ");
        System.out.println("次回のために履歴を表示するので参考にしてね");
        for (int j = 0; j < cnt; j++) {
            System.out.print(history[j] + "→");
        }
        System.out.print("終了!");
        scanner.close();
    }
}

このとき、Kazuateクラスを別途作成し、インスタンスを生成してインスタンスメソッドを使ったプログラムに変更したい。

以下の書きかけのテストプログラムと整合するようにKazuateクラスを作成しなさい。

package p09;

import java.util.Random;
import java.util.Scanner;

public class Q12InstanceMethodTest {
    public static void main(String[] args) {
        Kazuate kazuate = new Kazuate();
        kazuate.setAnswer();
        long start = System.currentTimeMillis();
        kazuate.checkTheAnswer();
        long end = System.currentTimeMillis();
        System.out.println((end - start) / 1000 + "秒かかったよ");
        kazuate.showHistory();
    }
}
class Kazuate {
  
  //この下にKazuateクラスのフィールドとメソッドを作成しなさい

12.数当てクラスが時間を計測する

時間の計測をkazuateクラスの責務とすることで数宛てクラスが時間を計測するように変更を加えなさい。

13.複数人プレイ対応

上記数当てゲームを参加プレイヤーの人数分インスタンスを生成することで複数人プレイ可能にしなさい。

なお、回答の回数が多いプレイヤーの勝利とし、同じ回数の場合は同点とすること。

14.オリジナル問題作成

将来の後輩のために良い問題が出来たら教えてください。

JavaSEの問題集トップページに戻る