[プログラミングとその応用I >  配列とイテレータ >  例題に関する参考プログラム(2)]

「配列とイテレータ」の例題に関する参考プログラム(2)

ここでは,次の例題に関するプログラムの例を示します. このプログラムでは,配列とwhileを使っています. イテレータを使う場合に比べると, 繰り返しを実現するために機械的な処理が必要になっています. 具体的には,配列のそれぞれの要素に対して順番に処理を行うために, 現在何番目の要素を参照しているのかという情報と, いつ繰り返しを終了させるのかという情報を明示する必要があります.

ある金額(円)を硬貨(1円,5円,10円,50円,100円,500円)でおつりがないように支払うとき, 何円玉を何枚出せばよいかを調べる.

プログラム

whileで配列の要素を順番に処理していくために, iという配列の添字を表す変数を導入しています. iを0から順に増やしていくことで,配列の要素を全て調べあげることができます. 繰り返しを終了するのは,最後の要素を調べおわったときです. したがって,最後の要素が何番目かが分かれば, 添字iを使って,繰り返しの条件式を記述することができます. この条件は,配列の要素数を使えば,表現できます. 配列オブジェクトの要素数は,lengthメソッドで得られます. 配列aの各要素は, a[0],a[1],...,a[a.length-1] で与えられることに注意して下さい.


 1  =begin
 2  
 3  coins_while.rb: 
 4     ある金額(円)を硬貨(1円,5円,10円,50円,100円,500円)でおつりが
 5     ないように支払うとき,できるだけ少ない枚数で支払うには何円玉を
 6     何枚出せばよいかを調べる.
 7  
 8  =end
 9  
10  # 硬貨の定義
11  COINS=[500,100,50,10,5,1]
12  
13  # 支払う金額を取得する
14  print "おつりがないように硬貨で支払いを行います\n"
15  print "支払う金額(円)を入力して下さい: "
16  amount = gets.to_i
17  
18  # 金額が0円以下の場合は,エラーメッセージを表示して終了する
19  if(amount <= 0)
20    print "1円以上を指定して下さい\n"
21    exit # プログラムを終了させる
22  end
23  
24  # 各硬貨の支払い枚数の計算と結果の表示
25  print amount,"円は,"
26  rest = amount                   # 支払残額(最初は支払い額そのもの)
27  i = 0                           # 配列の添字を表す変数
28  while i < COINS.length          # 各硬貨について(硬貨はCOINS[i]で得られる)
29    if rest >= COINS[i]           # i番目の硬貨で1枚以上支払う場合
30      n = rest/COINS[i]           # i番目の硬貨での支払い枚数の計算
31      print COINS[i],"円",n,"枚 " # i番目の硬貨での支払い枚数の表示   
32      rest = rest - n*COINS[i]    # 残額の更新
33    end
34    i = i + 1
35  end
36  print "で支払えます\n"
37  

[プログラミングとその応用I >  配列とイテレータ >  例題に関する参考プログラム(2)]