diff --git a/day05/loop/README.md b/day05/loop/README.md index a3c5667..4362ced 100644 --- a/day05/loop/README.md +++ b/day05/loop/README.md @@ -1 +1,5 @@ -# 循环语句 \ No newline at end of file +# 循环语句 + +[课件](https://gitee.com/infraboard/go-course/blob/master/zh-cn/base/for.md) + + diff --git a/day05/loop/main.go b/day05/loop/main.go new file mode 100644 index 0000000..87e23dc --- /dev/null +++ b/day05/loop/main.go @@ -0,0 +1,162 @@ +package main + +import ( + "fmt" +) + +func main() { + arr01 := []int{1, 2, 3, 4, 5} + // slices for + for index, value := range arr01 { + // 是值的副本,不能修改(改变不了外部的值, 不能修改这个值来修改array) + fmt.Println(index, arr01[index]) + fmt.Println(value) + + // 改变slice + arr01[index] = 10 + } + + m01 := map[string]int{"a": 1, "b": 2, "c": 3} + // map for + for key, value := range m01 { + // 是值的副本,不能修改(改变不了外部的值, 不能修改这个值来修改map) + fmt.Println(key, m01[key]) + fmt.Println(value) + + // 修改map + m01[key] = 10 + } + + // n * m 乘法表 + // n 从1到9(乘数), m 从1到n(被乘数) + for m := 1; m <= 9; m++ { + // m: 1, n: 1 + // m: 2, n: 1, 2 + // m: 3, n: 1, 2, 3 + // m: 4, n: 1, 2, 3, 4 + // ... + for n := 1; n <= m; n++ { + fmt.Printf("%d×%d=%-2d ", n, m, m*n) + } + fmt.Println() + } + + fmt.Println("2-100之间的素数:") + // 遍历 2 到 100 + for num := 2; num <= 100; num++ { + isPrime := true // 假设是素数 + + // 检查能否被2到√num之间的数整除 + // 再通过循环检查 从2到num的数, 是否能整除(求模有没有余数: %); 9 (1 * 5, 2 *4, 3 * 3, 4 * 2, 5 * 1) + for divisor := 2; divisor*divisor <= num; divisor++ { + if num%divisor == 0 { + isPrime = false + break // 找到一个因数就可以退出了 + } + } + + if isPrime { + fmt.Printf("%d ", num) + } + } + fmt.Println() + + // 不使用标签(GOTO):只跳出内层循环 + fmt.Println("---- 不使用标签 ----") + for i := 1; i <= 3; i++ { + fmt.Printf("外层: %d\n", i) + for j := 1; j <= 3; j++ { + fmt.Printf(" 内层: %d\n", j) + if j == 2 { + break // 只跳出内层循环 + } + } + } + + // 使用标签:跳出外层循环 + fmt.Println("---- 使用标签 ----") +OuterLoop: // 定义标签 (定义程序的锚点,使用 goto或者break 跳转的锚点) + for i := 1; i <= 3; i++ { + fmt.Printf("外层: %d\n", i) + for j := 1; j <= 3; j++ { + fmt.Printf(" 内层: %d\n", j) + if j == 2 { + break OuterLoop // 跳出到标签处,即外层循环 + } + } + } + + fmt.Println("---- 跳过偶数 ----") + for i := 1; i <= 10; i++ { + if i%2 == 0 { + continue // 跳过偶数 + } + fmt.Printf("%d ", i) + } + // 输出: 1 3 5 7 9 + + var count int = 1 + +LOOP: // 定义标签 + if count <= 5 { + fmt.Printf("计数: %d\n", count) + count++ + goto LOOP // 跳回标签 + } + fmt.Println("结束") + + fmt.Println("---- 统计学生成绩 ----") + // 统计学生成绩 + scores := []int{85, 92, 78, 95, 88, 73, 90, 85, 79, 91} + + var sum, max, min int + max = scores[0] + min = scores[0] + + for _, score := range scores { + sum += score + if score > max { + max = score + } + if score < min { + min = score + } + } + + average := float64(sum) / float64(len(scores)) + fmt.Printf("平均分: %.2f\n", average) + fmt.Printf("最高分: %d\n", max) + fmt.Printf("最低分: %d\n", min) + + fmt.Println("---- 清洗用户输入的电话号码列表 ----") + // 清洗用户输入的电话号码列表 + phoneNumbers := []string{"138-1234-5678", "159-xxxx-9999", "186-8888-8888", "invalid", "177-9999-0000"} + + validPhones := []string{} + for _, phone := range phoneNumbers { + // 简单验证:长度为13,包含两个短横线 + if len(phone) != 13 { + continue // 跳过无效号码 + } + if phone[3] != '-' || phone[8] != '-' { + continue + } + + // 判断所有字符都是数字,不是字母 + if !IsNumber(phone[:3]) || !IsNumber(phone[4:8]) || !IsNumber(phone[9:13]) { + continue + } + validPhones = append(validPhones, phone) + } + + fmt.Printf("有效电话号码: %v\n", validPhones) +} + +func IsNumber(s string) bool { + for _, char := range s { + if char < '0' || char > '9' { + return false + } + } + return true +}