4.配列

はじめに

本大問で作成するプログラム(演習課題も含む)を保存するためのパッケージを作成する。

  • パッケージ名
    web._04

4-1

数値列の計算

入力された好きな整数値の合計(整数値)、平均(小数値)、最大値(整数値)、最小値(整数値)を計算し、結果を表示するプログラムを作成する。
画面は<画面レイアウト>を参照すること。
なお、クラス名・実装先メソッドは以下の通り。

  • クラス名
    S41InputNumCalculation
  • 実装先メソッド
    mainメソッド

【仕様】

  • 入力された整数値は、配列に格納してから使うこと。
  • 入力できる整数値は最大10個までとする。
    ただし、「q(もしくはQ)」が入力された場合は、そこで入力を終了する。
  • 整数値の入力は-99999~99999の半角整数値のみとする。
  • 平均は小数部も含めて表示する。

【注意点】

※現時点で、入力された値が有効範囲か確認するプログラムを実装する必要はない。
※小数部の第○位は気にしなくてよい。
※整数型から文字列型へ変換する時は、Integer.parseInt(対象の文字列)、を使います。
   例)String strNum = "1";
     int num = Integer.parseInt(strNum);
     ⇒numを参照すると整数値の「1」を利用できます。
※文字列同士を比較したい時は、Stringクラスのequalsメソッドを使います。
   例)String name = "石井";
     boolean isMatch = name.equals("佐野");
     ⇒nameに保管されている"石井"という文字と、( )の中に書かれた"佐野"という文字列が
      同じ文字列かどうか判定します。
      同じならtrue、違うならfalseと判定されます。

【画面レイアウト】

整数を10個まで入力、または「q」入力で終了します。
整数1を入力してください。
8                        ・・・ここからユーザー入力
整数2を入力してください。
32
整数3を入力してください。
-16
整数4を入力してください。
200
整数5を入力してください。
75
整数6を入力してください。
q                        ・・・ここで入力終わり
8、32、-16、200、75の数値列では【合計:299】【平均:59.8】【最大:200】【最小:-16】でした。 ・・・ここから結果表示

【テストパターン】

考え方
・10個全部入力したら、結果が表示されるかどうか確認する。
・10個以下でも「q(もしくはQ)」が入力されたらその時点で入力を終了し、結果が表示されるかどうか確認する。
・入力に、以下のものを含めてみる。
・エラー入力を除いて、10個の整数値が処理されるかどうか確認する。
・1回目でいきなり「q(もしくはQ)」入力で終了させてみる。
・「0」を含めてみる。
 (例:「2、4、5」と「2、0、4、5」では、最小値と平均値が変わる)
実行例以外の具体的な入力例(実際には、もっといろいろやってみること)
・整数1「30」、整数2「3」、整数3「24」、整数4「10」、整数5「2」、整数6「19」、整数7「0」、整数8「2」、整数9「1」、整数10「21」
・整数1「63」、整数2「-6」、整数3「m&m」、整数4「57」、整数5「-30」、整数6「q」
・整数1「5.7」、整数2「0.31」、整数3「Q」

【サンプルソースコード】

S41InputNumCalculation.java

package web._04; /** * 4-1:入力値の合計・平均・最大・最少値を計算し、表示するクラスです。 * * @author akira_ishii * */ public class S41InputNumCalculation { /** * 入力値の合計・平均・最大・最少値を計算し、表示します。 * * @param args * コマンドライン引数 */ public static void main(String[] args) { int arraySize = 10; System.out.println("整数を" + arraySize + "個まで入力、または「q」入力で終了します。"); int[] numArray = new int[arraySize]; int count = 0; for (; count < arraySize; count++) { System.out.println("整数" + (count + 1) + "を入力してください。"); String input = new java.util.Scanner(System.in).next(); if (input.equals("q") || input.equals("Q")) { break; } int num = Integer.parseInt(input); numArray[count] = num; } int max = numArray[0]; int min = numArray[0]; int sum = 0; for (int i = 0; i < count; i++) { sum = sum + numArray[i]; if (max < numArray[i]) { max = numArray[i]; } if (numArray[i] < min) { min = numArray[i]; } System.out.print(numArray[i]); if (i != count - 1) { System.out.print("、"); } } System.out.print("の数値列では"); double ave = (double) sum / count; System.out.println("【合計:" + sum + "】【平均:" + ave + "】【最大:" + max + "】【最小:" + min + "】でした。"); } }

