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
}
