万年历

 

问题

请给出未来指定的某年(如 2020)的全年日历。使用字符串输出,仿照常见日历的格式,按年月分隔,包含日期和星期信息。

思路

大致思路:循环十二个月,首先计算月标题和星期标题添加到万年历,然后循环月中的所有天,按周拼接日期,日期间隔为 \t,一周拼接结束把结果追加到万年历,然后继续下一周。

  1. 定义年份、结果万年历序列,计算 1 月 1 日位于星期几

  2. 循环十二个月,设置每个月的标头栏

  3. 循环当前月的天数,按周拼接字符串

  4. 一周拼接结束把结果追加到万年历,然后继续下一周

  5. 一个月循环结束,把该月最后不满一周的字符串追加到万年历

代码

A B C D
1 1984 =[string(A1)+ "年"] 存放结果万年历
2 =day@w(date(A1,1,1)) 存储循环过程中的当前日位于一个星期的第几天,初始为 1 月 1 日
3 for 12 >B1=B1|["\n","\t\t\t"+string(date(A1,A3,1),"MMMM"),"日 \t 一 \t 二 \t 三 \t 四 \t 五 \t 六"] 循环月份,设置每个月的标头栏
4 =fill("\t",A2-1) 存放循环过程中当前周字符串,每月第一周要拼上第一天的缩进
5 for days(date(A1,A3,1)) 循环当前月的所有天,按周将日拼接到当前周字符串 B4 中
6 >A2=A2+1
7 >B4=B4+string(B5)
8 if A2==8 >A2=1 一周循环完则回到周一
9 >B1=B1|B4 将循环完的周字符串添加到万年历
10 >B4=""
11 else >B4=B4+"\t" 否则拼接 \t 作为日间分隔符
12 if B4!="" >B1=B1|B4 每月的最后一周可能不满 7 天,也要拼接到万年历

结果

imagepng