カレンダー表示スクリプト

Back to text page


コマンドライン引数として月を与えると,2003年の該当月のカレンダーを表示す るスクリプト.動作の例は次のようになる.

$ 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

  1. 全体の骨格は本日の曜日当てスクリプトを流用する.表示の簡単のため,上 の例では曜 日名を英語に変えている.

  2. ループにより曜日名をまず表示する.

  3. 日表示の1行目は2行目以下と区別して考える.すなわち,1日が何曜日か ら始まるかを点検し,その日まで空欄を表示する.

    ループにより7日分の日付を表示するが,if を使って,ループのカウ ンター (i n などの変数で置く繰り返しの状態を示すも の) が曜日の値に達するまではスペースを,それ以後は数字を表示する.このと き,printf を使って,%3s %3d のように桁を 揃えると表示がきれいになる.

    なお,1日が日曜日の場合,この1行目が全て空欄にな ること (上の6月の例) がある.

  4. 2行目の最初が何日になるか,変数に納めておき,その日からその月の日数 (month に格納されている) まで繰り返し表示していくが,それ を外側のループとし,内側のループを7日ずつ表示するために用意する.

    外側のループは,カウンターを7ずつ進める必要があるので,while ルー プを使用する.また,内側のループが必ず7回回るループであると,最後はその月の日 数を越えてしまうので,越えた場合には,if によりスペー スを表示するようにする.

  5. 使用した配列と変数一覧

    配列
    month月の日数
    day曜日
    変数
    a1月1日の曜日調整変数
    numARGV[0].to_iを格納
    firstその月の1日の曜日を調べるための変数
    for ループで a を計算した後,a % 7 で求める
    space" " を入れておき,日付の空欄を埋める
    nextd日付の1行目の最後の数(日日)+1
    dwhile ループを回すために用意する日付変数

  6. 用いた例の中のループ構造

    • ループ1

      その月の1日が1月1日から数えて何日目になるかの計算

    • ループ2

      前述の曜日表示のためのループ

    • ループ3

      日付の1行目を表示するためのループ仮変数 (何でも良い,例えば i ) を0から6まで.中には if で空欄の場合分け.

    • ループ4

      残りの日付表示のための2重ループ.外側は while (変数 d),内側が for を使用.dの初期値,終了値に注意.また,表示する数は d と内側のループの仮変数とで合成.最後に空欄の処理が必要なので, if で表示内容を選択.


Back