00:01
呃,各位同学,那我们现在我们接着往下边看啊,我们现在呢,再给大家讲多重循环控制的另外两个题,一个呢就是打印金字塔的经典案例,这个案例呢,特别适合来讲for循环,而且呢确实也需要for循环来完成,第二个呢,通过这个for循环打印金字塔呢,我们还可以把编程思想也融入到这个案例里面去。我还是在打印金字塔的时候呢,仍然会使用我们前面讲的两个编程的技巧,一个呢就是化繁为简,或者说从易到难,第二个呢,就叫做什么呀,叫做我们说先死后活的思想,OK,来吧,我们来看一看打印金字塔经典案例,这个怎么去完成,大家看这个题呢,很简单,他是这样说的,打印金字塔经典案例使用for循环完成下面案例。什么呢?请编写一个程序,可以接收一个整数,就这个整数呢,是可以变化的,表示陈数,打印出对应的金字塔,就这样子的,它的步骤这样子啊,它要求我们最终打印一个金字塔,而且呢,要求我们最终打印出空心金字塔,就这个金字塔里面是镂空的,来我们一起完成它。
01:15
来,我们一起完成它,好的,那先把这个要求先给拿到我们的笔记里面去,然后呢,根据要求,咱们一步一步的将其实现。好不好?这个地方还是有一点小难度的,同学们打起精神。好,我们一起把它完成了。来吧,我们先来看一下这个题怎么完成,还是先说老老套路啊,第一个呢,我们把这一个题的思路分析一下。分析编程思路。编程思路。编程思路做完了以后呢,我们再开始写代码。对吧,好,那么我把编程思路还有走代码呢,我们都放在我们的Vs code里边去,来吧,同学们,我们先把这个。
02:04
要求先放到这儿,我们新建一个。文件夹。EXE里边我们新建一个。大家看一下,我们这里面有很多练习对不对,我新建一个新的。新的一个文件夹吧,来吧。走。Exercise ex e CI啊,但是我这边一般就简写成这个了,我剪成这个啊,EXE,然后呢,我们这个练习呢,仍然是负循环的,对吧,负循环他说他已经有这个名字,咱们就来一个零三吧,好吧,OK,来同学们。我们新建一个文件叫main.gook,老规矩,打一个包面包没问题吧,Import一个format包,然后呢,主函数跑不了。我们的要求,我们的要求。把我们编程的要求放这儿。
03:02
他说啊,用一个for循环打晕一个金字塔,少了一个塔字。那么我们这样做,我们的编程思路这样来啊,还是一步步的来完成编程思路,我们首先第一步打印,打印一个句型,哎,各位打印一个句型大家应该没难度吧,说老师打印个什么句型呢?比如说我们打印这样一个句型。最近。你不是,呃,他这这个地方不是要打印出呃一个金字塔吗?我们就打一个最简单最简单句型。这个对于我们来说有有难度没有,大家想一想。有难度吗?打印出一个这样的句型没有难度吧,如果这个你都觉得难的话,各位那就没法说了,打印一个句型的话呢,其实这帮就是一个for循环,两个就是双层for循环,就可以搞定一个控制层,一个控制每一层的新的个数,对不对?代码非常简单,一句话的事儿,For循环I。
04:01
来跟上思路一。I。小鱼先死后活,先死。I加加再来或循环勾。一。然后勾,嗯,这里外层是I用来控制打印层数的,勾呢代代表打印多少个信号。这个应该没有难度。我们也写个三。高佳佳。我写个注释啊,各位同学,我写个注释,I表示陈述,目前表示陈述。勾呢,这个地方写了个结表示表示每一层,每层打印,打印多少个星。没问题吧,好,现在呢,一句话。format.print不要打LN了,直接输出一个星打印出,打印一层以后呢,咱们来一个什么呀,来一个换行。
05:02
点print LN,同学们,这个代码就写完了,我们看看这个句型有没有打印出来,来吧,我们跑一跑,进入到刚才我们写的chapter。我们是零五进到这里面去,CD ec,然后D里面有一个刚刚写的for exercise03CD到FOR03里面去。没问题吧,零三,然后go,让我们的命点高抛起来。大家看一个矩形就已经显示出来了。但是这个不是我们要的目的,对不对,这个对,这个虽然很简单,但是离我们的空心金字塔还十万八八千里呢,那怎么办呢?继续来玩,继续来玩,注意听看看我们怎么一步一步把它实现的啊,来第二步。第二个思想干什么呢?句型打印出来过后,诶,我们现在呢。
06:00
打印半个金字塔。大家看这的思路。你一个整形,整个金字塔不会打,你半个金字塔是不是能够打印出来呀,这就一半,于是乎我来对它进行一个改进打印。打印。打印半个。半个。半个金字塔。金,金字塔。没问题吧,那也就是说我们现在打印出这样一个图形,我想同学们思考一下,能做出来吗?能能不能做出来看。这个能打印出来吗?诶这个在想你们能打印出来吗?应该没问题吧,你想这个控制层数I控制层数的不用不用去控制,不用去变化,但是我们这个节。你原先是打印固定的打印三个星号,现在还应该打印三个吗?不对吧。现在打印的这个新新的个数刚好跟成的个数是不一样的呀。
07:02
大家分析一下,从上面我们可以看出来星星的个数,这地方星是一个。这地方星有几个呢?就这边是一个星。一个星这边是几个星,两个星号。这边是几个星,三个星号。三个信号,诶,各位同学有没有发现我们得到一个结论。你们注意观察,是不是我们打印新的个数刚好跟每一层的。I是相同的,那也就是说我只需要把这个三改成I是不是就可以了?为什么?因为你第一次进来I是不是它这样子的嘛,你for循环,你第一次进来I等于一对不对,你看啊同学们跟上老师思路,他第一次进来的时候这个I。是不是等于一呀?四等于一吧,如果它等于一的话呢,它去判断I小不小于小,I小于等于三吗?小于小于的话就进来了,进来的时候注意看结等于一。
08:05
解,小不小于等于I呢?I现在是等于几?I等于一。所以说它在这个地方打印的时候呢,它只会打印一个星号,打印完了过后再回头到这去,即I又加加,那么I加加过后呢,I就变成二,再进来进ii等于二,过后I小二还是小于等于三。二小于等于三,又进到这里面来判断解等于一节又重新负一,然后高又等于什么呢?又等于这个值又高,小不小于等于二呢,又小于,所以大两次。明白吗?所以说这个时候我们再来一看同学们起看效果。同学们请看效果,我一直醒可以看到。打印出这样一个东西了。诶,我是不是没有保存呢。果然没有保存,保存一下。保存了过后我们再来运行看效果。是不是这样子的。
09:00
说老师这个东西我有点没看懂,没看懂的话,我再再啰嗦一下啊,我把这个代码给大家拿过来,我分析一次,如果基础不好的同学,认真跟老师的思路走一走。老规矩,只要你看不懂代码,你就用韩老师的这一招,哪招呢,就是把代码放过来,然后呢,这边写一个内存图。这边是内存,然后呢,你再画一个表示终端的一个空间,这是我们的终端。大家看我分析一次啊。终端。终端就是我们的控制台嘛,对吧,就是控控制台。OK,那同学们,老师这次呢,再给他走一遍啊,这次呢,我就再给他走一遍。这是我们一个小箭头,代表我们代码在不停的执行。那我们看看怎么走第一步,是不是应该先走I冒号,等于就是创建一个I,那这个时候内存里面是不是有个I,这个值了,I等于多少,I现在等于一。
10:06
一做完了之后进行一个判断,I小不小等于三,也就是说以小不小于A1小于等于三吗?成立,成立为正进来,进来时候这个结又重建起来了,在内存里面有个结等于几呢?各位结现在负了一个,一结负完了过后。到这来是不是该执行这句话了?解小于等于I,那么大家想一想,解解等于一,I等于一成立吗?成立,成立的时候就执行这句话,执行这句话在我们的终端就输出了一个心。输出心过后,同学们再执行这一句话了,是不是应该执行节加加J加加这个变二了,然后再执行这一句话,再执行这句话节小于等于I吗二。二小不小,二小于等于一吗?二肯定不小于等于一啊,于是这个为甲退出来执行这一句话,执行这句话光标下移。
11:01
因为你这是什么呀,你这个地方是相当于是打了一个换行,紧接着这句话执行完了,应该执行哪句啊同学们。是不是直行减I加加了,哎,是这样子的咯,别搞不明白啊,这个地方我们是讲过的,I加加是变二了,二变二过后又该执行哪一步了?是不是执行这个判断I小不小于I小于等于三吗?二肯定小于等于三呀,于是又进到这来,当进到这的时候,注意听结又被变成了一为什么?因为重新赋值了。你重新定义了,把它覆盖了吗?然后呢,又在执行这句话,大家看解小不小于等于I吗?一小小于等于二成立成立,进到这里面来,这个时候又输出一个信号,紧接着它又做这句话,把结加加结加加变二,二再执行了一句话,再执行这句话,解小于等于I吗?显然这个时候成立的二小于等于二,二小于等于二进来再输出一个星号,紧接着又执行了一句话。
12:05
结加加,结加加是不是变三了呀?变三了过后再去判断,各位想一想,现在这个条件成立吗?就是J小于等于I吗?不成立,因为三并不三小于等于二不成立,于是乎整个退出。到这儿来了。是不是到这来,是不是光标又下移,下移过后下一步又直行到这,这个I加加,I加加变解变三,然后再来判断结I小不等于小于等于三吗?成立成立,又进到这来,结又被重新复为一。是不是相当于重新创建了一个,那这个时候呢,再来同学们请看,这时又在判断解小于等于I吗?小于小于的话进来执行这句话。走。是不是执行这句话,打印出一个星号,打印出信号,紧着结加加结变二,变二,又去判断,判断是不是成立,成立的再进来,再输出一个信号,紧接着又去执行结加加变三。
13:10
三小于等于三仍然成立,然后又进去,再输出一个星号,再输出星号,然后再去做结变四,变四过后再去判断四不小,四小于等于三不成立,于是退出,然后呢,光标下移,光标下移过后再上去。这时I变四,四。成立吗?四小于等于三不成立,于是代码整个退出。所以说你在终端看到这这个东西看明白了没有,这个是老师给他做了一个非常详细的到位的一个分析,如果还没有听懂的同学啊,自己想一想,自己也反省一下,那你的真的好像这已经讲的最细致了,再细致就没法讲了,再细致就得把内存。搬出来给你看了。
14:01
明白吧,这已经讲的很细致了啊,如果你还没看懂,把老师刚才这个流程自己再看一遍,或者自己练习一遍,应该可以看懂。好了,这是一个流程的分析,那回头我们来继续往下走。这句话呢,已经离我们这个步骤又近了一步,我们接着来看,这不是我们要的目标,我们现在呢。又进一步要打印整个金字塔,打印整个注意听整个金字,金字塔能听金字塔。那整个金字塔怎么打印,各位朋友注意看,这时候需要我们的一点观察能力了啊,整个金字塔,完整的金字塔应该是什么样子的呢?应该是这样子的。一个心。两个星。第三层应该是五个星。大家看到没有,所以说其实按照整个金字塔的话,你这个就不对了,那第一层,第一层应该是一个星。
15:01
这个是没问题的,但是呢,第二层。第二层,其实第二层应该是几个星呢。第二层应该有三个星。三个星。对不对。这个是一个心。那么第三层,也就是说我们最后这一层应该是几个星呢?第三层应该是五个星。问题来了,你显然目前我们这个是不对的,因为我们原先是123,现在是135,那你找规律啊。这个时候你要观察这个规律怎么做了,同学们看,一个星是不是刚好等于二乘以乘数。减一。你现在是第一层吧,二乘一减一是不是等于一,如果我第二层,我们看它的规律。规律你你得找规律啊,你不找规律不行啊,说老师这个难道写编程还要一点推理逻辑能力吗?肯定要一点啊,虽然要求不是很高,但是还是要的规律。
16:07
这边再来一个规律。对不对,那这个时候呢,我们又找到了这个规律,诶,你看它都是二乘以当前的乘数减一,你看三是不是二乘二减一等于三二乘三。因为这个层数第三层嘛,假设我们从从第一上面,我们算第一层,最下面算第三层,是不是二乘以三减一等于五啊。对不对,那所以说这个地方应该怎么改,是不是就是应该二乘以I减一个一就可以了。是这意思吧,好,我们执行一下。一运行。可以看到诶星号正确了,看一个星两个三,这第二个是三个,第三个是五个,但是还是不对呀,因为为什么呀,因为你前面没有打空格,我们再继续分析。
17:00
大家看,除了我们要打新之外,你们看原先我们是没有打空格的,你看第一层还有几个空格呢,我们看又来看啊,第一层有空格。空格有几个,它的空格是两个空格,为什么,你看数一下嘛。这是一个空格,两个空格吗?两个空格有两个,这一层空格有几个呢?这一层的空格有一个,但它空格前面就是星号前面有空格,这个第三层呢,空格为零。大家看这个空格有什么规律没有,也就是说你在输入星号之前应该先打空格。你不大空格,它就它就怎么样,它这样顶上去了,它就顶在一起了,而实际上呢,这个地方是有两个空格的,而这呢有一个空格。明白吗?那也就是说现在我们要找空格,空格规律观察一下。找规律,你们看这个二是不是刚好等于总的乘数减去当前乘数啊,是不是是不是总乘数。
18:03
总乘数减去当前这个乘数。当前陈述这个老师就没有卖关子了,直接告诉大家了,你们其实自己要去观察一下,这个也是这样子的,好问题已经得到解决了,那你总陈述是什么呀?那也就是说这里我们还要打印空格。说句话啊,在。在打印打印星号前先打印什么呢?先打印空格能理解吗?那空格是多少个?刚才已经总结出来,是总的乘数减当前乘数,那太简单了,For。我定一个K。等于一等于。啊,负一个一。一然后K怎么样呢?K应该小于等于总的乘数是不是三减去当前乘数是不是I?
19:00
能看是不是这样子的呀。总的陈述。诶,我看是是以呃,对的总乘数减去当前乘数对的啊,然后K加加。那您先打这个空格吗?空格怎么打呀,PT。是不是这就可以了?好,我们再来运行小板,诶,你看各位同学请看效果O了O了,好,同学们看,这时如果我们把这个三稍微变化一下就可以了,现在我们第四步把它做活了。做后将这个乘数。将这个陈述。做成一个变量。做成一个变量即可,那有时候老师怎么做呢?非常的简单啊,我们定义一个变量,比如说我定义这样一个字,VR to level level,就是乘,乘积的意思,那么我给他定一个这样的变量就可以来吧,VR。To level。
20:00
Inch。那默认为三好,我用这个变量将三全部替换。没有问题吧,没有问题,我们来先跑一跑,改完了过后能不能跑起来。可以吗?可以来,咱们把这个值稍微变大一点,我这次来一个九层,看看九层的金字塔是否被我打出。没问题,完全的正确,好,咱们再乘胜追击啊,同学们跟着老师思路,现在讲讲的有点兴头了啊,现在呢,我们再来一个打印出空心金属塔。大家感觉到编程有点乐趣了吧。打印空心。空心金字塔,那有时候空心金字塔怎么打呢?空心金字塔怎么打呢?好来观察一下,其实宫心金字塔你想一想都想的出来。你看啊,假设我们还拿这个说话。我们还拿这个说话。
21:01
是不是如果这个时候你要打空心金字塔,其实说白了,各位同学想一想这个逻辑是不是就是中间这个地方,就是它中间如果有有这个心的话,就把这个这个打空格就行了。那也就是说我们打印出空心金字塔呢?会有这样一个逻辑产生。什么产生呢?大家想一想。那是不是就意味着我们在在打这一个每一行给他打星号的时候,先要考虑一下是不是真的打星号还是打空格的问题,是这意思吗?都各位分析来分析。分析一下。分析就是在我们在我们。我们给每行每行打印。打印星号时。星号。是需要考虑一个问题,需要考虑考虑。考虑什么呢?考虑是打印打印新还是打印,还是打印什么呢,空格。
22:09
空格能理解我的意思吧,那什么意思,你看啊,就说你现在每原先我们是每一行在这里,你看每一层我们上来过后直接就打的星号,但是现在呢,不是这样子,简单一个逻辑了,他得判断到底是打星号还是打空格的问题。你们分析出来。你们有没有分析出来,到底应该怎么怎么来判断,大家有没有发现?规律。有什么规律,你看到没有,就是每一层的第一个和最后一个是打星,中间这块是不是。打空格呀,你分析一下是不是这个规律就得到了,我们分析后。分析的结果是每层每层的第一个,第一个和最后一个和最后一个是打印,打印什么呀,打印新。
23:05
其他就。就应该就应该是空的,就应该是空的。空格及空格及输出空格。那这个嗯,这个是我们分析的逻辑,用程序怎么实现呢?是不是在这加一个判断就可以了。能跟上我的思路吗?你应该这样判断。如果勾等于一,哎,勾等于一是不是代表是第一个呀,是每层的第一个,那或者高等于最后一个,哎,最后一个怎么判断啊,最后一个是不是就是这个。当这个条这两个条件有一个满足的时候,好,我们打印出星星。否则。如果不是这样的话,我们应该怎么办?是不是我们输出一个空格就可以了,能理解。
24:00
这打一个空格就可以来,代码已经做完了,跑起来。看是不是空心的呀。但是这个空心是不是空的有有点太彻底了。因为有个特殊情况。什么特殊情况?就是最后这一层。是不是不要考虑这个情况,就说你这个情况刚才分析的都是对的,但是最后这一最后这一行是排除之外的,因为最后这一行呢,他都要打星号,不然的话整个就镂空了。彻底的空了,那怎么办呢?还有一个情况就是打新的时候是最后这一层都打新。有一个例外情况。我们还分析还分析到一个例外,例外情况什么情况就是最后,最后这一层就底层吧,也可以说啊,最后层也是底层及底层。底层。地层次全部打新。全部全部打星号好,这个时候怎么办呢?诶同学们想一想什么情况下它是最后最后这一层。
25:08
能回答我吗?哎,想一想。想一想,哎,同学是不是想想想这个I是不是表示陈述啊,I是不是在不停的从一到最后,那我想告诉大家是不是。这个情况就代表。它是最后这一层的,就是I,如果等于。Toliver。能反应过来吗?就是你这个I这个值本身就表示层数,它是变化的,当这个I就等于了最后这一层的时候,我们就全部打新,不考虑其他情况了,来输出一把,请看效果。欧了。完全正确,这是你想怎么变化都怎么变化都可以了,比如说我把这个九改成一个震撼的20,你看完全都no problem。跑起来了。没问题吧,完全OK。好,同学们想一想吧,我们现在就把这一个非常经典的打印金字塔从无到有,一步一步给大家演示过来了。
26:11
我个人认为啊,还是讲的比较清楚的,那么如果同学们能够根据老师这种思路,逐渐的由一个简单的到复杂,一步一步完成,各位同学,那我告诉大家,你的编程思想已经在逐渐的建立。负责任的讲啊,逐渐的建立,虽然这个题本身它并不难,我可以告诉大家,确实不难。而且我本身也不是要告诉大家这个东西怎么做,很简单嘛,这个说实话对于一个有编程稍微逻辑思维强一点的同学,基本上也能理解,但是我重点的是想告诉大家老师是怎么一步一步分析出来的。你看我先是。做了一个非常简单的句型,然后打半个,然后打整个,最后我们把它做活了,这个地方就体现出我们的先死后活。
27:00
先死后活。对吧,后活,那到这个地方呢,我们又把它加强了一下,这就是我把一个复杂的问题分成了五步走,同时融入了先死后活的编程思想,同学们好好体会一下,这就是编程能理解吗?就是你要用拆分的能力和总结的能力,最后呢,你要把你分析的这个语言文字形成我们的代码,这个就是编程能理解。好,同学们,那么我把这个呢,先给同学们放到笔记里面来,好好的领会一下啊,好好好好的领会一下,这非常重要。来,为了让大家领会的比较到位呢,我把这一段代码。整体全部给大家完整的放到笔记里面来。好,这次到了第26行,没问题吧,第26行。Okay。跟上思路26行。把它放到这里了。然后呢,从26行继续截取。
28:00
26,然后这就是27。是吧,这是我们的27行,27行到51行没问题吧。51行。我把它放在这里也是OK的。再把它稍微的整理一下。51行接着往下看,51行就全部截完。51行,52行到最后全部结完。OK。好了,这就是我们一个完整的分析,希望同学们好好的领会一下老师这个完成代码,或者说做一个题,写一段代码的整个逻辑是怎么一步一步分析出来的,好,同学们关于这一个经典的金字塔打印的题,我们就给大家分享到这里,大家好好的体会。最好你可以把代码。自己能够默写下来,这是最好的方式啊,不要去抄,如果你实在写不出来,你可以抄一遍,但是呢,如果说到最后,你自己能够自己做出来是最好的,我再给他布置一个扩展题,如果有学有能力的同学,在我这个基础上再打印出空心菱形就更棒了。
29:10
不止一个课后题。课后。课后题怎么样打印打印空心菱形?明细。什么叫空心菱形,我不解释了啊,如果你不知道什么叫空心菱形,你们就去问一下,呃,初中的数学老师,他会告诉你,他会回答的非常准确啊,同学们把这个好好做一做好,那么关于这一个打印金字塔的案例,我就给大家分享到这里。
我来说两句