开发环境用户数据不会保留;如欲参与内测请联系站务
居正Lv.10
天角兽

FIM++:像写信一样编程

E

发表于:

5,936
21
37,034
40
0
5
72
386
20

今夕是何年(小程序:判断平年闰年)

第 5 章
8 年前
1743

一曲新词酒一杯,去年天气旧亭台,夕阳西下几时回。无可奈何花落去,似曾相识燕归来。小园香径独徘徊。

我在2017年写下这段文字,回首过去的两千岁月...

(喂,我还没有两千岁呢!!)

咳咳,众所周知的,公历纪年法有平年闰年的概念,闰年每隔3个平年就会出现一次,此年2月有29号。所以,如果有谁刚好在2月29号出生,只能每四年过一次生日了......(节哀)

不幸的是,Anon的生日刚好就在2月29号。今天是2017年2月28号,Echo在想明天要不要给Anon庆祝生日......

动起手指,我们用FIM++程序来解决这个问题!


首先,你知道闰年的年份除以4是可以除得断的,而像1200年这样末尾两个数字是0的闰年除以400是除得断的。

如果用Java代码写的话可以是这样的:

(其实代码可以更短,只不过我这里便于读者理解,写的细了点)

其中%是取余符号,==是判断是否相等。这个程序的逻辑是这样的:

  1. 判断年份是否可以整除4,如果不可以,直接输出No。(上面说的两种闰年都可以整除4)

  2. 在满足条件1的情况下,判断年份是否能整除100(即末尾两位是不是00)。

  3. 如果末尾两位不是00,则直接判断为闰年(输出Yes);如果末尾两位是00,则判断是否能被400整除,能整除才是闰年(输出Yes)

Java代码看起来比较直观,如果你看不懂也没关系,现在我们用FIM++来实现它。

先分别仔细阅读附录1:条件表达式附录1:控制语句,然后看下面的代码:

Dear Princess Celestia: Year To Celebrate.
Today I learned:
    Did you know Anon's birthyear is 2017?
    SkyOneStudio did the remainder of Anon's birthyear and 4.
    TheSamStudio did the remainder of Anon's birthyear and 100.
    BronyTab did the remainder of Anon's birthyear and 400.
    When SkyOneStudio is equal to 0:
        When TheSamStudio is not equal to 0:
            I said "Yes".
        In the end, I did this instead:
            When BronyTab is equal to 0:
                I said "Yes".
            In the end, I did this instead:
                I said "No".
            That's what I did.
        That's what I did.
    In the end, I did this instead:
        I said "No".
    That's what I did.
Your faithful student, Echo

程序的逻辑和上面的Java代码时一样的,但后者比前者多了三行对吧。这是因为根据附录1,在条件表达式里面做判断属于高级语法,这里不用,所以你要把这些操作挪到外面来做。此处高级语法参见本页Wikia

SkyOneStudio、TheSamStudio和BronyTab这三个都是B站上dalao的名字,啊不,都分别是上文中的条件1、2和3。其中remainder是附录1:内置方法中的取余运算(相当于Java当中的%运算),When系列语句是用来控制条件执行的(相当于Java中的if语句),那么In the end, I did this instead就类似Java中的else了。由于FIM++没有大括号写法,则需要用That's what I did.做控制语句的结束标志,有点像VB。

此程序运行效果:

(抱歉,Anon,你还得在等三年呢......)

(图片作者为tumblr的batponyecho)