【一Go到底】第十三天---循环控制

88 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第13天,点击查看活动详情

一、For循环控制

1.1 基础语法及说明


for 循环变量初始化;循环条件;循环变量迭代{
    循环操作(语句)/循环体
}

1.2 for 循环四要素

  1. 循环变量初始化
  2. 循环条件
  3. 循环操作/循环体
  4. 循环变量迭代

1.3 for循环简单案例

1.3.1 for循环使用方法1

package main

import "fmt"

func main() {

	// for循环演示
	for i := 0; i < 10; i++ {
		fmt.Println("当前i = ", i)
	}
}

image.png

1.3.2 for循环使用方法2

package main

import "fmt"

func main() {

	// for循环演示2
        j := 0  //变量初始化
	for i < 10{ //循环条件
		fmt.Println("当前i = ", j)
                j++  // 循环变量迭代
	}
}



1.3.3 for循环使用方法3(死循环,搭配break)

等价于 for ;;{}

package main

import "fmt"

func main() {
    //搭配 break 使用
    k := 1
    for { // 等价于 for ;;{}
        if k <= 10{
        fmt.Println("k值为: ", k)
        }else{
            break
        }
        k++
}

1.4 for循环执行的顺序说明

  1. 执行变量初始化, 如 i:=0
  2. 执行循环条件判断, 如 i<10
  3. 如果循环条件为真(步骤二),执行循环体操作 fmt.Println("当前i = ", i)
  4. 执行循环变量迭代,如 i++
  5. 反复执行,直到循环条件为假时,退出

1.5 for循环注意事项和细节说明

  1. 循环条件是返回一个布尔值表达式

二、案例解析

2.1 字符串遍历

2.1.1 for循环实现

package main

import "fmt"

func main() {
	// 定义字符串变量
	var str string = "hello,golang"
	for i := 0; i < len(str); i++ {
		fmt.Printf("%c", str[i]) // 使用Printf转义
	}
}


2.1.2 for-range方法实现(可遍历中文)

若本案例中存在中文,那么一个中文会占用3个index

package main

import "fmt"

func main() {
	// 定义字符串变量
	var str string = "hello,golang"
        // 若是中文 那么一个中文会占用3个index
	for index, val := range str {  
		fmt.Printf("index=%d , value=%c\n", index, val)
	}
}


2.1.3 遍历中文字符串(非 for - range)

传统遍历对字符串遍历,是按照字节遍历;一个汉字在utf8中占3个字节

需要将字符串转换为 []rune 切片

package main

import "fmt"

func main() {
	// 定义字符串变量

	var str string = "你好,golang"
	// 将str转换为 []rune
	rune_str := []rune(str)
	for i := 0; i < len(rune_str); i++ {
		fmt.Printf("%c", rune_str[i]) // 使用Printf转义
	}
}

2.2 打印100以内数字9的倍数的个数及总和

package main

import "fmt"

func main() {
	// 定义count变量 用来记录9的倍数
	var count int = 0
	// 定义 sum 变量 用来记录9倍数的总和
	var sum int = 0
	for i := 1; i <= 100; i++ {
		if i%9 == 0 {
			count++
			sum += i
		}
	}
	fmt.Printf("count = %d, sum = %d", count, sum)
}

2.3 输出如下等式

image.png

package main

import "fmt"

func main() {
	// 定义result变量
	var result int = 6

	for i := 0; i <= result; i++ {
		fmt.Printf("%d + %d = %d\n", i, result-i, result)
	}

}

三、Go语言中while / do-while的实现

使用for语句实现

3.1 while 案例

package main

import "fmt"

func main() {
	// 循环变量初始化
	i := 0

	for {
		// if 循环条件表达式
		if i > 10 {
			// 跳出for循环
			break
		}
		// 循环操作语句
		fmt.Println("这是循环操作语句 -> ", i)
		// 循环变量迭代
		i++
	}
}

3.2 do-while 案例

循环先执行,后判断,至少执行一次

package main

import "fmt"

func main() {

	// 循环变量初始化
	i := 0

	for {
		// 循环操作语句
		fmt.Println("当前i ==> ", i)
		// 循环变量迭代
		i++

		// if 循环条件表达式
		if i > 10 {
			// 跳出循环
			break
		}
	}
}

四、多重循环控制

4.1 介绍

  1. 将一个循环放在另一个循环体内,就形成了嵌套循环。在外边的for称为外层循环在里面的for循环称为内层循环。[建议一般使用两层 ,最多不要超过3层]
  2. 实质上,嵌套循环就是把内层循环当成外层循环的循环体。当只有内层循环的循环条件为false时,才会完全跳出内层循环,才可结束外层的当次循环,开始下一次的循环。
  3. 设外层循环次数为m次,内层为n次,则内层循环体实际上需要执行m*n=mn次。

4.2 案例介绍

4.2.1 统计班级成绩

  1. 统计三个班的学习情况,其中每个班5个学生
  2. 求各个班的平均分和所有班级的平均分
  3. 统计三个班及格人数
  4. 从键盘输入学生成绩
package main

import "fmt"

func main() {

	// 统计三个班的学习情况,其中每个班5个学生
	// 求各个班的平均分和所有班级的平均分
	// 从键盘输入学生成绩

	var sum_score, class_sum_score, student float32
	var sum_pass, class_pass int

	for i := 1; i <= 3; i++ {
		class_sum_score = 0
		class_pass = 0
		for j := 1; j <= 5; j++ {
			fmt.Printf("请输入第%v名学生的成绩: ", j)
			fmt.Scanln(&student)
			class_sum_score += student
			if student >= 60 {
				class_pass++
			}
		}
		sum_score += class_sum_score
		sum_pass += class_pass
		fmt.Printf("%v班平均分为: %v, 及格人数: %v\n", i, class_sum_score/5, class_pass)
	}
	fmt.Printf("所有班级平均分为: %v, 总计及格人数: %v 人\n", sum_score/3, sum_pass)
}


4.2.2 打印金字塔

根据用户输入的层数打印出对应层的金字塔


package main

import "fmt"

func main() {

	// 从键盘输入来打印对应的金字塔层数

	var layers int
	fmt.Printf("请输入您要打印的金字塔层数:")
	fmt.Scanln(&layers)

	for i := 1; i <= layers; i++ {
		// 打印空格
		for k := 1; k <= layers-i; k++ {
			fmt.Printf(" ")
		}

		for j := 1; j <= i; j++ {
			fmt.Printf("* ")
		}
		fmt.Println()
	}
}


4.2.3 九九乘法表

package main

import "fmt"

func main() {

	// 打印九九乘法表

	for i := 1; i <= 9; i++ {
		for j := 1; j <= i; j++ {
			fmt.Printf("%v*%v=%v\t", j, i, i*j)
		}
		fmt.Println()
	}
}