4-2

英語の月名表示

入力された月(整数値)の数字に応じた英語の月名(文字列)を画面表示するプログラムを作成する。
画面は<画面レイアウト>を参照すること。
なお、クラス名・実装先メソッドは以下の通り。

  • クラス名
    S42MonthNameDisplay
  • 実装先メソッド
    mainメソッド

【仕様】

  • if文やswitch文は使わず、配列を使って処理する。
  • 月の入力は1~12の半角整数値のみとする。

【注意点】

※現時点で、入力された値が有効範囲か確認するプログラムを実装する必要はない。

【画面レイアウト】

月の数字を入力してください。
10
10月はOctoberです。

【テストパターン】

考え方
・1~12を、ひととおり入力する。
・月として適切な値の、境界値(0、13)を入力する。
・以下の入力をする。
 未入力、数値でないもの(文字や記号)、マイナス値、小数値、大きな数値
実行例以外の具体的な入力例(実際には、もっといろいろやってみること)
・「12」
・「21」
・「0」
・「13」
・「May」

【サンプルソースコード】

S42MonthNameDisplay.java

package web._04; /** * 4-2:月名を表示するクラスです。 * * @author akira_ishii * */ public class S42MonthNameDisplay { /** * 入力された数字の月名を表示します。 * * @param args * コマンドライン引数 */ public static void main(String[] args) { String[] monthEnglish = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "Novembar", "Decembar" }; System.out.println("月の数字を入力してください。"); int num = new java.util.Scanner(System.in).nextInt(); System.out.println(num + "月は" + monthEnglish[num - 1] + "です。"); } }

4-3

買い物リスト計算

商品名(文字列)・単価(整数値)・数量(整数値)の買い物データリストの合計金額を計算し、
明細・合計金額(税抜・税込の両方)を画面表示するプログラムを作成する。
税込金額は整数部のみの表示(小数点以下切り捨て)でよいものとする。
画面は<画面レイアウト>を参照すること。
なお、クラス名・実装先メソッドは以下の通り。

  • クラス名
    S43ShoppingCalculation
  • 実装先メソッド
    mainメソッド

【仕様】

  • 買い物データとして、商品名、単価、数量を最大10組まで入力できる。
    ただし、単価か数量に「-1」が入力された場合は、その組で入力を終了する。
  • 単価の入力は10~980000の半角整数値のみとする。
  • 数量の入力は1~100の半角整数値のみとする。
  • 消費税は5%で計算する。
  • 消費税計算で端数が出る場合、小数点以下は切り捨ててよい。

【注意点】

※現時点で、入力された値が有効範囲か確認するプログラムを実装する必要はない。

【画面レイアウト】

入力は10個まで、または単価か数量に「-1」入力で終了
<商品データの入力1>・・・以下、各買い物データ入力
商品名
ビール
単価
500
数量
12
<商品データの入力2>
商品名
おにぎり
単価
120
数量
20
<商品データの入力3>
商品名
コロッケ
単価
150
数量
30
<商品データの入力4>
商品名
メンチカツ
単価
-1
数量
10                                    ・・・ここで入力終了
=====
<明細>                                ・・・入力データの明細表示
【ビール】500×12=6000円
【おにぎり】120×20=2400円
【コロッケ】150×30=4500円
=====
【合計】12900円                            ・・・合計表示
【税込】13545円

【テストパターン】

