00:01
好,各位同学,我们来看一下多重循环控制,那前面我们讲的呢,循环它是基于一层的,但实际上在我们开发中呢,会遇到一些比较复杂的业务逻辑。那这种业务逻辑呢,往往需要用多重循环控制才能够解决,能理解我的意思吧,你比如说现在我做我我们来看一个多重循环的基本介绍。将一个循环放在另外一个循环体中,就形成了嵌套循环。就跟我们前面讲的嵌套分支一样的。那么在外面的for循环我们称之为外层循环,在里面的循环呢,我们称为内层循环。注意,这里我们建议使用两层,最多不要超过三成,能理解吧?如果你的循环超过了三成。那我告诉你,这个逻辑就变变得比较复杂了。因此呢,我们不要超过三层,三层是一个极限。OK,第二个呢,实际上循嵌套循环就是把内层循环当做外层循环的循环体验。
01:06
待会儿我们在做案例的时候,你会深刻的体会体会到老师说的一句话是什么意思,只有当内存循环的内存循环的循环条件为false时,才会完全,才会完全跳出内存循环,才可以结束,结束外层的当次循环,开始下次循环。也就是说我们这个循环里面再套一个循环,那里面这个循环就变成什么呢?变成了我们的循环体,明白我的意思吧,好,还有假设。假设外层循环的次数是M次,而内层循环是N次,那么整个循环应该次M乘以N这么多次能理解吗?好,当然我这样讲了过后,大家可能没有什么太多的感受,因为太抽象了。嗯,没有关系,因为呢,我这里准备了有四个题,我有四个应用实例给大家讲解,当我们把四个应用实例讲完了过后,我相信同学们对多重循环以及我们用循环去解决业务问题的能力有很大提升,而且呢,编程思想在逐渐的成形成好了,那我先把多层循环的基本介绍这一块放到我们笔记里面去注意听讲。
02:17
好的,我们写一下多重。多重循环控制。好,这是一个难点啊,同时呢,同学们也是一个重点。我呢,把这个写下,这是我们的标题二。这是我们标题二,OK,我们先做了一个基本介绍。我多说一句啊,多重循环这里面是个难点,同时也是个重点。因此,它是重点重重重点难点。啊,重点难点。OK,那基本教授刚才老师是不是已经大致的说了,说了一下我们这一个多重循环的一个概念。
03:02
这几个概念呢,我们这块就不再多说,直接把它放到笔记里面来就可以了,主要是写代码,走案例,这块呢,能够真正提升我们的编程能力。好,我把这整理一下,排版一下啊,板书一下。来,走一个。OK。123我们就全部说完了,说完过后呢,这里面重点就是说,呃,建议我们建议一般使用两层,最多不要使用超过三层,如果你超过三层的话,这个逻辑就变得比较复杂了,好吧,还有一个呢,外层循环如果是M次。内存为N次,那整个循环应该是M乘以N次。这个咱们就不要了啊,后面这个就不要了。好,那么现在呢,我们直接走案例,给大家分析一下,来看案例。我们的应用案例。应用案例。多重循环的应用案例一共准备了四个,我们一一道来。我们先看第一个案例。
04:05
低案例是什么呢?就是统计三个班。成绩情况,每个班有五五名学员。求出各个班的平均分和所有班级的平均分,要求学生的成绩从键盘输入,大家想想这个怎么做?这个大家想想怎么做?来吧,咱们要想办法把它完成了。首先还是老规矩啊,同学们,我在这里呢,要给大家推荐两个,我讲课这么多年总结出来的两个,就是编程的必杀技或者叫绝招啊,一般人我就不告诉他。告诉他哪两招呢?第一个呢,我们叫做化化难为简,或者叫做先易后难第一招。就是编程的时候,编程时。的两大绝招。
05:01
啊,两大绝招。啊,哪里哪两大绝招呢,第一个我会使用,先易后难。啊,先易后难,也就是说后后难,也就是说你能够有一种能力把一个复杂的问题,把它分解成简单问题,知道这意思吗?即将一个复杂的问题。复杂的问题。简化成。分解成或者叫拆分都可以啊,拆分成或者分解啊,分解分解成什么呢?简单的问题。然后一个一个的完成,这是第一个能力,第二个呢,我们叫做先死后活法。后活,也就是说你们先不要考虑把这个代码写的很灵活,先把它写死了,写死了过后呢,我们再用变量把它做活,诶这样子你的你的这个解题思路呢,就会变得比较轻松啊,先死后活,即先把代码写死,后面再用变量把它做活。
06:06
这两大绝招,待会儿呢,我在分析这个案例的时候,大家能够体会出韩老师讲的时候这两大绝招的妙用,注意听讲啊,来吧,我们现在呢,就来从这个由这个题来具体的引入我们这两个编程的技巧。啊,这是这是两个比较重要技巧,我在讲课的时候,包括我自己做开发的时候呢,我也会使用这两个技术,这两个技巧非常的实用,非常的管用啊,非常管用,来吧,我们来走一走,那同样道理,因为它是练习嘛,所以说呢,我在这里呢,在这个EXE文件夹里面,我新建一个文件夹叫E,叫做什么呢?叫还是for循环练习,对吧,For一个EC2。来,同学们跟上老师的思路。新建一个文件叫main.go。然后呢,Package打一个包包。
07:01
引入。我们的format。然后呢?主函数。没问题吧,然后把需求往这一放。这个题啊,说实话,嗯,还是有一点点小小的难度,虽然不大,但是呢,还是有一点小难度,对于我们初学者来说,还是要想一想才能做出来的,那同学们看他的具体要求是这样子的,我们来分析。分析思路分析。分析实现思路。那同学们想一想,我们怎么来做这个事儿呢?第一步大家看,首先到时候统计三个班的成绩情况,每一个班有五名学生。那也就是说有三个班,每个班五名学生,其实一看这里面有个双重循环在里边,但是你不要先,你先不要去考虑双重,如果你考虑双双重的话,你很容易晕到这里面。你就考虑一个班。你看我的思路是这样的,你统计三个班,我一下就把它简化了。
08:05
统计一个班的成绩情况,每个班五名学生,这是不是一下就简单了呀?是不是简单很多,然后求出各个班那简单了。我们现在不是求出班,就是求出该班的。注意啊,求出这个班就该班的平均分没有了,因为所有班平均分我先不去考虑,这一下就一下就简单很多了呀,说统计一个班的成绩情况,每个班有五名学生,然后呢。求出这个班的平均分,然后学生成绩由键盘输入,诶,同学们想,是不是难度一下就降低了呀?没问题,而且呢,我们也不用不用想这个班级的人数是变量,我们就写十,就是五名学生,就是三个班。是不是好,那么我们第二个思路就是什么呢?哎,第二个思路就是只考虑五个学生的情况,就是学生数,学生数。
09:04
就是五个。对不对,所以说这样就提出来,体现出来我们的先死后活。先死后活上面体现出我的一个什么思想呢?就是先易后难,拆剪。先易后难。就是我把它已经拆解成了一个比较简单的问题,后面再把它处理成复杂问题好了,同学们有分析成这个思路,我相信同学们要实现这这个要求,应该来说还是比较简单吧。那么那么走代码。走代码实现第一步。好了,来吧,那就是一个班有五个学生,那肯定负循环了,所以说二话不说负循环。I。I。一个学生。一共有几个学生呢?小于等于五没问题吧,I加加。I加加。
10:00
他说学生成绩是从键盘输入,那没问题,我直接写,写出一句话,Print。呢,就说请输入。请。输入D。D。这个学生。学生的成绩没问题吧,那这个时候呢,我们用格式化的方式输出。然后为了好看呢,咱们来一个换行,此时此刻是不是需要有个变量来接收这个学生成绩啊,那简单了,定一个变量呢,这是这是感情的自然流露对不对?你就自然会想到这边有一个变量来接受成绩嘛,所这面一定会有个变量,怎么写呢?FLOAT64。没问题吧,然后这地方我们就把它接收了。找FT,诶这个地方咱们就。这样输出把这个I是不是I就是第几个学生呢。
11:03
第一个第二个第三个第四个第五个吗?然后呢,接收的时候怎么写点。叫scan。艾伦。我们来接收一下这个变量,把这个值,把控制台输入的成绩放到这个变量里面去,没问题吧,好拿到了,拿到过后要干什么,他要求这个班的平均分,平均分是不是应该有一个变量来记录总分才能求平均分是吧,对不对?所以说我这边还应该有个变变量就是。声明一个变量。声明。一个上变量统计,统计什么呢,总分。各个班的班级的总分,这个没问题吧?好,那我现在把这个项目盯到哪里比较合适呢?定到for循环里面还是定定在for循环外面,大家想想,显然定在for循环外面更合理一些。因为。你这个for循环里面不仅是累积上嘛,所以说我来一个上。
12:05
没问题吧,等于0.0。OK,他每说一句,我们就把这个总分累积起来,累积。累计总分。累计这个总分,累计总分非常简单,我们学过这个方式,对吧,把分数输进来时候,然后了。总分不停的往里面输,最后当够循环结束完了过后,请问大家上是不是已经把总分就得到了,能理解吗?好,这个时候我们就可以输出了。Print f,我说班级总分,班级的总分是。啊,就直接说平均分,因为他没有要总分就是平均分。平均分是多少呢?来吧,是不是一个V这个值输出,然后怎么输出呢,就是我们的上。除以多少,先死后活?我一共有几个学生?有五个学生完事了,大家看。
13:05
到此为止,我们第一个需求已经做完了。没,第一个需求确实已经做完了,只是说现在我还没有做活吗?第一个班已经可以解决了,来跑一个,看代码有没有问题。CD上一级CDECCD到我们刚才的for循环ex ec02。诶,我这地方是写错了吗?哦,For循环EX1C2没有022进去了,然后第这边有个main.go是我们刚刚写过的,对不对。来跑一个吧,打精神。然后。妹跑起来,它会提示我输入第一个学生的成绩。输一个十吧,再输一个十,再输一个十,这样好计算十,再输一个十,我输了五个学生都是十,那平均分必然是十,正确答案,OK。答案绝对是正确的,没毛病,代码好了,大家看,第一个我们已经完成了,哼,是不是一种很自然的?
14:04
就写完了,那问题来了,说人家不是要不是要一个学生呢,那下面是不是就可以继续分析了,分析实现思路二。第二步。注意啊,这个在教大家怎么写代码,这才是写代码,怎么教你们写代码呢?对不对,如果我上来直接把代码直接往这一写,你能知道怎么写出来的吗?各位朋友。所以说一定要听到,你们听课的关键点是在听老师怎么做出来的,而不是说要一个答案,如果只要一个答案的话,说实话给你一本书就完事了。注意听老师的实验思路,那现在呢,我们要来实现第二步。在原先的基础上呢,我们扩展一下,统计的不是一个班了,我们要统计三个班。这个时候是变得相对容易一点了。诶,统计三个班,每个班有五个学生,求出该每个班的不是该班,是每个班的。
15:01
诶,每个班的平均分。学生,还是五个说明还是一个还是什么呢?其实就是把这段代码循环吗。因为你原先是一个班,现在是三个班,那肯定就是说这段代码要走几次,要走三次吗。是不是这个意思哦,你一个半走完了好没问题,那就是负循环,把它套起来勾等于一。这个勾呢,我们就代表是什么呢,代表是班级第几个班好不好,我写一下啊,我们再定一个变量勾。表示第几个班级。没有吧,第几个班级好,我用这个勾把它包起来勾。小于等于几,大家说一下,因为你有几个班,你是不是有三个班呀,到小于等于三高加加整个。把他铐起来,完活了。
16:01
已经做完了。看到没有,已经代码做完了,只是把这个提示信息改一改,怎么改呢?请输入加一个D。多少个班的?对不对,把这个班级说出来嘛,这个的这个班的。这个班的啊,写错了,这个班的就说请输入第几个班的第几个学生的成绩,那这个时候应该前面写个高。是不是就完事了,那不停累积嘛,累积完了,诶你看,因为我第一次进来是0.0,定了个变量0.0。呃,第二次进来再做循环的时候,你看第一个班统计完了过后,他打出。那张最美班级D。D百分之D各班。积的平均分式对吧?大同也把这个勾给我写进来,因为你看啊,整个这一大块相当于是一个循环体,那么它每循环一次,这个就制成0.0了,所以说相当于说每次清清零了过后,再去对这个班级的成绩进行一个累积,是不是这个意思啊。
17:12
是这个意思吗?应该挺简单的,挺简单好这样子呢,就不停就来一次,就就就搞一个0.0,那么这样子肯定代码就是没问题的。大家看思路是不是很清晰,来,我们跑一下。就说白了,就是把原先这个里面的循环体循环了三次,仅此而已,来走一个看到吗。跑起来。好,第一个班。十。十。十。是好第一个班的平均分,诶这个为什么没有换行呢。哦,对不起啊,我这个地方应该有个杠N,这样看起来就比较好看了,重新来。我退出。跑起来。第一个班级的第一个学生说十再输十,再输十。
18:03
十。好,请看第一个班的平均分是十,我们第二个班全部都是20,看一下。看他有没有算对啊。20。第二个班平均分20,第三个班第一个学生看又循环起来,看到没有30。30。303030OK,代码写完是不是已经完成了,但是呢还没有完成,为什么大家看人家这地方要求的是还有一个功能是。要统计每个班的平均分,你已经做到了,但是所有班的平均分是不是你没做到啊?说老师,为什么呢?因为你你这地方没这个上午是代表每个班的总分,并不是所有班的总分,因此这地方我们还有一个需要,就是再定义一个变量。定义一个变量来存,存放什么呢?存放总的成绩,总成绩。总成绩。
19:00
对不对,那总成绩的话呢,这个也很简单嘛,我就在外面再定一个变量VR to。Some。初始化,我给他来一个。啊,也给来一个FLOAT64吧,好不好,然后呢,初始化给它来一个0.0,没毛病吧,初始化来0.0,那么每次这个for循环完了过后,是不是这个项目就是一个班级的总成绩啊。是不是好,那现在我在这一方把总成绩算出来。这里将。各个班。班的总成绩。总成绩累,累计到。累积到哪个变量呢?就是to sum这个变量没问题吧,那我就to sum。等于多少呢?加等于some能理解吗?好,这个时候整个这个大的这个负循环结束以后,请问to some是不是所有的成绩就是所有班级的总成绩好,下面代码就比较轻松了,那我直接输出一句话就是。
20:07
班,各个班总成绩是各个班。各个班级的。总成绩我也把它输出来啊,总成绩百分之V平均分各个班。班级的,各个班级的。呃,平均分是多少我就可以算了,那么各个班的总成绩是不是就是上?总成绩所有班的各个班。说他是说的什么呀,叫做。叫做所有班级啊,所有班级的平均分。所有班级的平均分是不是就是这个总成绩去除以所有的人数啊,是不是一个班五个人,一共有三个班完事了?是不是代码就写完了,来跑一个,同学们跟上思路走。我们这次赛跑第一个班。我就说快一点啊。说快一点。
21:01
第一个班搞定第二个班,第二个班。第二个班。OK,第三个班。注意跟上失落。第三个班。完事看到啊,第三个班是30分,各个班的总成总成绩一共是三三百分,所有班平均分是18,诶这个就有问题了,这个就有问题,总成绩是三三百,为什么是180,这是说不过去的哦,明白了,同学们看,因为你在这个地方是有问题的,你是先把它除以五,再乘以三,这怎么行呢?应该怎么样,同学们是不是应该把它括起来呀?是不是应该把它括起来啊?同学们能理解吗?因为你要乘,要总成绩去除以15吗?你不能说除以五再乘以三,那还了得,那就不对了,来,重新再来一次啊。当时老师犯了一个小错误。那再次速快一点。好,这次呢,我们争取一次成功,20 20。
22:03
20。20。20好,再来第三个班,三十三十三十三十,OK,同学们看这次就对了,总成绩是300分,所有班级平均分加起来,呃,平均分是20,因为是300除以15嘛。好,这个代码就写完了。看到整个思路没有,还有最后一步,我们还要把它做活,你看这里的班级,你是班级的人数是三个,这是五个,那将来我的班级的人,我要统计四个班,五个班,六个班,你都能拿到一个去改吗?也不合理,所以说现在呢,我们来继续完成我们的分析实践思路三做活了。叫什么呢?我们可以把代码,把代码做活。做活原先是死的,现在我们要把它做活了,做的更灵活,怎么办呢?定义两个变量定义两个变量啊,表示班级的个数和班级的人数,能理解吗?
23:07
人数。哦了,那现在你看我把它做的再灵活一点,跟着老师思路。刚才老师说我一步步实现的同学们,我一步步实现的VR,比如说我们写个class number class number目前是不是等于三呢?好。可以这样写,In,再来学生的人数,Student number。Student number是不是目前我们是每个班五个人好写完了,那这个时候是不是应该改成这个更好了?把这个改成三。没问题吧,把这个五改成节。改成student number是不是更更灵活了?那以后这两个词一一变化就可以了,下面这段是不是应该改?你这是五,你这五的话,我们就直接除以每个班的总人数,下边这个是不是也要改班级总人数去乘以我们每一个班级,呃,我们一共有多少个班?
24:06
那这样看起来更灵活一点啊,同学们是不是更灵活一点,能理解吗?没问题吧,好,我们再来跑一遍,看看代码能不能顺利的成功,比如说我把这个班级人数改成二,看马上是不是变化了,走一个。跑起来。诶,代码有问题,我们看哪里出了问题了。好,我们看哪里出了问题了,在这里出了问题大家看这里。他说无效的一个操作符符,它说不匹配,为什么呢?注意看这一个三四六十四,这里面有个int,也就是说。你这里是一个上上上是一个float,但是呢,这是一个什么呀,这是一个。呃,这是一个int型,他认为不匹配,那不匹配简单啊,不匹配简单,咱们呢,把这个类型进行一个转换就可以了,因为你最后这个结果呢,有可能是float的,所以说我把这做一个转换。
25:02
因为他这个。呃,勾浪里面有个特点啊,就是说它的类型要匹配才能进行运算,看这及时的信息再看一下。啊,他说第四啊第match不匹配什么呢?Float和这个int,他认为不匹配好没问题,我把它处理一下。挖出一下,那这个地方,我因为你知道是五嘛,那就是把它转一下就行了。转一下,我把它转成一个float,因为它还是一样的啊,没问题,还是一样的,转成一个FLOAT64就可以了。好,再来保存一下。好,代码还有问题,看到没有,没问题了吧,因为你这你这是五,它一转转成5.0还是一样的。该怎么算还是正确的来看一下效果。看里面还有问题啊。哪地方还有问题?哦,这地方还有问题,我们看这地方是什么问题,一样的道理,一样道理,它也是认为不匹配,呃,什么不匹配呢?我们看他说。
26:01
啊,他说了啊,这个number看这里。第你看啊,也是float和这个int不匹配,那简单我们也把它进行一个处理,对吧,把这个类型进行一个转换就可以了。因为total number是一个是是一个float float64的是不是。负了60次,好,下面我们也把它转一下就行了。FLOAT64转一下。好,把整个这个结果转一下就行,把它运算的结果转成float丢失。好的,来跑一个代码保存。看还有没有问题。还有问题是什么,我们再来看问题是在哪个地方,我们稍微的调整一下。呃,大家看到这个问题在什么地方没有,是不是我这多了一个小括号啊?诶,怎么会多了一个小括号,把这个小括号去掉,再保存一下就OK了。没问题了吧,现在。
27:01
现在没有问题,我们来跑一跑,跑一跑,看看我把number class number改成二,能不能顺利的运行起来,来跑一个走。跑起来看结果对不对啊。第一个学生十。第一个班级。20。十、十。十好,他说第一个班的平均分是12,应该没问题吧,你们算一下是不是12分就是你你可以这样子计算一下,看看有没有算错。对吧,就是他一共是30分,再加30分应该是60 60除以几呢?除以五的的确确是12,没没毛病,其实我们再说第二个班的第一个学生,我们输20。再来一个20,再来一个20,再来一个20,再来一个20。好回车,我们可以看到第二个班的平均分是20分,最后班级的总成绩是160分,然后呢,除以这个班级,班的平均分是多少?一百六除以十个人是不是刚好16分?
28:04
好,答案是正确的,答案是正确的,好了,同学们,这个呢,我们就通过这个时间的安排啊,就是花了一段时间,或者说我详细的给他介绍了一下,怎么把这个代码一步一步写出来的,稍微的就是慢了一点,但是我认为我认为很值当,因为对于我们有些初学者啊,他不知道代码怎么来的,刚好呢,老师就把这个流程给大家分析的比较到位了,我把这段代码呢,拷贝到我们的笔记里面来,注意看啊,关键不是代码本身,而是怎么做出来的。我把代码给它放到这面。这是老师的代码。好,我把这里稍微的整理一下。好代码整理。代码。OK,好,我把代码整理到这边,这个很重要啊,同学们。我从这边一步一步把它全部截下来。
29:01
OK,这是第26行。没问题吧?这是第26行。然后呢,我们紧接着继续截取,从26行开始截,26行,从27行开始截取。对不对,从27行开始截取。好的,第20期呢,咱们就截取完毕。完好,这是我们的第一个题,老师就讲完了,讲完了我们紧接着再来看第二个练习题,第二个练习题是什么样子的呢?看效果,他说统计三个班的及格人数,每个班有五名学生,诶,这个有点意思了,他让我统计人数,大家想一想这个怎么做,其实这个题啊,很简单,就是你想一想嘛,既然需要统计三个班的及格人数,那我应该。设计一个变量来保存及格人数不就完了吗?来吧。来,我们紧接着在这上面继续来分析代码。现在呢,继续完成。
30:02
统计三个班级的及格人数。那我的思路。分析一下思路。分析思路我的思路也很简单,就什么呢?就是定义一个变量,或者声明一个变量,比如说叫做什么呢?Pass。Count。Count对吧,用于保存,用于保存及格人数。及格人数,好,这个就很简单了,我就直接写了啊,同学们来定一个变量,VR pass count。等于多少呢?初始化当然是零嘛。来个int,因为人肯定是整数,你不能说1.5个人对不对,那怎么样来统计它有及格人数,大家是不是应该放到这啊,我当我拿到这个成绩过后,我就可以来判断一下。他累计完了过后我来判断一下,注意听我判断。就是判断分数是否及格了,分数是否及格。
31:01
没问题吧,怎么加呢?加一个判断吗?如果score。它大于等于60,是不是就是及格分呢?写上,然后我们把pass count怎么样加加就可以了,就是这加了一段代码能理解吗?那最后呢,我们把这个及格人数在这输出来一下。直接输出。啊,及格人数有及格人数为人数为多少呢?诶朋友们百分V,我把这个数出来就是我们的pass w RD。啊count啊count写完了。好,这样我来换行,那同学们我们看看这个代码能不能跑起来走一个。好,我有两个班级对吧。好。第一个班十。十注意,我这次来一个及格人数70,再来一个十。十回撤好注意啊,同学们,我这个及格人数只有一个啊,第一个班只有一个人及格。第二个班一。
32:03
111好,第五个人我让他及格80,好,大家看到第二个班的平均分是16.8,然后呢,每个班总成绩这这都正确,最后及格人数为二,为什么呢?一个是70及格了,一个是80及格了,好,完全正确。完全正确,大家看一下我是怎么把这个代码做完的啊好,这一段代码呢,我也把它拷贝到笔记里面来。代码如下,对我就说明一下啊,对上面的代码,对上面的代码做了一点修改,代码进行了一点修改。哪个地方修改了呢?好的,我把修改的部分给大家粘到笔记里面来就可以了,最后源代码我也会给大家,我在这加了一个变量。我怎么做的,核心的地方我摘过来啊,核心地方我摘过来哪里。一个呢,就是在这地方我增加了一个变量,这是我的分析。
33:00
这边是老师的分析。这是一个地方,是不是做了修改,这是一个位置。然后呢,我还在哪个地方做了修改。或者说做了改进呢,下面还有还有一个位置我们做了改进在这里。在我们的for循环内存for循环里面,我们加了一个判断。哪里呢,就这里。累积。统计在这里,如果是块大于等于60,我们就加加了,看到没有,其实我改进的地方就是这两个位置,那同学们呢?你能不能想到在这个位置去加一个判断来统计几个人数,这就是我们要去思考的问题了,就你要经常去写代码,这个思路就会源源不断,如果你老不写代码,你只是听老师视频,你不去动手,那我告诉大家这个效果呢,一定会减半的。好,同学们。关于我们的。应用案例的前两个题呢,我就给大家先介绍到这里,后面两个题呢,我们在下一个视频为大家进行讲解,同学们注意大家一定要去多练习啊,好,这块我们先说到这。
我来说两句