LoginSignup
1
0

More than 3 years have passed since last update.

Ruby カレンダー作成問題 解いてみた(解答例あり)

Last updated at Posted at 2020-05-26

はじめに

『プロを目指す人のためのRuby入門』通称チェリー本を学習後、
インプットしたものを手を動かして実践してみたいなと思ったら、作者の記事を見つけました。
「アウトプットのネタに困ったらこれ!?Ruby初心者向けのプログラミング問題を集めてみた(全10問)」

他の問題も解いています。
一問目:カレンダー作成問題(たのしいRuby 練習問題)
二問目:カラオケマシン作成問題
三問目:ビンゴカード作成問題
四問目:ボーナスドリンク問題
五問目:電話帳作成問題

ここに載っている一問目

「たのしいRuby」に載っている、オーソドックスなカレンダー作成問題です。
DateクラスのAPIさえわかれば、あとは基礎的なプログラミング知識だけでコードが書けると思います。

Date クラスを使って、今月の1日と月末の日付と曜日を求め、次のような形式でカレンダーを表示させてください

こんな感じにするのが目標

     May 2020      
Su Mo Tu We Th Fr Sa
                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 

調べたところ色々な回答を見つけることができましたが、自分の回答はこんな感じになりました。

require 'date'

  def monthly_calendar(this_day = Date.today) #実行日の日付
    # 実行月の1日を抜きだす
    first_day = Date.new(this_day.year,this_day.month,1)
    # 月の最初の週の日曜日(カレンダー上で左上)に該当する日を抜き出す
    start_day = first_day - first_day.strftime('%w').to_i

    # month year
    puts this_day.strftime('%B %Y').center(21)
    # weekdays
    puts "\sSu\sMo\sTu\sWe\sTh\sFr\sSa"
    # days
    while start_day.month <= first_day.month

      if start_day.month != first_day.month
        print "\s\s\s"
      elsif start_day.strftime('%u') == "6"
        print "\s" + start_day.strftime('%e') + "\n"
      else
        print "\s" + start_day.strftime('%e')
      end

      start_day += 1
    end

  end

puts monthly_calendar

引数に年と月だけ渡してみてもその月のカレンダーを表示することができました。

puts monthly_calendar(Date.new(1995,8)) #任意の月で指定もできる
     August 1995     
 Su Mo Tu We Th Fr Sa
        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

< 1995-08-01 >という日付で値が渡されるようです。


何か改善点等あればお教えください。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0