开发者学堂课程【Go语言核心编程 - 基础语法、数组、切片、Map:多重循环应用案例】学习笔记,与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/625/detail/9579
多重循环应用案例(一)
内容介绍:
一、多重循环控制
二、应用实例1
三、应用实例2
这节课讲解多重循环控制,前面提过的循环控制都是基于一层的,实际上在开发中会遇到比较复杂的业务逻辑,这种业务逻辑往往需要运用多重循环控制才能够解决。
一、多重循环控制
多重循环控制介绍
1、将一个循环放在另一个循环体内,就形成了嵌套循环,与前面讲解过的嵌套分支一样。在外边的 for 称为外层循环,在里面的 for 循环称为内层循环。(建议一般使用两层,最多不用超过3层,超过3层的话逻辑就变得比较复杂)。
2、实质上,嵌套循环就是把内层循环当成外层循环的循环体。当只有内层循环的循环条件为 false 时,才会完全跳出内层循环,才可结束外层的当次循环,开始下一次的循环。
3、外层循环次数为 m 次,内层循环为n次,则内层循环体实际上需要执行 m*n=mn次。
上述文字描述比较抽象,所以下面通过实例练习来进一步了解,这些题讲解后将会对于多重循环以及循环去解决问题的能力有很大的提升。
二、应用实例1
案例:统计3个班成绩情况,每个班有5名同学,求出各个班的平均分和所有班级的平均分【学生成绩从键盘输入】。
1.编程时两大绝招
(1)先易后难,也就是说将一个复杂的问题分解成简单的问题,然后一个个完成。
(2)先死后活,也就是说先不要考虑把代码写得很灵活,要先把代码写得死板,再用变量把代码变灵活。下面开始实现程序。
2.分析实现思路1
(1)统计一个班的成绩情况,每个班有5名同学,求出该班的平均分,学生成绩从键盘输入。这里先不考虑变量,降低难度,先易后难。
(2)学生数就是5个【先死后活】
(3)声明一个sum统计班级的总分
代码如下:
package main
import “fmt”
fun main(){
//引入主函数
s
um := 0.0
//声明sum,初始值为0.0
f
or i := 1;i<=
5
; i++{
//初始化i=1,一共5个学生则范围为i<=5,循环迭代为i++。
v
ar score float64
//定义变量score接收成绩。
fmt.Printf(“请输入第%d个学生的成绩\n”,i)
//提示输入学生成绩,使用格式化输出,i表示第几个学生。
f
mt.
S
canln(&score)
s
um+=score
//累计总分
}
fmt.Printf(“班级的平均分是%v”,sum/5)
//平均分为总分sum/人数5。
}
以上代码完成了第一个需求,下面运行一下进行验证。
运行结果:
D:
\
goproject\src\go_code\chapter05\
forexec
2>go run main .go
请输入第1个学生的成绩
10
请输入第2个学生的成绩
10
请输入第3个学生的成绩
10
请输入第4个学生的成绩
10
请输入第5个学生的成绩
10
班级的平均分是10
代码运行成功,说明这里一个班学生成绩平均分的计算实现成功,下面继续分析实现思路2,不再统计一个班,转而进行统计3个班的平均分。
3、分析实现思路2
(1)统计3个班级成绩情况,每个班有5名同学,求出各个班的平均分和所有班级的平均分【学生成绩从键盘输入】。就是把上面那一段代码循环,1个班代码执行1次,3个班则代码要执行3次,使用for循环来重复这段代码。
(2)j表示第几个班级
(3)定义一个变量存放总成绩
代码如下:
for
j
:=1;j<=3;j++{
//j表示第几个班,初始化j=1,因为有3个班则取值范围为j<=3。
s
um := 0.0
f
or i := 1;i<=
5
; i++{
v
ar score float64
f
mt.
P
rintf
(“请输入第%d班 第%d个学生的成绩\n”,j,i)
//提示输入班级,成绩
f
mt.
S
canln(&score)
s
um+=score
}
f
mt.
P
rintf
(“第%d个班级的平均分是%v\n”,j,sum/5)
}
整个代码第一次进入循环时 sum=0.0,然后统计第一个班级平均分,进行输出,第二次进入循环体时 sum 再次赋值为0.0,相当于 sum 会每次清零后再对班级总分sum进行累计,只是把里面的for循环体执行了3次。下面运行查看效果。
运行结果:
结果如上则说明实现了3个班级分别计算平均分功能,但是还要完成统计所有班的平均分功能。而sum是代表每个班的总成绩,所以还要定义一个变量存放总成绩,变量为 totaSum。
代码如下:
var total
S
um float64 = 0.0
//定义变量totaSum,数据类型为float64,初始化为0.0。
for
j
:=1;j<=3;j++{
s
um := 0.0
f
or i := 1;i<=
5
; i++{
v
ar score float64
f
mt.
P
rintf
(“请输入第%d班 第%d个学生的成绩\n”,j,i)
f
mt.
S
canln(&score)
s
um+=score
}
f
mt.
P
rintf
(“第%d个班级的平均分是%v\n”,j,sum/5)
totalS
um += sum
//将各个班的总成绩累计到 totalSum
}
f
mt.
P
rintf
(“各个班级的总成绩%v 所有班级平均分是%v\n“, totalSum,totalSum /(5*3))
//所有班级的平均分就是总分数除以三个班的总人数。
此时运行程序,快速的输入第1班5个学生成绩都为10,第2班5个学生成绩都为20,第3班5个学生成绩都为30。
运行结果:
…
第1个班级的平均分是10
…
第2个班级的平均分是20
…
第3个班级的平均分是30
各个班级的总成绩300 所有班级平均分是20
运行结果如上,说明实现了案例要求的基本功能,下面开始最后一步完善,将代码变得灵活。因为如果以后要统计多个班级,而代码还这样写是不合理的。
4、分析实现思路3
(1)可以把代码变得灵活。
(2)定义两个变量,表示班级的个数和班级的人数
代码如下:
var class
N
um int =
2
//定义一个班级数量变量classNum,类型为int,赋值为2,然后替换相应数值为变量。
var stu
N
um int =
5
//定义学生人数变量 stuNum,人数为5,然后替换相应数值为变量。
var total
S
um float64 = 0.0
f
or j :=1;j<=class
Num; j++{
sum :=0.0
f
or i := 1;i<= stu
N
um; i++{
v
ar score float64
f
mt.
P
rintf(“请输入第%d班 第%d个学生的成绩\n”,j,i)
f
mt.
S
canl
n(&score)
sum+=score
}
f
mt.
P
rintf
(“第%d个班级的平均分是%v\n”,j,sum/ float64(stuNum))
//因为在 Golang 中类型如果不匹配则无法进行转化,所以 float64 类型的 sum 和int类型的 stuNum 不匹配,需要将 stuNum 类型转化为 float64。
total
S
um
+=
sum
}
f
mt.
P
rintf
(“各个班级的总成绩%v 所有班级平均分是%v\n“, totalSum,totalSum /float64(stuNum *classNum))
//此处类型不一致,需要转化类型
这时运行代码,进行验证一遍,快速输入第1班5名学生成绩分别为10,20,10,10,10,第2班5名学生成绩都为20。
运行结果:
…
第1个班级的平均分是12
…
第2个班级的平均分是20
各个班级的总成绩160 所有班级平均分是16
经过计算后验证输出答案正确,到此整个案例功能实现成功。