在Ruby中,控制台输出当前日历月份。

13 浏览
0 Comments

在Ruby中,控制台输出当前日历月份。

我需要在Ruby中将当前月份的日历输出到控制台。输出结果应该类似于UNIX系统上的ncal命令。我找到了一个C++的解决方案,但无法适应Ruby。到目前为止,我只意识到我需要使用嵌套循环来输出高度和宽度。告诉我应该朝哪个方向移动?

0
0 Comments

问题的出现原因是用户最初错误地提出了问题,经过10个小时的努力,最终找到了解决方法。在得到帮助和提示的情况下,用户编写了上述的代码来输出当前月份的日历。

代码中使用了Ruby的Date模块来处理日期相关的操作。首先,定义了一个包含星期几的数组days,并输出该数组。然后,通过计算从2021年7月1日到当前月份第一天的星期数,得到需要添加的空白格数,并通过循环将空白格添加到days数组中。

接下来,使用Date模块的方法获取当前月份的天数,并将天数逐一添加到days数组中。最后,判断days数组的大小是否能被7整除,如果不能,则再添加一个空格。

通过使用join方法将days数组的元素以逗号分隔成一个字符串,并使用each_slice方法将字符串分割成包含7个元素的子数组,存储在new_arr数组中。然后,使用嵌套循环遍历new_arr数组,并输出日历的每一天。

这样,就实现了在Ruby中输出当前月份日历的功能。

感谢用户的努力和求助,以及得到的提示和帮助,最终成功解决了问题。在解决问题的过程中,用户学到了如何使用Ruby的Date模块来处理日期,并通过编写代码实现了输出当前月份日历的功能。

0
0 Comments

问题:如何在Ruby中输出当前日历月份的控制台输出?

原因:需要按照指定的格式和排列方式将当前日历月份输出到控制台。

解决方法:

1. 构建一个一维数组,以星期几的名称(Mon Tue ...)开始。

2. 找出确定月份起始日期之前有多少个空格(这些是上个月的日期)。可以使用wday方法来帮助确定。将这个数量的空字符串附加到数组中。

3. 确定当前月份有多少天(可以使用Date.new(2021,7,-1)方法来获取)。将所有这些日期附加到数组中。

4. 将空字符串附加到数组中,直到数组的大小可以被7整除(或者更好的办法是进行计算)。如果不需要最后一步,可以跳过此操作。

5. 将数组的所有元素转换为右对齐的大小为3的字符串。

6. 使用each_slice(7)方法将数组切分为一周一组的子数组。

7. 如果需要,可以使用transpose方法将这个一周一组的子数组转置,以模拟ncal输出的格式。

通过以上步骤,我们可以在Ruby中实现输出当前日历月份的控制台输出。

0
0 Comments

问题的出现原因是在当前的解决方案中,只打印了每个月1日开始的行的内容。解决方法是移除这个限制,并通过其他方式确定每个月开始的星期几,以及在这一星期的哪一天。

首先,为了方便起见,我们需要知道月份的第一天是星期几(用数字表示),这样我们可以轻松地计算与其他日期的偏移量。可以通过以下代码获得这一信息:

# 例如,对于2021年7月1日,这一天是星期四,所以我们得到`4`。
start_of_month_weekday = (Date.today - Date.today.mday + 1).cwday

接下来(这是关键的一步!),我们可以利用上面的信息来确定“这一星期的哪一天是这个月的第几天?”以下是将该计算纳入到当前解决方案中的初始版本:

require 'date'
days = %w[Mon Tue Wed Thu Fri Sat Sun]
puts "    #{Date::MONTHNAMES[Date.today.month]} #{Date.today.year}"
i = 0
# 例如,对于2021年7月1日,这一天是星期四,所以我们得到`4`。
start_of_month_weekday = (Date.today - Date.today.mday + 1).cwday
while i < days.size
  print days[i]
  day_of_month = i - start_of_month_weekday + 2 # !!!
  while day_of_month <= 31
    print " #{day_of_month}"
    day_of_month += 7
  end
  i += 1
  puts
end

这将输出:

    July 2021
Mon -2 5 12 19 26
Tue -1 6 13 20 27
Wed 0 7 14 21 28
Thu 1 8 15 22 29
Fri 2 9 16 23 30
Sat 3 10 17 24 31
Sun 4 11 18 25

不错!我们已经有所进展了!

我将让你自己解决剩下的部分 .... 但是这里有一些线索,关于我接下来会如何解决问题:

  1. 这行代码 print " #{day_of_month}" 需要在日期小于1时打印一个“空格”。可以使用一个简单的 if 语句来实现。
  2. 类似地,由于你希望这个日历能够在网格中整齐地排列,所以这行代码需要始终打印一个长度为2的字符串。在这里可以使用 sprintf。可以查看页面中间的 "Examples of width"。
  3. 你在代码中硬编码了一个值为 31 的月份天数。当然,这应该是可变的(使用 Date 库!)。
  4. 有趣的是,你在一个地方使用了 strftime("%a"),而在上一行中则使用了一种笨拙的方式来构建日历标题! 查看日期格式化的文档,它非常灵活。我认为你可以使用 Date.today.strftime("%B %Y")
  5. 如果你想要给当前日期添加一些颜色(或背景颜色?),可以考虑使用类似于这样的方法,或者使用一个辅助库
  6. 使用 while 循环可以工作,但是在 Ruby 中不太符合惯例。在99%的情况下,Ruby都有更好的工具来完成任务;它是一种非常表达性的语言——迭代器是王者!(我猜你之前学过其他语言,才会使用 while 循环或者 for 循环。)可以使用 days.each_with_index 来替代外部的 while 循环(while i < days.size),并使用 day_of_month.step(31, 7) 来替代内部的 while 循环(while j < 31)(多酷啊!)。

还有一个非常小的问题:我修正了你的拼写错误。星期一的正确拼写是 Mon,而不是 Mun。英语很奇怪。

非常感谢你的帮助。在提示的帮助下,我终于解决了问题。再次对让问题无法纠正表示抱歉。

0