00:04
其实呢,我们这个Y语句是很好理解的啊,你看呃,如果我现在做了一个判断语句。说如果X大于零,那么我们就要让X呢等于X除以十,然后呢让N等于N加一。这是一个判断语句。条件满足我就做,做完以后呢,我就走了。那只要把那个if换成while,你看把if换成while以后呢,它就变成while循环了。条件满足我进去,进去以后做,做完以后呢,我还会回来。再来判断条件,再进去做。这就是循环了。这个娃要循环带一个条件,这个条件呢,在进入循环体之前我们要去判断,哦,对了,现在我们把这个叫做循环体了,在娃奥循环后面那对大括号里面的句子。叫做循环体啊,或者说那堆大括号叫做循环体,那里面的东西都是循环体,所以它的流程图其实像这个样子说,如果条件满足的话。
01:07
那我进去,进去以后我做这些事情,做完循环体以后,我要回来再判断条件,如果条件满足我就再做,做完以后再回来再判断条件,什么时候判断条件的时候发现这个条件不满足了。我就离开了。那这叫做while语句。当然,这里面有一个小细节啊。有可能有初学者会有误区,我们的玩偶循环是说当这个条件满足的时候,我去做循环体内的事情。可是呢,它并不是说。在循环体内任何时刻,他不断的去监视这个条件是否满足,因为对计算机来说,计算机只会一步一步的做事情,所以实际上在这个地方呢,他仍然是只有回到最头上来判断条件的时候,才会去看这个条件是否满足,而不是在循环体内任何时刻去判断条件是否满足的啊,那我们也可以拿它和之前啊判断语句的那个流程去做个比较,对于这个这样的一个判断语句来说,条件满足的时候我要做,做完以后呢,我就走了,我们看到它并没有回上去的那个箭头,而对循环语句来说呢,它会有一个回上去的箭头,那这个回上去箭头就形成了一个重复做的事情,那种重复做呢,我们就叫做循环。
02:31
但在最开始我们那个自动售票机的例子里头呢,我们用的是wow,原括号里面放的是two。我们知道和if类似的那个圆括号是一个条件对吧?那如果你条件放的是true的意思呢,那就是这个条件永远是满足的,因此不管怎么样,这个循环都是要继续的。我们现在放的呢,是X大于零这样一个条件,那么如果你希望这个条件是起作用的,也就是说它不会变成一个永远做的循环的话,那么在这个循环体内呢,你一定要有地方去修改这个X的值,使得它不再大于零啊,否则这个X的值还是会。
03:09
这个,否则的话,这个循环还是会成为一个啊,无限的一个循环的,所以这叫做while循环,如果我们把while翻译成当的话,那么他的意思就是说,当条件满足的时候,我们要不断的重复的去做循环体内的语句。这个循环呢,它是在进入循环体之前去判断条件的,你看。我们从这个流程图可以很清楚的看到,先判断条件。然后再来做相应的循环体,循环体做完以后回到头上再判断条件再进来,所以他是先判断条件的,因此理论上说。如果第一次来到这个循环语句的时候,条件就是不满足的,那完全有可能他一次都没有做,我们后面很快会看到这个例子。还有一个小细节要注意的,就是在玩偶循环里面,这个圆括号里面的条件是循环能够继续的条件。
04:05
条件满足循环要继续做下去,条件不满足循环走掉,Java语言的循环的条件一定是满足的条件,各种循环语句都是这样子啊,一定是满足的条件,我们刚才那个神经写出来了啊,然后呢,我们用352去验证它了,发觉是对的。我们怎么去这个验证,或者说去观看我们这个程序的行为来知道它是对的呢?我们有几种方法。那么有一种有趣的方法是这样的,我们不见得需要有计算机,我们看到源代码,我们可以采用。手工来仿真,来模拟计算机的运行,来观察我们的程序是怎么运作的,来检验我们的程序是不是对的。这个方法呢,我们叫做变量表格啊,我们来试一下这个事情,它是这样做的,我们的代码在这,那我们看到在这个代码里面呢,有两个变量,我们把它写下来,一个呢是number。
05:00
还有个变量呢,是count。把两个变量写在这儿,然后呢。形成一个表格,我们有两个列,这个表格有两列啊,每一列是一个变量,然后呢,我们开始要把它的值写下来,比如说count,它的数值值是零,Number,如果说我们读进来的是352,所以这是这些变量的初始值,接下来我们就要在这个变量里面,在这个表格里面呢,把这些变量的变化每一步都给记录下来,我们去人去阅读那个代码,去执行那个代码,然后把代码执行的过程当中变量的这个变化给它记录下来,那么我们首先呢,就到了这一行。我们要来判断说number是不是大于零,那现在NUMBER352,显然它是大于零的,因此呢,我们会进入循环体,或者说我们要去执行循环体,我们做的第一件事情,Number等于number除以十,所以得到的结果number就变成35了,然后我们来做count等于count加一,于是C等于一了。接着。这个Y循环我们要回来,对不对?回来我们再来判断说number是不是大于零,现在NUMBER35 35是大于零的,于是我们又进来了,进来以后number等于number除以十,我们得到了三,CR等于CR加一,我们得到了二,然后到了这循环结束,我们又回来,回来判断说number是不是大于零,三大于零,因此条件成立,于是我们又进来了,Number等于number除以十等于零了。
06:20
Number已经等于零了啊,但是我们还没有要去判断条件的时候对不对,不可能说这个number一出成零,我们立刻就出来,不会这样做的,接下来说C等于C加一,于是我们得到了三,现在我们在这一行。我们的循环体已经运行结束了,做完了我们得回来,回到我这来判断条件,现在判断条件的时候,我们看到的是number等于零,所以零大于零这件事情。不满足。零大于零这个条件是不成立的,对不对?因此我们就不会再做while的循环体的东西,我们要到wow的下一句去,到wow的下一句去,也就是这句system out了。这个时候我们输出了count的值,它是三,刚好就是我们要的那个正确结果。
07:07
所以我们用这样的一个变量表格的方法,就可以去在纸上仿真模拟计算机的程序的运行,来看到它的每一步的变化。这是一种手段,还有一种手段是这样的,我们也可以在程序里面恰当的地方去插入一些system out line这样的输出,然后呢,让他帮我们把变量的值,每一步每一步的把变量的值给输出出来,那我们可以观察在循环体运行的过程当中,这些变量是怎么变化的,我们来试试看,我们不妨呢,就在这儿啊,循环你做完了。然后呢,我们来看一下,说这两个变量number count,它们是多少。啊,我们放了这么一句,System out,那让他给我们输出,说number等于多少,Count等于多少,我们来跑一下看。说352。啊,第一轮number等于35 count等于一,第二轮number等于三,C等于二,第三轮number等于零,Count等于三,然后循环就不会再继续了,所以我们没有第四轮,对不对,我们就出来了,然后我们得到了三,我们看到这部分你看和我们。
08:14
手工在纸上做出来的是一样的,当然我们还有第三个方法,第三个方法是什么?那就是点八个嘛,我们可以设个断点,比如说在这儿设个断点,然后呢,调试跟踪运行每一轮,呃。运行看它会到哪去,我们来看一下,如果我们现在来debug它,然后我们输入说352,然后我们切换到debug视图,现在呢,我们停在这儿,这个时候呢,Number是352 count是零,那我们再来下一步,因为呢,Number是大于零的352嘛,我们就进来了,进来以后呢,我们做了number等于number除十,于是那变成35了,这个黄色表明说这个变量刚刚修改过啊,然后再下一个count加一了。
09:02
在下一个。我们把这个调试的这句话又输错了,那这时候呢,他又回到了Y语句啊,那在Y呢,我们又去做了number等于number除十的事,然后呢,又做了count等于count加一的事,所以呢,Number count又又变化过了,然后再输出。当现在number等于零了,我们又回到了第12行,要做while偶判断,那么当然这时候我们下一步的话就会离开这个while语句,到了它下面那句system out,因为条件不成立嘛,当然我们就出来了啊,那么我们写出了一个程序。我们有几种方法可以去看这个程序是怎么运行的。我们要证明我们的程序是对的,我们需要有一些测试的数据,当然352是个可以用的测试数据,因为这是正常范围内的数据。但通常呢,我们还需要用一些我们叫做边界数据来测试我们的程序。比如说如果我们这个程序的条件是说正整数,那么一作为最小的正整数,我们应该测量一下。
10:07
十作为一个很有可能出问题的正整数,我们应该测量一下,因为十到底它会被当做是一位数还是两位数是需要得到验证的,我们不妨呢来试一下这两个数字。如果我们现在运行给他一。没问题。他告诉我这个答案是一。我们再运行给他十。也没问题。他告诉我,这是二。现在我想再试一个边界数字。我问他零是几位数?很不幸的,他告诉我零是零位数,为什么?因为我们在我这里写的条件是说number要大于零,对不对。我们说过,这个条件是进循环体之前就要做判断的,如果你输入的number就是零,那么零大于零,条件不满足这个,往往循环一次都没做过,而count的初始值是多少就是零。
11:07
所以对于零,我们的这个程序是不胜任的。怎么解决?下面会有办法。
我来说两句