考え方
・個々の入力と計算については、1−8と同様のテストを行う。
・10パターン全部入力したら、結果が表示されるかどうか確認する。
・10パターン以下でも、単価 or 数量に「-1」が入力されたらその時点で入力を終了し、結果が表示されるかどうか確認する。
・エラー入力を除いて、10パターンの入力が処理されるかどうか確認する。
・入力後、入力した有効データがすべて明細に表示されるかどうか確認する。
 エラーデータが明細に表示されるようなことがないか
・各入力パターンについて、正しく計算されるかどうか確認する。
・明細に対して、合計が正しく計算されるかどうか確認する。
 エラーデータが合計に含まれるようなことがないか
・合計に対して、税込が正しく計算されるかどうか確認する。
・1回目でいきなり「-1」入力で終了させてみる。
 明細および合計が、どう表示されるか
 どう表示するのが適切か
実行例以外の具体的な入力例(実際には、もっといろいろやってみること)
・商品名1「スーツ」、単価1「24000」、数量1「1」
 商品名2「シャツ」、単価2「6800」、数量2「3」
 商品名3「靴」、単価3「9800」、数量3「2」
 商品名4「かばん」、単価4「8500」、数量4「1」
 商品名5「手帳」、単価5「1200」、数量5「1」
 商品名6「ペン」、単価6「300」、数量6「2」
 商品名7「名刺入れ」、単価7「580」、数量7「1」
 商品名8「ハンカチ」、単価8「450」、数量8「4」
 商品名9「お茶」、単価9「140」、数量9「5」
 商品名10「健康食品」、単価10「215」、数量10「5」

・商品名1「ラケット」、単価1「15000」、数量1「1」
 商品名2「ウェア」、単価2「66.666」、数量2「2」
 商品名3「シューズ」、単価3「12000」、数量3「&」
 商品名4「ソックス」、単価4「-1」、数量4「10」

・商品名1「傘」、単価1「3280」、数量1「1」
 商品名2「レインコート」、単価2「2800」、数量2「1」
 商品名3「ゴム長ぐつ」、単価3「1980」、数量3「1」
 商品名4「タオル」、単価4「350」、数量4「3」
 商品名5「あめんぼ」、単価5「95000」、数量5「-1」

【サンプルソースコード】

S43ShoppingCalculation.java

package web._04; /** * 4-3:買い物の合計金額を計算し、表示するクラスです。 * * @author akira_ishii * */ public class S43ShoppingCalculation { /** * 買い物の合計金額を計算し、表示します。 * * @param args * コマンドライン引数 */ public static void main(String[] args) { int arraySize = 10; String[] goodsNameArray = new String[arraySize]; int[] priceArray = new int[arraySize]; int[] quantityArray = new int[arraySize]; int i = 0; System.out.println("入力は10個まで、または単価か数量に「-1」入力で終了"); for (i = 0; i < arraySize; i++) { System.out.println("<商品データの入力" + (i + 1) + ">"); System.out.println("商品名"); String goodsName = new java.util.Scanner(System.in).nextLine(); System.out.println("単価"); int price = Integer.parseInt(new java.util.Scanner(System.in).nextLine()); System.out.println("数量"); int quantity = Integer.parseInt(new java.util.Scanner(System.in).nextLine()); if (price == -1 || quantity == -1) { break; } goodsNameArray[i] = goodsName; priceArray[i] = price; quantityArray[i] = quantity; } int size = i; System.out.println("====="); System.out.println("<明細>"); int sumAll = 0; for (i = 0; i < size; i++) { int sum = priceArray[i] * quantityArray[i]; System.out.println("【" + goodsNameArray[i] + "】" + priceArray[i] + "×" + quantityArray[i] + "=" + sum + "円"); sumAll = sumAll + sum; } System.out.println("====="); System.out.println("【合計】" + sumAll + "円"); int sumAllTax = (int) (sumAll * 1.05); System.out.println("【税込】" + sumAllTax + "円"); } }

4-4

整数並べ替え

入力された整数を、昇順に並べ替えて結果を表示するプログラムを作成する。
画面は<画面レイアウト>を参照すること。
なお、クラス名・実装先メソッドは以下の通り。

  • クラス名
    S44NumberSort
  • 実装先メソッド
    mainメソッド

