00:02
再看一个经典的多重循环控制的案例,叫打印金字塔。打印金字塔是一个非常经典的案例,而且通过打印金字塔呢,可以对我们的编程思想哈再做一个梳理,特别的有用。那么我们来看一下这个打印金字塔它是一个怎样的题呢?这样子的,他说使用for循环完成下面的案例,编写一个程序,可以接收一个整数,可以,也就是这个整数呢是一个变量。表示,呃,打印多少层金字塔。呃,这个变量呢,它是用to level来表示可以的打,那么现在呢,我们就开始来来做,还是用我们的化繁为简。化繁为简,先死后活,那同学们先看啊,现在我们最终呢,要打印出这样一个金字塔。对,然后在这个基础上呢,要求打印出对应的空心的这个金字塔。
01:03
你想想这个应该怎么做,对于初学者,你们现在如果在看视频的,你可以先暂停一下视频,先想一想如果你来做,你会怎么实现。注意啊,这个金字塔的陈述是什么呀,是一个变量啊,不是说你不你不能说我直接用一个print语句一一个一个的打啊,那将来这个是12344层,那如果将来是怎么样,将来是更多的,那你肯定就就没法这样玩了。好,那现在呢,我们就开始按照这个思路来走,首先呢,我们还是化繁为简,先死后活,来打开我们的这个。VS2010现在开始来写下一个案例,那下一个案例呢,我就直接取个名字叫做stars。打星的stars stars没问题吧,同学们。好。然后呢,我把这个后缀先给同学们改一下。
02:01
Stars。是不是改成C?那么同学们来根据老师的思路,我们一步一步的分析,有一点小小小小的难度哈,VO,然后呢,主函数。我们整体的思想,我们整体的思路呢,要打印出这个金字塔。打印空心空心金字塔,这是我们的一个目标。这目标,那现在我们整体用的思路是什么呢?化繁为简,先死后活。化繁为简,先是后果,所以说我的思路就开始了分析。第一步第一步大响。如果让你打,直接打这个空心金字塔是有难度的,你能打十星金字塔吗?一个十星的金字塔,你要觉得有难度,你能打印出金字塔的一半吗?说老师我连一半都打不出来,好,如果你连一半都打不出来,你能把这个句型打出来吗?所以说我们先打一个句型。
03:04
打印句型。对,然后在这个基础上打印。打印半个,哎半个金字塔,注意听,主要是学老师这种思想,我们学编程学的是思想啊,第三一个打印。打印整个金金字塔,然后第四一步干什么?打印空心金字塔。空心金字塔,在这个基础上还可以打印空心菱形,你看后面我还有要求的,要求大家打印这个空心的菱形,这个题我会留给大家哈,打印。打印空心菱形。好,菱形,当然难度是在逐渐增强,那现在我们先打印出这样一个图形,我想我想问同学们,你们能不能打印出来?你一步步来走哈,12345。
04:02
12345。12345。好12345。12345好,也就是说我要求大家打印出个五行五列的这么一个句型,能打出来吗?同学们,你要这个打不出来,有点说不过去了。老师开始写了第一步。打印句型,这个你要打不出来说不过去啊,那现在呢,我们又来一个for循环。那我们也也不去考考虑变量这个东西,我们也不去考虑变量东西,我们定一个I就行了。来走了,For循环。I等于。D乘一小于等于五没问题吧,I加加。能理解不?然后里面或循环再来个结,肯定有个结嘛,内存循环节也等于一节小于等于几也是五节加加。能能理解好现在point f。
05:02
对,打一个星号,那么这里面呢,每进去一次打一个星号,那整个打完一行过后打一个换行。能理解,同学们代码写完了。句型已经搞定。句形已经搞定,不仅不然吧,所以这个你要做不出来的话,那就那就没法玩了,我们运行一下,看看此时此刻是不是打印出了这样一个,诶,一闪而过,是因为没有写get。是不是?同学们来走一个吧。跑起来。打印出这个应该没有问题了。好的,没有问题,那现在我要打印出半个金字塔,有思路没有?现在呢,我们要打印半个金字塔,也就是说现在我们希望在这个基础上打出这样一个图形。怎么一个图形呢,就是半个金字塔,半个金字塔长什么样子呢?来第一个。每一行是不是多增加一个呀。
06:03
这个能打出来吗?第一行是一个星,第二行是两个星,第三行三个,第四行是个,第第五行五个,这个你应该能打出来吧,把那个改一改就行了。是把这个改一下就行。把这个改成几啊,同学们改成I就完了嘛。能理解吗?就是说因为你你原先是固定五个嘛,现在就是说它打印的每一行打印打印出来这个新信息呢,刚好跟你这个I是对应的,那这个就写完了,半个金字塔搞定。没有任何问题。诶。哦,没有把这个关闭对不对,跟上我的思路啊,待会儿你就会看到一个非常神奇的效果,很好玩的啊。是不是又搞定了,又搞定了没问题,那现在呢,老师要来说啊,打印出整个金字塔又来了。那你打印出整个金字塔,你得先分析呀。整个金字塔应该长什么样子呢?来看啊,首先。我们还是整五个第一个。
07:02
是不是这边就应该是。三个星呢,要对对对对对齐哈,可能这个对的稍微不是那么好,齐齐1.12345。这边是。1234567。再下一个。123456789,哎是不是这个就有点这个,因为我这个地方对不起,不是我这没有写对哈,是因为我们我们这个编辑器呢,这样打看看起来不齐,其实打印出来是齐的。那你就要分析了,你先分析出来每一行的这个星星的个数是多少,来分析这个星星有几个星。这边是一个心。是不是一个星星,这边是几个星,这边是三个星。是不是第二行是三个星。三个行。这一行是几个星,五个星。
08:00
是不是五个星,下一行是几个星,是七个星,大家看规律找到了没有。七个星,所以说你要分析这个规律啊,下面这个是九个星。九个星。那么九那这个打印出原也说原先我们打打印这个心的个数就不对了,而这个一个心是不是刚好等于这个I的几几啊,是不是刚好等于,这个是等于。这一个乘数就是比如说这是I哈,这个第一个I是不是一啊,那应该是不是等于二乘以I,注意看减一。是不是这个是不是这个值啊同学们。是不是这个值。是不是刚好它等于二乘以I减一,因为你这是第一层嘛。我们我们假设最高最上面这个叫低一层,假定啊,假定最上面这个叫第一层,是不是二乘以I减一,因为你这个就等于二乘以一再减一嘛。
09:01
是不是就等于一?那同学们看这个三呢,是不是也是一样的,它仍然也满足我们这个条件。是不是还是等于二乘以I减一,因为这个时候这个这是第几层呢?这是第二层,因此这个变成二。是不是等于三,下面这个是不是也是一样的呀?下面的是第三层就应该是二乘以三减I减去一个一等于五,这个是不是一样的,这个是二乘以四解决等于七。下面这一层是不是一样?五是不是等于九,答案就出来了,那也就是说,现在你只需要把这个改成二乘以一个I干什么?减去一个一完事了。那现在我们先运行一下了,运行起来看看效果。走起来。同学们看现在效果是不是就跟我们想的一样了,是不是星星的个数对了,但是为什么你现在不是一个?不是一个金字塔呢,是因为是不是前面我们还要打出这个空格呀,也就是说你为了看这个,看这个金字塔,你前面还要打空格呢,那我们看看第一层有几个空格,梳理一下空格数。
10:13
空格有几个?空个看数一数哈。呃,是不是应该这样数的1234。五五个五个吗?应该是四个才对哈,因为你看这个是九吗?这是九九个星,那前面应该是有四个空格,应该是四个空格。那这边有几个空格。诶,这边有几个空格,跟着老师说,说一下是不是有三个空格,这边有下面这一层有几个空格,是不是有两个空格,下面有几个空格,是不是有一个空格,再下面有几个空格,有零个空格,因为最后。底层是没有空格的。那像。这个空格跟这个I有关系没有。找跟I的关系。找跟I的关系。是不是它刚好等于这个刚好是等于总的乘数。
11:05
哎,总的乘数减一,你比如说现在我们总的乘数是不是五啊。是不,总的乘数是五,那就应该是等于五减一。等于四就来了,下面这个三是不是也是总的乘数减一,你这是第几层?你这是第相当于第二个吧,所以说是三,下面这个也等于总的乘数减一,是不是现在现在是第三层变成两个,再来这一层也是总的层数。总的乘数减一,那总的乘数现在是不是四啊,就等于一,那下面再来一个是不是总的乘数减一,就是五五减去。哦,不是减一啊,呃,是减I,刚才老师说错了,减I。减I,这个也是减I。
12:01
因为你你这个在减少嘛。这样才才是对的,你这上面这个I是一,这是二,这是三,这是四就是五,所以最后这个是零,那换言之就是说我们在打印这一个新的时候,还得先输出空格,是不是这样道理,输出空格,而空格的次数我们也找到这个规律了,那就应该等于for循环,怎么样,咱们来一个K吧。用K来控制这个东西。用K控制啊,使用K控制什么呢?控制这个空格的空格的数量。循环。循环。注意啊,这个并不是那么好讲的,大家一定要认真听,那就是1K小于等于多少呢?是不是总的乘数减,哎,那总的数线数是不是等于五啊,是不是五减去一个I,然后K加加。是不是同学们,然后这边空格当然很简单。
13:02
打空格,这个还还不easy就完了。打完空格过后再打星号,好,同学们,现在代码就写完了,我们再来玩一把,走起来。走起来。大码是不是OK了?你看。是不是?那还差一点,我们是不是还有下一步打印出空心的金字塔来再来分析,我们还是以这个为例来看一下此此刻。诶,这个地方少沾了一点东西。好,现在我们已经打印出实心金字塔了,现在我们来分析打出这个空心金字塔的问问题。首先呢,同学们看空心金字塔这个地方是不是就是空格了,这地方也是123空格,这边是不是也是空格啊?1234空格大概是这样子的,也就是说在这个基础上,你还要分析在原型基础上有这个。
14:02
就说除了打这个星号之外呢,中间还有空格的问题。也就是说你现在打这个星号呢,不是说每一行都是固定的,固定的这个星号了,那想想现在有几个星,现在是不是有。两个信号了。这两个星号大家有没有发现,其实它是两侧,就是这两个消是两边是星号。然后呢?中间是这个,中间是这一个空格。所以说现在我们要进行这个分析,就是什么情况下在输这个星号的时候,什么情况下要输这个好,我们来分析一下。来走一下啊,嗯,我现在这样,这个这个分析,我我就把这边分析先拿掉了。先拿掉,我们就在。这个基础上再分析应该怎么玩。
15:01
现在要这么分析了。这么分析,在。这样写啊,再输出写到这儿。在输出这个星号的时候。星号。的时候,需要考虑考虑是否输出的是心还是空格。还是空格,是不是这个道理,你原先在输信号的时候,你根本不考虑就是该输什么,多少个信号就输,但是现在不一样了。不一样了,那现在想一想应该怎么玩呢?大象应该怎么玩呢?所以说其实这里面应该是这样子的。怎样子的呢?来给大家梳理一下我们的思路。第一句我的分析如下分析你看第一层。I等于一的时候。I等于一的时候是什么呀?全是输出信号,就是该输心的时候。
16:03
该书。输这个输入星号的时候,就就输就输入号就输入星号,这个没问题吧,因为它有意义,而且大家发现最后这一行。是不是也是一样的道理,如果I等于五,也就是最后这一行该舒心的时候也舒心了,但是中间不一样,你看这一行,这一行,这一行是什么样呢?它应该是这样子的,就是如果是。如果是,呃,第这个心就是说第一个心,第一个心就和最后。最近和最后一个星输出。输出的事情,其他其他。应该应该。应该输输入什么呢,空格。是不是这样子的呀,你你这个地方是不是也是一样的,第三行。
17:03
如果输第一个该输心的时候和最后一个星输字心,但其他输空格,这个是不是也是一样的?好,现在呢,我们就要把这个这一段的分析用代码体现出来,那应该在哪里写代码呢?是不是在这里,你原先在输新的时候,你没有考虑要不要输空格,现在要考虑了。那怎么进化才输这个心呢?来整一个代码。首先我们看。如果是I等于一或者I等于五,该舒心就舒心,那就没什么问题,我就开始在这写了。如果注意听,如果解。等于一。是不是代表输的是第第一个信号啊,是不是代表输的第一个一好或者或者结。结等于最后这个心,最后这个心是不是就是它?这个大家能看懂吗?就是你,你解等于等于二乘以I减一的时候,就是最后这个星,如果这两个条件都满足,OK,那说的就是个心。
18:06
没有问题。没问题,Else。Else就应该输什么呢?数空格。大家看到没有,Else就应该输空格。诶,大家看是不是这样的道理,那现在我们先运行一下,看看这个结果跟我们想的是否一样哈,看看跟我们想的是否一样,来玩一把先。跑起来。跑起来,我们看到这个结果呢,是这样子的,其实已经很像了,但是为什么最后这个没有考虑进去呢?是因为你现在只是把第一个心和最就是该输第一个心和最后一个心考虑进去了,但是你没有考虑到最后一行要除外,因为大家知道最后一行是全部都出心。所以说在这里面再加一个条件就可以了,什么呢?或者如果结就等于是我们最后这一行等于哪一行呢?就等于这一个。
19:01
五。的时候就说你这个结哈,如果你这个结在输这个心的时候,这个结呢,它就等于我们最后这一行了。那就固定。就就全新这个代码就完成了。这个代码就完成了,看是不是这样子的。看到吗?诶这个还是有问题啊,我再看一下问为什么。还有一个小问题,我们来看一下。这个是解等于它的时候。结呃,什么情况下是代表。哦,我们看看什么时候是它是最后这一层呢。对。哦,我明白了,应该这样写,刚才那个写条件写错了,当I,因为I是控制层的。I是控制层的,对不对,诶这个是控制层的。
20:00
在这种情况下呢,其实我们应该写成是I等于五。因为I是用来控制层的嘛,如果I等于五,那就说明是最后一行了,这方我再写一下I等于五表示。表示最后一层,就最后这一行吧,最后这一层也行,就最下面这层最下。最下的一层。这样大家理解了吧,我们再执行应该就正确了,跑起来。跑起来,我们看现在应该就OK。OK了。最后这一步我们把它做活,你现你看现在你写的是五,是不是很麻烦呢?都写五很麻烦,所以说呢,我们现在在这个基础上再增加一下干什么呢?增加将。将这个五层五层。改成一个变量。改成一个变量,这个变量人家已经给我们写好了,就叫tota,还记得吧,人家这个题上就已经给我们说了tota level。好,我用total level来表示。
21:03
那这样我就开始写了哈,来,同学们,我们写到这一栏。To level。等于几呢?初始化等于五,我把这个四五的地方全部改成。Level。是不是这边要改一下代码写完了,我们来看看此时此刻运行起来有没有问题。我发现代码呢,没有没有任何问题,好,现在神奇的事情就发生了,我把这个五改成十,你看一下效果。对,你看这个效果,现在打出的就是十层的一个金字塔。是不是很好玩吧,说老师我再写大一点可以啊,你写个20。一些个十,这个够大了吧,你看仍然是不会乱的,仍然不会乱看好玩吧,哎,如果说你如果老师不这样去给你们讲,如果老师不不是按照这个思路一步一步分析给你们讲,我直接就。
22:02
噼里啪啦把这代码给你敲出来,你能听懂吗?可能有些同学能听懂,基础好一点的同学,反应比较快的同学,一听就懂了,但是对于这种初学者其实很难理解。因此呢,你看我们这用的是什么方法,化繁为简,先是后果。最后我给大家留一个题,希望同学们自己去完成,打印出空心的菱形,这个作为一个作业。给大家分享下去。这个空心菱形打出这个样子的,大家想一想哈,我就简单画一下。这边。Okay。简单画下空心菱形。这样好,然后这边收起来。啊,四个亿啊,四个亿中间有一个这样的。就说打出这个空心灵性。我希望同学们仍然使用使用老师的,使用老师的一个思路来完成。完成。
23:04
OK,用我的路来完成,那呃,你只要认真的用这个思路,肯定是可以把这道题完美的解决,那可同学关于我们这儿讲的用经典经典的这个打印金字塔的这么一个案例就讲到这儿。同学们可以用for循环,也可以用Y循环来实现。就是这么一个题,大家看看能不能理解。尤其是尤其是一一定要去注意老师是怎么分析得到最后最后这个结果的。就说我们学编程写代码,重要的是一个分析过程,而不是说老师把这个代码拿出来给你念一遍,其实你啥都不懂。你不知道怎么来的嘛,对不对,好同学们,那关于这个题的讲解呢,就到这里。
我来说两句