スポンサーリンク

【Java】オブジェクト指向の練習問題Level_1(メニュー注文表)、カプセル化・ポリモーフィズム

JAVA練習問題集

Javaの勉強の中でつまずくポイントの1つにオプジェクト指向があると思います。

初学者向けに作られた(受講した講座に出てきた)オブジェクト指向の問題を記載しますので読者の参考になれば幸いです。
(環境:Mac・Eclipse_2020-12を使用しています。)

ギダイ
ギダイ

Level_1からLevel_3と段階的に難易度を分けて問題を記載します。
今回は、Level_1の問題です。

Level_1については、『カプセル化』『ポリモーフィズム』を学べる内容になっているかと思います。

と言ってもさほど難しい問題ではないと思いますので、あまり身構えずにぜひチャレンジしていただきたいと思います!(^_^)/

注意:問題の回答は、私なりの回答となっています。正解でない場合もあると思いますのでご了承ください。。

1.Java オブジェクト指向・問題Level_1(メニュー注文表)

下記の仕様書に従って、プログラムを作成しなさい。
※仕様書の中で不足箇所があると判断した場合は、変更・追加して良い事とする。

クラス一覧

クラス名説明
Hambergerハンバーガーのサイズ選択
FrenchFriesポテトのサイズ選択
Drinkドリンクのサイズ選択
Calc計算
OrderMain金額の表示

○Hamberger、FrenchFries、Drinkクラス
【フィールド】

名前説明
Stringname商品名

【コンストラクタ】

引数説明
Stringフィールドに値を代入する

【メソッド】

戻り値の型名前引数説明
IntselectSizeなし・フイールドの値(商品名)を表示する
・Mainクラスにて、標準入力で1〜3が入力された場合の値を設定し、値から値段を判別して返す(switch文を利用)

○Calcクラス
【メソッド】

戻り値の型名前引数説明
Inttotalint ham
int ff
int dri
注文商品のサイズの金額を引数として受け取り、全て足して合計を返す。

○OrderMainクラス
【mainメソッド】
1、各クラスのインスタンスを生成する(コンストラクタの引数に適当な値を代入する)
2、3つのインスタンスの selectSizeメソッドを呼び出す
3、各フィールドの値と各メソッドの戻り値(商品名と選択肢たサイズの値段)を表示
4、Calc のインスタンスの totalメソッドを呼び出す
5、total メソッドの戻り値を表示する

【表示例】
メニューのサイズを選択してください。
チーズバーガー
1:シングル、2:ダブル、3:トリプル
1
ポテト
1:S、2:M、3:L
1
ジンジャーエール
1:S、2:M、3:L
1
[選んだメニュー]
チーズバーガー:240円
ポテト:180円
コーラ:110円
お会計は 530円です。

2.回答例

・Hamburgerクラス

public class Hamburger {
	String name;          //商品名
	int num;                 //金額の設定
	//コンストラクタの設定
	public Hamburger(String name, int num) {
		this.name = name;
		this.num = num;
	}
	public int selectSize() {
		int price = 0;   //金額の設定
		//1or2or3が代入された時の分岐
		switch (num) {
		case 1:
			price = 240;
			break;
		case 2:
			price = 360;
			break;
		default:
			price = 480;
		}
		System.out.print(name + ":");
		return price;
	}
}

・FrenchFriesクラス

public class FrenchFries {
	String name;           //商品名
	int num;                  //金額の設定
	//コンストラクタの設定
	public FrenchFries(String name, int num) {
		this.name = name;
		this.num = num;
	}
	public int selectSize() {
		int price = 0;      //金額の設定
		//1or2or3が代入された時の分岐
		switch (num) {
		case 1:
			price = 180;
			break;
		case 2:
			price = 240;
			break;
		default:
			price = 280;
		}
		System.out.print(name + ":");
		return price;
	}
}

・Drinkクラス

public class Drink {
	String name;            //商品名
	int num;                   //金額の設定
	//コンストラクタの設定
	public Drink(String name, int num) {
		this.name = name;
		this.num = num;
	}
	public int selectSize() {
		int price = 0;   //金額の設定
		//1or2or3が代入された時の分岐
		switch (num) {
		case 1:
			price = 110;
			break;
		case 2:
			price = 170;
			break;
		default:
			price = 210;
		}
		System.out.print(name + ":");
		return price;
	}
}

・Calcクラス

public class Calc {
	public int total(int ham, int ff, int dri) {
		int sum = 0;
		sum = ham + ff + dri;

		return sum;
	}
}

・OrderMainクラス

