🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

3回答

2227閲覧

カレンダーを作成するプログラム内での改行方法を知りたい

sss3150

総合スコア4

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2020/12/30 12:08

編集2021/01/02 08:13

前提・実現したいこと

Rubyでカレンダーのプログラムを書いていて下の様なカレンダーを完成させたいです。

December 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

該当のソースコード

ruby

1require "date" 2require 'optparse' 3day = Date.today 4options = ARGV.getopts("y:", "m:") 5 6if options["y"] 7 year = options["y"].to_i 8else 9 year = day.year 10end 11 12if options["m"] 13 month = options["m"].to_i 14else 15 month = day.mon 16end 17 18head = Date.today.strftime("%B, %Y") 19year = Date.today.year 20mon = Date.today.mon 21firstday = Date.new(year,mon, 1).wday 22lastday = Date.new(year,mon, -1).day 23week = %w(Su Mo Tu We Th Fr Sa) 24 25puts head.center(20) 26puts week.join(" ") 27print " " * firstday 28 29wday = firstday 30(1..lastday).each do |date| 31 print date.to_s.rjust(2) + " " 32 if day.wday == 6 33 puts "\n" 34 end 35end

発生している問題・エラーメッセージ

下の様に改行がうまくいかないのですが、

[Running] ruby "/Users/shotaito/ruby-practices/02.calendar/calendar.rb" December, 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 [Done] exited with code=0 in 0.339 seconds

出力結果

January, 2021 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

一番最後のスコープでこちらのコードをどのように修正すればいいか分からないので教えていただけますでしょうか?

if day.wday == 6 puts "\n" end

補足情報(FW/ツールのバージョンなど)

Mac、VScode(テキストエディタ)

該当のソースコード

require "date" require 'optparse' day = Date.today options = ARGV.getopts("y:", "m:") if options["y"] puts year = options["y"].to_i else puts year = day.year end if options["m"] puts year = options["m"].to_i else puts year = day.mon end head = Date.today.strftime("%B, %Y") year = Date.today.year mon = Date.today.mon firstday = Date.new(year,mon, 1).wday lastday = Date.new(year,mon, -1).day week = %w(Su Mo Tu We Th Fr Sa) puts head.center(20) puts week.join(" ") print " " * firstday wday = firstday (1..lastday).each do |date| print date.to_s.rjust(2) + " " if Date.new(year,mon,date).wday == 6 puts "\n" end end

出力結果

% ruby calendar.rb -y 2030 -m 5 January, 2021 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 %

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

修正しました。

ruby

1require "date" 2require 'optparse' 3day = Date.today 4options = ARGV.getopts("y:", "m:") 5 6if options["y"] 7 year = options["y"].to_i 8else 9 year = day.year 10end 11 12if options["m"] 13 mon = options["m"].to_i #modify 14else 15 mon = day.mon #modify 16end 17 18head = Date.new(year,mon, 1).strftime("%B, %Y") #modify 19#year = Date.today.year 20#mon = Date.today.mon 21firstday = Date.new(year,mon, 1).wday 22lastday = Date.new(year,mon, -1).day 23week = %w(Su Mo Tu We Th Fr Sa) 24 25puts head.center(20) 26puts week.join(" ") 27print " " * firstday 28 29wday = firstday 30(1..lastday).each do |date| 31 print date.to_s.rjust(2) + " " 32 if Date.new(year,mon,date).wday == 6 33 puts "\n" 34 end 35end 36

投稿2021/01/02 08:48

tatsu99

総合スコア5493

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sss3150

2021/01/04 08:47 編集

ありがとうございます!正しく表示されました! ちなみに解釈として以下は合ってますでしょうか? 素人な書き方ですみませんがご教示お願い致します。 ・head = Date.new(year,mon, 1).strftime("%B, %Y") ↓ Date.new(year,mon, 1)でその月の初日を指定 strftime("%B, %Y")で月と西暦を表示
tatsu99