【仕様】

  • 入力された整数値は、配列に格納してから使うこと。
  • 整数は最大10個まで入力できる。
    ただし、「q(もしくはQ)」が入力された場合は、そこで入力を終了する。
  • 整数値の入力は-99999~99999の半角整数値のみとする。

【注意点】

※Arrays.sort()は使わないこと。
※現時点で、入力された値が有効範囲か確認するプログラムを実装する必要はない。

【画面レイアウト】

昇順に並べ替える整数を10個まで入力、または「q」入力で終了します。
整数1を入力してください。                ・・・ここからユーザー入力
79
整数2を入力してください。
7
整数3を入力してください。
24
整数4を入力してください。
23
整数5を入力してください。
13
整数6を入力してください。
q                                ・・・ここで入力終わり
=====
7                                ・・・入力した整数を昇順に並べ替え、その順番で結果表示
13
23
24
79

【テストパターン】

考え方
・10個全部入力したら、結果が表示されるかどうか確認する。
・10個以下でも「q(もしくはQ)」が入力されたらその時点で入力を終了し、結果が表示されるかどうか確認する。
・入力に、以下のものを含めてみる。
 未入力、数値でないもの(文字や記号)、マイナス値、小数値、大きな数値
・エラー入力を除いて、10個の整数値が処理されるかどうか確認する。
・1回目でいきなり「q(もしくはQ)」入力で終了させてみる。
実行例以外の具体的な入力例(実際には、もっといろいろやってみること)
・整数1「31」、整数2「4」、整数3「23」、整数4「2」、整数5「58」、整数6「16」、整数7「92」、整数8「74」、整数9「20」、整数10「17」
・整数1「18」、整数2「35」、整数3「-51」、整数4「7」、整数5「21」、整数6「q」
・整数1「7.6」、整数2「0.02」、整数3「Q」

【サンプルソースコード】

S44NumberSort.java

package web._04; /** * 4-4:入力値のソートを行い、結果を表示するクラスです。 * * @author akira_ishii */ public class S44NumberSort { /** * 入力値のソートを行い、結果を表示します。 * * @param args * コマンドライン引数 */ public static void main(String[] args) { int arraySize = 10; System.out.println("昇順に並べ替える整数を" + arraySize + "個まで入力、または「q」入力で終了します。"); int numArray[] = new int[10]; int i; for (i = 0; i < 10; i++) { System.out.println("整数" + (i + 1) + "を入力してください。"); String input = new java.util.Scanner(System.in).next(); if (input.equals("q") || input.equals("Q")) { break; } numArray[i] = Integer.parseInt(input); } int num = 0; int size = i; for (i = 0; i < size; i++) { for (int j = size - 1; i < j; j--) { if (numArray[j] < numArray[j - 1]) { num = numArray[j]; numArray[j] = numArray[j - 1]; numArray[j - 1] = num; } } } System.out.println("====="); for (int j = 0; j < size; j++) { System.out.println(numArray[j]); } } }

4-5

買い物リスト計算 - ArrayList版

商品名(文字列)・単価(整数値)・数量(整数値)の買い物データリストの合計金額を計算し、
明細・合計金額(税抜・税込の両方)を画面表示するプログラムを作成する。
税込金額は整数部のみの表示(小数点以下切り捨て)でよいものとする。
画面は<画面レイアウト>を参照すること。
なお、クラス名・実装先メソッドは以下の通り。

  • クラス名
    S45ShoppingCalculation
  • 実装先メソッド
    mainメソッド

【仕様】

  • 買い物データとして、商品名、単価、数量を最大10組まで入力できる。
    ただし、単価か数量に「-1」が入力された場合は、その組で入力を終了する。
  • 単価の入力は10~980000の半角整数値のみとする。
  • 数量の入力は1~100の半角整数値のみとする。
  • 消費税は5%で計算する。
  • 消費税計算で端数が出る場合、小数点以下は切り捨ててよい。