public class OrderMain {
	public static void main(String[] args) {

		System.out.println("メニューのサイズを選んでください");

		String hamburger = "チーズバーガー";   //バーガー名を設定
		System.out.println(hamburger);
		System.out.println("1:シングル、2:ダブル、3:トリプル");
		Scanner scan1 = new Scanner(System.in);
		int hbselect = scan1.nextInt();
               //インスタンスの生成と引数を代入
		Hamburger hb = new Hamburger(hamburger, hbselect);

		String frenchfries = "ポテト";  //サイドメニュー名を設定
		System.out.println(frenchfries);
		System.out.println("1:S、2:M、3:L");
		Scanner scan2 = new Scanner(System.in);
		int ffselect = scan2.nextInt();
               //インスタンスの生成と引数を代入
		FrenchFries frenh = new FrenchFries(frenchfries, ffselect);

		String drink = "コーラ";   //飲み物名の設定
		System.out.println(drink);
		System.out.println("1:S、2:M、3:L");
		Scanner scan3 = new Scanner(System.in);
		int dkselect = scan3.nextInt();
               //インスタンスの生成と引数を代入
		Drink dk = new Drink(drink, dkselect);

		System.out.println("【選んだメニュー】");
               //ハンバーガー名と金額を表示
		int ham = hb.selectSize();
		System.out.println(ham + "円");

               //サイドメニュー名と金額を表示
		int ff = frenh.selectSize();
		System.out.println(ff + "円");

               //ドリンク名と金額を表示
		int dri = dk.selectSize();
		System.out.println(dri + "円");

               //インスタンスの生成
		Calc calc = new Calc();
               //ハンバーガー、ポテト、ドリンクの引数を代入して表示させる
		System.out.println("お会計は" + calc.total(ham, ff, dri) + "円です。");

               //scan のクローズ
		scan1.close();
                scan2.close();
                scan3.close();
	}
}

3.解説

ギダイ
ギダイ

上記回答は、私もあまり自信はありません・・・(; ・`д・´)

実行エラーは起きずに仕様書通りに表示されたので一旦OK?と思っています。

より良い回答ができる方がいらっしゃれば、コメントに記載していただけると非常に嬉しいです!

それでは、一旦解説いたします。

・Hamberger、FrenchFries、Drinkクラスについて

仕様書の中でサイズを指定している数字を格納する変数がなかった為、フィールドに変数(int num)を追加しました。

その為、コンストラクタにも変数(int num)を追加してます。

switch文の defaultの箇所は case3でも良いかと思います。

私が1番悩ませたのは、仕様書の記載にある『フイールドの値(商品名)を表示する』の部分です。

理由は、OrderMainクラスにて selectSize()メソッドを実装した際に、○○.selectSize() と記載しただけでは、System.out.print(name + “:”) の部分が表示されてしまうからです。

そこで○○.selectSize() を記載する箇所を return price を変数に格納するタイミングに合わせる事でこれを解決させました。(例:下記)

int ham = hb.selectSize();
System.out.println(ham + "円");
// チーズバーガー:000円 と表示される
ギダイ
ギダイ

もっと良い書き方があるかもしれません・・・。

他に良い回答が見つかった際は、内容を更新しておきます(笑)

・Clacクラスについて

特段解説することはないかと思います。

あえて記載するとしたら、sum を初期化(int sum = 0)している事について。

Java を教わった講師から初期化する事を癖にしておいた方が良いと言われた為です。

int sum = 0 は、記載しなくても問題ないかと思います。

・OrderMainクラスについて

商品名の指定がなかった為、適当に名前を設定しました。

仕様書の指示にはありませんでしたが、各クラスのコンストラクタの引数には、商品名と合わせてサイズを指定した数字(標準入力した数字)も代入しています。

また、文末に記載している scan.close() メソッドについて

scan1.close();
scan2.close();
scan3.close();

こちらは、記載していなくも問題はないと思います。

Eclipse を使用している方はご存知かと思いますが、Scannerを使用したあとclose メソッドで閉じないとEclipseからコンパイラの『警告』が表示されます。

これはエラーではないので無視しても問題ないのですが、close メソッド書くと警告が消えます。

なので私は記載するようにしています。

この事については、下記の記事にて詳しく解説されていますのでご参考ください。

4.まとめ

プログラミングを勉強していくと『カプセル化』『ポリモーフィズム』など、理解しにくい単語がいくつも出てきます。

最初は深く理解できなくてもコードを何度も書いているとなんとなく理解できるようになっていくかと思います。

私は、まずコードを書いて使用方法を覚える事を優先して学んでいました。

そして、参考書やYouTubeの解説動画などをじっくり読んで見て理解を深める事をお勧めしたいと思います。

今回の問題が、少しでも読者の方の参考になれば幸いです。

Level_2 では抽象クラスを利用した問題を用意しております。
Java.オブジェクト指向の練習問題Level_2(メニュー注文表)

コメント

タイトルとURLをコピーしました