【愿成其身】[13]循环结构 – 计算机的神奇

本篇文章讲解题目:蜗牛爬树

推荐先独立进行解题尝试,然后再阅读本篇讲解!


一道小学数学题,但对于计算机来说,却是直接模拟这一过程更为简洁。

很明显的一个思路是,对高度不断模拟上升下落的这一过程,然后统计次数,直到高度达到树的高度。

简单的画一个流程图:

TODO 流程图


分析可以发现,这里的循环是由一个条件控制的。如果满足某一条件则一直循环,否则退出循环。

在C语言里,这种形式可以使用while语句表达,其基本形式为:

1
2
3
while(/*条件*/) {
	/*语句*/
}

可以发现与if语句形式类似,也是很好理解,若满足条件,则不断执行语句,每次执行之后判断条件是否成立,然后选择继续执行或者跳出循环。


有了上面的基础知识,我们再来思考这道题,发现上面的程序流程图对于一些情况是没有考虑到的。

  • 首先是Impossible不可能的情况,下降比上升的幅度还大,那么很显然是不可能的。但是有一种却要排除在外,也就是第一天白天就能够爬到树顶的情况,那么应该输出1。
  • 考虑到如果白天就爬到,那么晚上就不用掉落,很显然我们在白天爬完之后应该判断,是否已经到了树顶,如果到了,那么就不需要晚上掉落这一部分了。 加上这些考虑,我们改进流程图如下:

TODO 流程图


有了这些思考,AC还是件难事吗-.-。

嗯……似乎还有些问题。

首先是对于输出不可能判定的条件有两个,在C语言里我们使用两个&号,也就是“&&”来表示并且,而用“||”来表示或者。这个条件就可以写为n<h&&n≤m。

再来是循环内的判断,如何终止循环呢?我们可以使用continue与break来控制循环。

continue的作用是跳过continue下面的部分直接回到循环条件那里判断是否需要进行下一次循环。

break的作用就是直接跳出循环。

测试代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#include<stdio.h>
int main() {
    int T=10;
    while(T--) {
        /*
        if(T==5)
            continue;
        */
        /*
        if(T==5)
            break;
        */
        printf("%d\n",T);
    }
    return 0;
}

这里还顺带写了while的一种常见用法while(T–),可先自己理解理解其中含义,在后面输入输出系列中会详细说明。

写到这里,这一题就算告一段落了。

事实上,while还有一种变形,do-while,其基本形式为:

1
2
3
do {
    /*语句*/
} while(/*条件*/);

也就是判断循环条件是否成立之前,先执行一次循环体,这在解决一些问题的时候很方便。

也许你可以自己尝试画出它的流程图呀~

该内容采用 CC BY-NC-SA 4.0 许可协议。
最后更新于 2016-08-27 16:00:42