【注意点】

※ArrayListを使用すること。
※本課題は4−3のプログラムを配列⇒ArrayListに改修する問題になっています。
 0からつくる必要はないので、4-3のサンプルプログラムを元に作成して構いません。
※現時点で、入力された値が有効範囲か確認するプログラムを実装する必要はない。

【画面レイアウト1(買い物データ1件以上)】

入力は10個まで、または単価か数量に「-1」入力で終了
<商品データの入力1>・・・以下、各買い物データ入力
商品名
ビール
単価
500
数量
12
<商品データの入力2>
商品名
おにぎり
単価
120
数量
20
<商品データの入力3>
商品名
コロッケ
単価
150
数量
30
<商品データの入力4>
商品名
メンチカツ
単価
-1
数量
10                                    ・・・ここで入力終了
=====
<明細>                                ・・・入力データの明細表示
【ビール】500×12=6000円
【おにぎり】120×20=2400円
【コロッケ】150×30=4500円
=====
【合計】12900円                            ・・・合計表示
【税込】13545円

【画面レイアウト2(買い物データ0件)】

入力は10個まで、または単価か数量に「-1」入力で終了
<商品データの入力1>        ・・・以下、各買い物データ入力
商品名
ビール
単価
-1
数量
20                        ・・・ここで入力終了
=====
<明細>                    ・・・入力データの明細表示
=====
【合計】0円                    ・・・合計表示
【税込】0円

【テストパターン】

考え方
・個々の入力と計算については、1−8と同様のテストを行う。
・10パターン全部入力したら、結果が表示されるかどうか確認する。
・10パターン以下でも、単価 or 数量に「-1」が入力されたらその時点で入力を終了し、結果が表示されるかどうか確認する。
・エラー入力を除いて、10パターンの入力が処理されるかどうか確認する。
・入力後、入力した有効データがすべて明細に表示されるかどうか確認する。
 エラーデータが明細に表示されるようなことがないか
・各入力パターンについて、正しく計算されるかどうか確認する。
・明細に対して、合計が正しく計算されるかどうか確認する。
 エラーデータが合計に含まれるようなことがないか。
・合計に対して、税込が正しく計算されるかどうか確認する。
・1回目でいきなり「-1」入力で終了させてみる。
 明細および合計が、どう表示されるか
 どう表示するのが適切か
実行例以外の具体的な入力例(実際には、もっといろいろやってみること)
・商品名1「スーツ」、単価1「24000」、数量1「1」
 商品名2「シャツ」、単価2「6800」、数量2「3」
 商品名3「靴」、単価3「9800」、数量3「2」
 商品名4「かばん」、単価4「8500」、数量4「1」
 商品名5「手帳」、単価5「1200」、数量5「1」
 商品名6「ペン」、単価6「300」、数量6「2」
 商品名7「名刺入れ」、単価7「580」、数量7「1」
 商品名8「ハンカチ」、単価8「450」、数量8「4」
 商品名9「お茶」、単価9「140」、数量9「5」
 商品名10「健康食品」、単価10「215」、数量10「5」

・商品名1「ラケット」、単価1「15000」、数量1「1」
 商品名2「ウェア」、単価2「66.666」、数量2「2」
 商品名3「シューズ」、単価3「12000」、数量3「&」
 商品名4「ソックス」、単価4「-1」、数量4「10」

・商品名1「傘」、単価1「3280」、数量1「1」
 商品名2「レインコート」、単価2「2800」、数量2「1」
 商品名3「ゴム長ぐつ」、単価3「1980」、数量3「1」
 商品名4「タオル」、単価4「350」、数量4「3」
 商品名5「あめんぼ」、単価5「95000」、数量5「-1」

【テスト仕様書・報告書】

本問題はテスト仕様書・報告書を自身で作成してテストする問題なっている。
テスト仕様書・報告書のフォーマットおよび作業内容・注意事項はこちらを確認して、テスト仕様書・報告書の作成およびテストを実施すること。


4-6