2021/01/02 11:39

あってます。
sss3150

2021/01/02 12:34

ありがとうございます!
guest

0

ベストアンサー

力ずくですが
if day.wday == 6 を
if Date.new(year,mon,date).wday == 6
に変えてください。

Ruby

1require "date" 2require 'optparse' 3day = Date.today 4options = ARGV.getopts("y:", "m:") 5 6if options["y"] 7 year = options["y"].to_i 8else 9 year = day.year 10end 11 12if options["m"] 13 month = options["m"].to_i 14else 15 month = day.mon 16end 17 18head = Date.today.strftime("%B, %Y") 19year = Date.today.year 20mon = Date.today.mon 21firstday = Date.new(year,mon, 1).wday 22lastday = Date.new(year,mon, -1).day 23week = %w(Su Mo Tu We Th Fr Sa) 24 25puts head.center(20) 26puts week.join(" ") 27print " " * firstday 28 29wday = firstday 30(1..lastday).each do |date| 31 print date.to_s.rjust(2) + " " 32 if Date.new(year,mon,date).wday == 6 33 puts "\n" 34 end 35end 36

実行結果

Ruby結果

1 January, 2021 2Su Mo Tu We Th Fr Sa 3 1 2 4 3 4 5 6 7 8 9 510 11 12 13 14 15 16 617 18 19 20 21 22 23 724 25 26 27 28 29 30 831

投稿2020/12/30 14:43

編集2021/01/01 13:10
tatsu99

総合スコア5493

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sss3150

2020/12/31 10:53

ありがとうございます! 正しく実行できました!
sss3150

2021/01/01 12:18 編集

続けて質問すみません。 こちらの出力結果を質問事項の内容(発生している問題・エラーメッセージ)に追加編集したのですが、数字と曜日が合わなくてどこが原因か分からず右往左往しているのでご教示願えますか?
tatsu99

2021/01/01 13:12

回答のほうにコードと実行結果を書きました。 実行結果はあってますが・・・。 >数字と曜日が合わなくて とは、具体的にどう合わないのでしょうか。 カレンダーは、2021年1月のカレンダーですね。
sss3150

2021/01/02 08:11 編集

あ、色々と勘違いして質問がおかしくなってました???? 今日の月日を出力できているので2021年1月は数字と曜日は合ってましたね。 ただ、オプションで書いている`y`と`m`を指定して例えば`% ruby calendar.rb -y 2030 -m 5`で 実行しても指定した値が表示されず、2021年1月の表示のままになってしまうので、どうすれば指定した値が表示されますでしょうか? 質問内容の一番下に該当コードと出力結果を追加しましたので、すみませんが確認お願いいたします。
tatsu99

2021/01/02 08:49

新しく回答しました。そちらを参照してください。
guest

0

if day.wday == 6 puts "\n"

dayには、Date.todayが入っています。
なので、これは「今日が土曜日なら改行する」ということになります。

それぞれの日付に対応した曜日を見て判断しましょう。

投稿2020/12/30 12:18

otn

総合スコア85893

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sss3150

2020/12/30 13:09 編集

ありがとうございます! `day` の部分を `date` にしても下のように表示されてしまいます。 ``` December, 2020 Su Mo Tu We Th Fr Sa 1 [Done] exited with code=1 in 0.239 seconds ``` 日付に対応した曜日で改行するにはどのようなコードを書けばよろしいでしょうか? 言葉をコードに変換する方法がいまいち分からず悩んでしまっています。
otn

2020/12/30 13:30

> `day` の部分を `date` にしても下のように表示されてしまいます。 dateは数値で、Date型じゃ無いので、駄目です。曜日を求めるにはDate型が必要です。 x年y月z日が何曜日であるかを求めるやり方は、あなたの書いたプログラムに十分含まれているので、 1行ずつ意味を声に出しながらプログラムを読んでみたらどうでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問