循环控制

for循环

基本介绍

听其名而知其意。即:让一段代码多次/循环执行。

入门案例

  1. // 演示for循环控制 入门案例
  2. // 需求: 打印100次 "hello world!"
  3. package main
  4. import "fmt"
  5. func main() {
  6. for i := 1; i <= 100; i++ {
  7. fmt.Println(i, "hello world!")
  8. }
  9. }

基本语法

写法一:
for <循环变量初始化>; <循环条件>; <循环变量迭代> {
<循环执行的语句>
}

写法二:
<循环变量初始化>
for <循环条件> {
<循环执行的语句>
<循环变量迭代>
}

写法三:
<循环变量初始化>
for {
if <循环条件> {
<循环执行的语句>
} else {
break // 这里的break的作用是终止for循环
}
<循环变量迭代>
}

写法四:
<循环变量初始化>
for ; ; {
if <循环条件> {
<循环执行的语句>
} else {
break // 这里的break的作用是终止for循环
}
<循环变量迭代>
}

流程图解

循环控制 for - 图1

案例演示

  1. // 演示 for 循环控制语句
  2. // 需求: 打印1-100之间所有是9倍数的整数个数及总合
  3. package main
  4. import "fmt"
  5. func main() {
  6. var (
  7. count uint64
  8. sum uint64
  9. )
  10. for i := 1; i <= 100; i++ {
  11. if i % 9 == 0 {
  12. count ++
  13. sum += uint64(i)
  14. }
  15. }
  16. fmt.Println(count, sum)
  17. }
  1. // 演示 for 循环控制语句
  2. // 需求: 完成下列块注释中表达式的输出(6是可变的)
  3. /*
  4. 0 + 6 = 6
  5. 1 + 5 = 6
  6. 2 + 4 = 6
  7. 3 + 3 = 6
  8. 4 + 2 = 6
  9. 5 + 1 = 6
  10. 6 + 0 = 6
  11. */
  12. package main
  13. import "fmt"
  14. func main() {
  15. var (
  16. num int
  17. )
  18. fmt.Println("请输入一个正整数")
  19. fmt.Scan(&num)
  20. for i := 0; i <= num; i++ {
  21. fmt.Println(i, "+", num - i, "=", num)
  22. //fmt.Printf("%v + %v = %v\n", i, num -i, num)
  23. }
  24. }
  1. // 演示 for 循环控制语句
  2. // Go中没有while循环,但可以通过for循环 + if条件控制实现while循环
  3. // 需求: 当随机数i=999时, 打印"恭喜你成为超级幸运玩家!"
  4. package main
  5. import (
  6. "fmt"
  7. "math/rand"
  8. "time"
  9. )
  10. func main() {
  11. for {
  12. rand.Seed(time.Now().UnixNano()) // 以时间戳作为随机数种子
  13. i := rand.Intn(1000) // 随机生成0-1000之间的整数
  14. fmt.Println(i)
  15. if i == 999 {
  16. fmt.Println("恭喜你成为超级幸运玩家!")
  17. break
  18. }
  19. }
  20. }

多层for循环

基本介绍

  • 将一个循环放在另一个循环体内,就形成了嵌套循环。在外层的for循环称为 外层循环,在内层的for循环称为 内层循环。(建议不超过3层嵌套循环)
  • 实质上,嵌套循环就是把内层循环当成外层循环的循环体。当内层循环的循环条件为false时,才会完全结束内层循环,此时外层循环仅结束单次循环,并随后开始下一次循环。
  • 若外层循环次数为m次,内层循环为n次,则内层循环体实际需要执行m * n次

案例演示

  1. // 演示 for 多重循环控制语句
  2. // 统计3个班的成绩情况,每个班有5名同学,求出每个班的平均分 及 所有班在一起的平均分 (学生的成绩从键盘输入获取)
  3. package main
  4. import "fmt"
  5. func main() {
  6. var score, sum, totalSum float64
  7. for i := 1; i <= 3; i++ {
  8. sum = 0.0 // 重点: 在外层循环每次循环时,将sum赋值为0.0,从而实现通过sum求每个班的总分时,不会迭加上一班的分数
  9. for n := 1; n <= 5; n++ {
  10. fmt.Printf("请输入第%v个班%v名学生的成绩\n", i, n)
  11. fmt.Scan(&score)
  12. sum += score
  13. }
  14. fmt.Printf("第%v个班的平均分为%v\n\n", i, sum / 5)
  15. totalSum += sum
  16. }
  17. fmt.Printf("三个班合在一起的平均分为%v\n", totalSum / 15)
  18. }
  1. // 演示 for 多重循环控制语句
  2. // 经典案例: 打印金字塔
  3. /*
  4. *
  5. * *
  6. * *
  7. *******
  8. */
  9. package main
  10. import "fmt"
  11. var layers int
  12. func main() {
  13. fmt.Println("请输入层数")
  14. fmt.Scan(&layers)
  15. // i表示层数
  16. for i := 1; i <= layers; i++ {
  17. // 在打印*号前,县打印空格
  18. for k := 1; k <= layers-i; k++ {
  19. fmt.Print(" ")
  20. }
  21. // j 表示每层*号的个数
  22. for j := 1; j <= 2*i-1; j++ {
  23. if j == 1 || j == 2*i-1 || i == layers {
  24. fmt.Print("*")
  25. } else {
  26. fmt.Print(" ")
  27. }
  28. }
  29. fmt.Println(" ")
  30. }
  31. }