買い物リスト計算 - HashSet版

商品名(文字列)・単価(整数値)・数量(整数値)の買い物データリストの合計金額を計算し、
明細・合計金額(税抜・税込の両方)を画面表示するプログラムを作成する。
画面は<画面レイアウト>を参照すること。
なお、クラス名・実装先メソッドは以下の通り。

  • クラス名
    S46ShoppingCalculation
  • 実装先メソッド
    mainメソッド

【仕様】

  • 買い物データとして、商品名、単価、数量を最大10組まで入力できる。
    ただし、単価か数量に「-1」が入力された場合は、その組で入力を終了する。
  • 単価の入力は10~980000の半角整数値のみとする。
  • 数量の入力は1~100の半角整数値のみとする。
  • 消費税は5%で計算する。
  • 消費税計算で端数が出る場合、小数点以下は切り捨ててよい。

【注意点】

※HashSetを使用すること。
 なお、使用するデータによっては、期待通りの結果にならないこともあるが、
 「何故そうなったのか」をHashSetの構造も踏まえて考え、理解すること。
※現時点で、入力された値が有効範囲か確認するプログラムを実装する必要はない。

【画面レイアウト】

入力は10個まで、または単価か数量に「-1」入力で終了
<商品データの入力1>・・・以下、各買い物データ入力
商品名
ビール
単価
500
数量
12
<商品データの入力2>
商品名
おにぎり
単価
120
数量
20
<商品データの入力3>
商品名
コロッケ
単価
150
数量
30
<商品データの入力4>
商品名
メンチカツ
単価
-1
数量
10                                    ・・・ここで入力終了
=====
<明細>                                ・・・入力データの明細表示
【ビール】500×12=6000円
【おにぎり】120×20=2400円
【コロッケ】150×30=4500円
=====
【合計】12900円                            ・・・合計表示
【税込】13545円

【テストパターン】

考え方
・個々の入力と計算については、1−8と同様のテストを行う。
・10パターン全部入力したら、結果が表示されるかどうか確認する。
・10パターン以下でも、単価 or 数量に「-1」が入力されたらその時点で入力を終了し、結果が表示されるかどうか確認する。
・エラー入力を除いて、10パターンの入力が処理されるかどうか確認する。
・入力後、入力した有効データがすべて明細に表示されるかどうか確認する。
 エラーデータが明細に表示されるようなことがないか
・各入力パターンについて、正しく計算されるかどうか確認する。
・明細に対して、合計が正しく計算されるかどうか確認する。
 エラーデータが合計に含まれるようなことがないか
・合計に対して、税込が正しく計算されるかどうか確認する。
・1回目でいきなり「-1」入力で終了させてみる。
 明細および合計が、どう表示されるか
 どう表示するのが適切か
実行例以外の具体的な入力例(実際には、もっといろいろやってみること)
・商品名1「スーツ」、単価1「24000」、数量1「1」
 商品名2「シャツ」、単価2「6800」、数量2「3」
 商品名3「靴」、単価3「9800」、数量3「2」
 商品名4「かばん」、単価4「8500」、数量4「1」
 商品名5「手帳」、単価5「1200」、数量5「1」
 商品名6「ペン」、単価6「300」、数量6「2」
 商品名7「名刺入れ」、単価7「580」、数量7「1」
 商品名8「ハンカチ」、単価8「450」、数量8「4」
 商品名9「お茶」、単価9「140」、数量9「5」
 商品名10「健康食品」、単価10「215」、数量10「5」

・商品名1「ラケット」、単価1「15000」、数量1「1」
 商品名2「ウェア」、単価2「66.666」、数量2「2」
 商品名3「シューズ」、単価3「12000」、数量3「&」
 商品名4「ソックス」、単価4「-1」、数量4「10」

・商品名1「傘」、単価1「3280」、数量1「1」
 商品名2「レインコート」、単価2「2800」、数量2「1」
 商品名3「ゴム長ぐつ」、単価3「1980」、数量3「1」
 商品名4「タオル」、単価4「350」、数量4「3」
 商品名5「あめんぼ」、単価5「95000」、数量5「-1」

