解答例 - j1.lesson11.Receipt

package j1.lesson11;

import java.io.*;

/**
 * 課題1103 - 解答例.
 @author s.arakawa
 @version $Id: Receipt_java.rps,v 1.1 2006/03/06 12:56:14 java2005 Exp $
 */
public class Receipt {

    /**
     * 5個の商品の個数をそれぞれ入力し、それぞれの商品の金額と合計金額を表示するプログラム。
     * 商品の単価は、それぞれ以下のようになっているとする。
     <table>
     <tr> <th> 商品番号 </th><th> 単価 </th> </tr>
     <tr> <td> </td> <td> 100 </td> </tr>
     <tr> <td> </td> <td> 150 </td> </tr>
     <tr> <td> </td> <td> 80 </td> </tr>
     <tr> <td> </td> <td> 90 </td> </tr>
     <tr> <td> </td> <td> 250 </td> </tr>
     </table>
     
     * 以下の擬似コードで表される。
     <pre>
     * プログラム全体
     *     unit-costs = {100, 150, 80, 90, 250}
     *     quantities = 長さ unit-costs を持つ新しい配列 (int[])
     *     item-number = 0
     *     while item-number が quantities の長さよりも小さい
     *         print &quot;商品番号&quot; item-number &quot;の個数を入力:&quot;
     *         quantities[item-number] = コンソール入力 (整数)
     *         if quantities[item-number] が 0 以上
     *             item-number の値を 1 増やす
     *         else
     *             print &quot;個数は0個以上でなくてはなりません&quot;, 改行
     *     totals = calculate-amounts(unit-costs, quantities)
     *     for i を 0 から unit-costs の長さ - まで
     *         print &quot;番号 &quot; i &quot;, &quot;
     *         print &quot;単価 &quot; unit-costs[i] &quot;, &quot;
     *         print &quot;個数 &quot; quantities[i] &quot;, &quot; 
     *         print &quot;金額 &quot; totals[i]
     *         print 改行
     *     print &quot;合計 &quot; totalsの最後の要素 
     *     print 改行
     </pre>
     @param args 無視される
     @throws IOException 入力時に例外が発生した場合
     */
    // プログラム全体
    public static void main(String[] argsthrows IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        // unit-costs = {100, 150, 80, 90, 250}
        int[] unitCosts = 1001508090250 };

        // quantities = 長さ unit-costs を持つ新しい配列 (int[])
        int[] quantities = new int[unitCosts.length];

        // item-number = 0
        int itemNumber = 0;

        // while item-number が quantities の長さよりも小さい
        while (itemNumber < quantities.length) {
            // print "商品番号" item-number "の個数を入力:"
            System.out.print("商品番号" + itemNumber + "の個数を入力:");

            // quantities[item-number] = コンソール入力 (整数)
            quantities[itemNumber= Integer.parseInt(reader.readLine());

            // if quantities[item-number] が 0 以上
            if (quantities[itemNumber>= 0) {
                // item-number の値を 1 増やす
                itemNumber++;
            }
            // else
            else {
                // print "個数は0個以上でなくてはなりません", 改行
                System.out.println("個数は0個以上でなくてはなりません");
            }
        }

        // totals = calculate-amounts(unit-costs, quantities)
        int[] totals = calculateAmounts(unitCosts, quantities);

        // for i を 0 から unit-costs の長さ - まで
        for (int i = 0; i < unitCosts.length; i++) {
            // print "番号 " i ", "
            System.out.print("番号" + i + ", ");

            // print "単価 " unit-costs[i] ", "
            System.out.print("単価 " + unitCosts[i", ");

            // print "個数 " quantities[i] ", "
            System.out.print("個数 " + quantities[i", ");

            // print "合計 " totals[i]
            // print 改行
            System.out.println("金額 " + totals[i]);
        }
        // print "総計 " totalsの最後の要素
        // print 改行
        System.out.println("合計 " + totals[totals.length - 1]);
    }

    /**
     * 単価リストと個数リストより、各商品の金額と合計金額を計算する。 返される配列は次のような形式である。
     <ul>
     <li> 配列の長さが 単価リストの配列の長さ + 1 </li>
     <li> 最後の要素以外は 返される配列[i] = 単価リスト[i] * 個数リスト[i] </li>
     <li> 最後の要素は、最後の要素以外の合計 </li>
     </ul>
     * 以下の擬似コードで表される。
     <pre>
     * calculate-amounts(単価リスト, 個数リスト)
     *     金額リスト = 単価リストよりも要素数が1多い新しい配列 (int[])
     *     合計金額 = 0
     *     for i を 0 から 単価リストの長さ - 1 
     *         金額 = 単価リスト[i] * 個数リスト[i]
     *         金額リスト[i] = 金額
     *     金額リストの最後の要素 = 合計金額
     *     金額リストを返す
     </pre>
     @param unitCosts 単価リスト
     @param quantities 個数リスト
     @return 金額リスト
     */
    public static int[] calculateAmounts(int[] unitCosts, int[] quantities) {
        // 金額リスト = 単価リストよりも要素数が1多い新しい配列 (int[])
        int[] amounts = new int[unitCosts.length + 1];

        // 合計金額 = 0
        int totalAmount = 0;

        // for i を 0 から 単価リストの長さ - 1
        for (int i = 0; i < unitCosts.length; i++) {
            // 金額 = 単価リスト[i] * 個数リスト[i]
            int subAmount = unitCosts[i* quantities[i];

            // 金額リスト[i] = 金額
            amounts[i= subAmount;
            totalAmount += subAmount;
        }

        // 金額リストの最後の要素 = 合計金額
        amounts[amounts.length - 1= totalAmount;

        // 金額リストを返す
        return amounts;
    }
}