第13週目課題

以下の仕様を満たすプログラムを作成せよ。また、テストケースを考えよ。

Review01

コンソールより重量を入力させ、その重量にあった郵便料金を表示するプログラム。

外部の仕様

ユーザが入力した重量にあった郵便料金を表示する。

主な処理の流れ

"重量を整数で入力してください[g]:" とコンソールに出力する。
ユーザによる入力を受け取る。(注1)(注2)
"料金はxx円です。" とコンソールに出力する。

料金

内部の仕様

料金の計算はif-else文の連鎖を利用する。

Review02

3乗の和を計算するプログラム。

外部の仕様

ユーザが入力した自然数nに対して1からnまでの3乗の和を出力する。

主な処理の流れ

"自然数nを入力してください:" とコンソールに出力する。
ユーザによるnの入力を受け取る。(注1)
1からnまでの3乗の和をコンソールに出力する。

内部の仕様

和の計算にはforループを使う。

テストのためには次の3乗和の公式が助けになる

(n(n+1)/2)^2

Review03

複利計算を行うプログラム。

外部の仕様

元金を何倍にしたいかという希望の数値と利率をユーザが指定すると、1年ごとの複利計算を行い、必要な年数を出力する。

主な処理の流れ

"元金を何倍にしたいですか?> " とコンソールに出力する。
ユーザによる希望の数値の入力を受け取る。(注1)
"利率は[%]> " とコンソールに出力する。
ユーザによる利率の入力を受け取る。(注2)
"xx年かかります。" と出力する。

Review04

単位の換算を行うプログラム。

外部の仕様

原油を米ガロンと英ガロンでそれぞれ指定して、合計体積をリットルで表示する。

主な処理の流れ

"買い付ける原油(単位は米ガロン): " とコンソールに出力する。
ユーザによる入力を受け取る。(注1)
"買い付ける原油(単位は英ガロン): " とコンソールに出力する。
ユーザによる入力を受け取る。(注2)
"合計体積はxxxリットルです。" と出力する。

度量衡

米ガロンと英ガロンはそれぞれ違う単位であり、次の式でリットルに換算できる。

内部の仕様

というメソッドを作成し、mainメソッドから呼び出して利用する。

Review05

mのn乗の計算を行うプログラム。

外部の仕様

mとnをユーザに入力させ、mのn乗を出力する。

主な処理の流れ

"mを入力> " とコンソールに出力する。
ユーザによる入力を受け取る。(注1)
"nを入力> " とコンソールに出力する。
ユーザによる入力を受け取る。(注2)
"mのn乗はxxx"

内部の仕様

powerというメソッドを作成し、mainメソッドから呼び出して利用する。

powerメソッドは2つの引数x,yを受け取りxのy乗を返す。xは実数、yは非負の整数とする。

powerメソッドは

  1. y=0のときは1を返す。
  2. yが奇数、つまりy=2n+1と表されるときは再帰呼び出しpower(x,n)の戻り値zを利用しx*z*zを返す。
  3. yが偶数、つまりy=2nと表されるときは再帰呼び出しpower(x,n)の戻り値zを利用しz*zを返す。

Review05a

Review05 の仕様を以下のように変更する。

外部および内部の仕様

powerメソッドの呼び出し回数を数えるためのクラスフィールドcountを使い、

"powerメソッドの呼び出し回数は" count

という出力を追加する。これに伴いpowerメソッドにはクラスフィールドcountの値を1増やす命令を追加する。

Review06

データ検索を行うプログラム。

外部および内部の仕様

Review11 (optional)

Review01 の内部の仕様だけを以下のように変更する。

内部の仕様

料金表が大きい場合、つまり配列の長さが大きくなる場合はif-elseの連鎖で書くのは大変である。以下の擬似コードを参考にしてもよい。入力された重量をforループで配列weightの各要素と順に比較していくのがひとつの方法だ。

配列weightのインデックスiについて0から最後まで繰り返す {
    if ( 重量 < weight[i] ){
        ループを終了
    }
}

Review12 (optional)

Review02 を以下のように変更する。

外部の仕様

Review02 の処理を対話ループの中で行うように変更する。具体的には以下の擬似コードのようにする。

while(true){
    "自然数nを入力してください:" とコンソールに出力する。
    ユーザによるnの入力を受け取る。
    nが0以下なら、ループを抜ける
    1からnまでの3乗の和をコンソールに出力する。
}

Review13 (optional)

Review03 を以下のように改良する。

外部の仕様

Review03 の処理を対話ループの中で行うように変更する。具体的には以下の擬似コードのようにする。

while(true){
    "元金を何倍にしたいですか?> " とコンソールに出力する。
    ユーザによる希望の数値の入力を受け取る。
    入力された値が1以下なら終了する。
    "利率は[%]> " とコンソールに出力する。
    ユーザによる利率の入力を受け取る。
    "xx年かかります。" と出力する。
}