【サンプルソースコード】

S46ShoppingCalculation.java

package web._04; import java.util.HashSet; import java.util.Iterator; import java.util.Set; /** * 4-6:買い物の入力および、合計金額を計算し、結果を表示するクラスです。 * * @author akira_ishii * */ public class S46ShoppingCalculation { /** * 買い物の合計金額を計算し、表示します。 * * @param args * コマンドライン引数 */ public static void main(String[] args) { int countMax = 10; Set<String> goodsNameSet = new HashSet<>(countMax); Set<Integer> priceSet = new HashSet<>(countMax); Set<Integer> quantitySet = new HashSet<>(countMax); System.out.println("入力は10個まで、または単価か数量に「-1」入力で終了"); for (int i = 0; i < countMax; i++) { System.out.println("<商品データの入力" + (i + 1) + ">"); System.out.println("商品名"); String goodsName = new java.util.Scanner(System.in).next(); System.out.println("単価"); int price = new java.util.Scanner(System.in).nextInt(); System.out.println("数量"); int quantity = new java.util.Scanner(System.in).nextInt(); if (price == -1 || quantity == -1) { break; } goodsNameSet.add(goodsName); priceSet.add(price); quantitySet.add(quantity); } System.out.println("====="); System.out.println("<明細>"); int sumAll = 0; Iterator<Integer> priceIt = priceSet.iterator(); Iterator<Integer> quantityIt = quantitySet.iterator(); for (String name : goodsNameSet) { Integer price = priceIt.next(); Integer quantity = quantityIt.next(); int sum = price.intValue() * quantity.intValue(); sumAll = sumAll + sum; System.out.println("【" + name + "】" + price + "×" + quantity + "=" + sum + "円"); } System.out.println("====="); System.out.println("【合計】" + sumAll + "円"); int sumAllTax = (int) (sumAll * 1.05); System.out.println("【税込】" + sumAllTax + "円"); } }

4-7

買い物リスト計算 - HashMap版

商品名(文字列)・単価(整数値)・数量(整数値)の買い物データリストの合計金額を計算し、
明細・合計金額(税抜・税込の両方)を画面表示するプログラムを作成する。
税込金額は整数部のみの表示(小数点以下切り捨て)でよいものとする。
画面は<画面レイアウト>を参照すること。
なお、クラス名・実装先メソッドは以下の通り。

  • クラス名
    S47ShoppingCalculation
  • 実装先メソッド
    mainメソッド

【仕様】

  • 買い物データとして、商品名、単価、数量を最大10組まで入力できる。
    ただし、単価か数量に「-1」が入力された場合は、その組で入力を終了する。
  • 単価の入力は10~980000の半角整数値のみとする。
  • 数量の入力は1~100の半角整数値のみとする。
  • 消費税は5%で計算する。
  • 消費税計算で端数が出る場合、小数点以下は切り捨ててよい。

【注意点】

※HashMapを使用すること。
 なお、使用するデータによっては、期待通りの結果にならないこともあるが、
 「何故そうなったのか」をHashMapの構造も踏まえて考え、理解すること。
※現時点で、入力された値が有効範囲か確認するプログラムを実装する必要はない。

【画面レイアウト】

入力は10個まで、または単価か数量に「-1」入力で終了
<商品データの入力1>・・・以下、各買い物データ入力
商品名
ビール
単価
500
数量
12
<商品データの入力2>
商品名
おにぎり
単価
120
数量
20
<商品データの入力3>
商品名
コロッケ
単価
150
数量
30
<商品データの入力4>
商品名
メンチカツ
単価
-1
数量
10                                    ・・・ここで入力終了
=====
<明細>                                ・・・入力データの明細表示
【ビール】500×12=6000円
【おにぎり】120×20=2400円
【コロッケ】150×30=4500円
=====
【合計】12900円                            ・・・合計表示
【税込】13545円

【テストパターン】

