$ ruby cal.rb 6 Sun Mon Tue Wed Thu Fri Sat 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
動作例1 6月の動作
$ ruby cal.rb 7 Sun Mon Tue Wed Thu Fri Sat 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
動作例2 7月の動作
#cal.rb month = [0,31,28,31,30,31,30,31,31,30,31,30] day = ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"] a = 2 num = ARGV[0].to_i for i in 0..num-1 a += month[i] end first = a % 7 for i in 0..6 print day[i], " " end print "\n" space = " " nextd = 0 for i in 0..6 if i <= first printf "%3s ", space else printf "%3d ", i - first end nextd = i - first + 1 end print "\n" d = nextd while d <= month[num] for j in 0..6 if d + j <= month[num] printf "%3d ", d + j else printf "%3s ", space end end print "\n" d += 7 end |
ループにより7日分の日付を表示するが,if を使って,ループのカウ ンター (i や n などの変数で置く繰り返しの状態を示すも の) が曜日の値に達するまではスペースを,それ以後は数字を表示する.このと き,printf を使って,%3s や %3d のように桁を 揃えると表示がきれいになる.
なお,1日が日曜日の場合,この1行目が全て空欄にな ること (上の6月の例) がある.
外側のループは,カウンターを7ずつ進める必要があるので,while ルー プを使用する.また,内側のループが必ず7回回るループであると,最後はその月の日 数を越えてしまうので,越えた場合には,if によりスペー スを表示するようにする.
配列 | |
---|---|
month | 月の日数 |
day | 曜日 |
変数 | |
a | 1月1日の曜日調整変数 |
num | ARGV[0].to_iを格納 |
first | その月の1日の曜日を調べるための変数 for ループで a を計算した後,a % 7 で求める |
space | " " を入れておき,日付の空欄を埋める |
nextd | 日付の1行目の最後の数(日日)+1 |
d | while ループを回すために用意する日付変数 |
その月の1日が1月1日から数えて何日目になるかの計算
前述の曜日表示のためのループ
日付の1行目を表示するためのループ仮変数 (何でも良い,例えば i ) を0から6まで.中には if で空欄の場合分け.
残りの日付表示のための2重ループ.外側は while (変数 d),内側が for を使用.dの初期値,終了値に注意.また,表示する数は d と内側のループの仮変数とで合成.最後に空欄の処理が必要なので, if で表示内容を選択.
Back |