考え方
・個々の入力と計算については、1−8と同様のテストを行う。
・10パターン全部入力したら、結果が表示されるかどうか確認する。
・10パターン以下でも、単価 or 数量に「-1」が入力されたらその時点で入力を終了し、結果が表示されるかどうか確認する。
・エラー入力を除いて、10パターンの入力が処理されるかどうか確認する。
・入力後、入力した有効データがすべて明細に表示されるかどうか確認する。
 エラーデータが明細に表示されるようなことがないか
・各入力パターンについて、正しく計算されるかどうか確認する。
・明細に対して、合計が正しく計算されるかどうか確認する。
 エラーデータが合計に含まれるようなことがないか
・合計に対して、税込が正しく計算されるかどうか確認する。
・1回目でいきなり「-1」入力で終了させてみる。
 明細および合計が、どう表示されるか
 どう表示するのが適切か
実行例以外の具体的な入力例(実際には、もっといろいろやってみること)
・商品名1「スーツ」、単価1「24000」、数量1「1」
 商品名2「シャツ」、単価2「6800」、数量2「3」
 商品名3「靴」、単価3「9800」、数量3「2」
 商品名4「かばん」、単価4「8500」、数量4「1」
 商品名5「手帳」、単価5「1200」、数量5「1」
 商品名6「ペン」、単価6「300」、数量6「2」
 商品名7「名刺入れ」、単価7「580」、数量7「1」
 商品名8「ハンカチ」、単価8「450」、数量8「4」
 商品名9「お茶」、単価9「140」、数量9「5」
 商品名10「健康食品」、単価10「215」、数量10「5」

・商品名1「ラケット」、単価1「15000」、数量1「1」
 商品名2「ウェア」、単価2「66.666」、数量2「2」
 商品名3「シューズ」、単価3「12000」、数量3「&」
 商品名4「ソックス」、単価4「-1」、数量4「10」

・商品名1「傘」、単価1「3280」、数量1「1」
 商品名2「レインコート」、単価2「2800」、数量2「1」
 商品名3「ゴム長ぐつ」、単価3「1980」、数量3「1」
 商品名4「タオル」、単価4「350」、数量4「3」
 商品名5「あめんぼ」、単価5「95000」、数量5「-1」

【サンプルソースコード】

S47ShoppingCalculation.java

package web._04; import java.util.HashMap; import java.util.Map; /** * 4-7:買い物の入力および、計算結果を表示するクラスです。 * * @author akira_ishii * */ public class S47ShoppingCalculation { /** * 買い物の合計金額を計算し、表示します。 * * @param args * コマンドライン引数 */ public static void main(String[] args) { int countMax = 10; Map<String, Integer[]> goodsMap = new HashMap<>(countMax); System.out.println("入力は10個まで、または単価か数量に「-1」入力で終了"); for (int i = 0; i < countMax; i++) { System.out.println("<商品データの入力" + (i + 1) + ">"); System.out.println("商品名"); String goodsName = new java.util.Scanner(System.in).next(); System.out.println("単価"); int price = new java.util.Scanner(System.in).nextInt(); System.out.println("数量"); int quantity = new java.util.Scanner(System.in).nextInt(); if (price == -1 || quantity == -1) { break; } Integer[] info = new Integer[] { price, quantity }; goodsMap.put(goodsName, info); } System.out.println("====="); System.out.println("<明細>"); int sumAll = 0; for (String key : goodsMap.keySet()) { Integer[] info = goodsMap.get(key); int sum = info[0].intValue() * info[1].intValue(); sumAll = sumAll + sum; System.out.println("【" + key + "】" + info[0].intValue() + "×" + info[1].intValue() + "=" + sum + "円"); } System.out.println("====="); System.out.println("【合計】" + sumAll + "円"); int sumAllTax = (int) (sumAll * 1.05); System.out.println("【税込】" + sumAllTax + "円"); } }

Copyright © Xincor miXell Co., Ltd. All rights reserved

results matching ""

    No results matching ""