章节

4.3 练习

本篇通过若干分级练习巩固 if 与 switch,并能独立完成基础分支判断、输入校验与状态分流。

练习

学完本章你应该掌握

  • 能根据简单条件写出 ifif-elseif-else if-else 三种常见判断结构。
  • 能处理区间判断、非法输入和兜底分支,避免边界写错或漏掉异常情况。
  • 能在合适场景下使用 switch 完成枚举判断和区间判断,并理解 defaultfallthrough 的作用。
  • 能使用 if 初始化语句; 条件 处理 map 查询等“先取值再判断”的写法,并知道变量作用域只在当前分支内有效。
  • 能把本章知识迁移到成绩判断、星期转换、角色分流、资料查询等基础控制台场景。

简单

第 1 题:判断是否及格

第 1 题 简单

编写一个程序,完成下面要求:

  • 提示用户输入一个整数分数
  • 如果分数大于等于 60,输出 及格
  • 否则输出 不及格
查看参考答案
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
package main

import "fmt"

func main() {
	var score int

	fmt.Print("请输入分数:")
	fmt.Scan(&score)

	if score >= 60 {
		fmt.Println("及格")
	} else {
		fmt.Println("不及格")
	}
}

第 2 题:补全年龄区间判断

第 2 题 简单

补全下面代码中的空白,让程序按照下面规则输出结果:

  • age <= 0 输出 未出生
  • 1 ~ 18 输出 未成年
  • 19 ~ 35 输出 青年
  • 其他情况输出 中年
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
package main

import "fmt"

func main() {
	var age int
	fmt.Scan(&age)

	if ________ {
		fmt.Println("未出生")
	} else if ________ {
		fmt.Println("未成年")
	} else if ________ {
		fmt.Println("青年")
	} else {
		fmt.Println("中年")
	}
}
查看参考答案

补全后的代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
package main

import "fmt"

func main() {
	var age int
	fmt.Scan(&age)

	if age <= 0 {
		fmt.Println("未出生")
	} else if age <= 18 {
		fmt.Println("未成年")
	} else if age <= 35 {
		fmt.Println("青年")
	} else {
		fmt.Println("中年")
	}
}

说明:写成 else if age <= 18else if age <= 35 就可以了,因为前面的不满足时才会继续判断后面的分支。

第 3 题:把星期数字转成文字

第 3 题 简单

编写一个程序,完成下面要求:

  • 提示用户输入一个整数 week
  • 如果输入 1,输出 周一
  • 如果输入 2,输出 周二
  • 如果输入 3,输出 周三
  • 如果输入 4,输出 周四
  • 如果输入 5,输出 周五
  • 如果输入 67,输出 周末
  • 其他情况输出 输入错误

要求使用 switch 实现。

查看参考答案
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package main

import "fmt"

func main() {
	var week int

	fmt.Print("请输入星期数字:")
	fmt.Scan(&week)

	switch week {
	case 1:
		fmt.Println("周一")
	case 2:
		fmt.Println("周二")
	case 3:
		fmt.Println("周三")
	case 4:
		fmt.Println("周四")
	case 5:
		fmt.Println("周五")
	case 6, 7:
		fmt.Println("周末")
	default:
		fmt.Println("输入错误")
	}
}

第 4 题:修正会重复输出的年龄判断

第 4 题 简单

下面程序的目标是根据年龄输出一个结果,但它现在有逻辑问题。
请改正后让输入 12 时只输出一行 未成年

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
package main

import "fmt"

func main() {
	var age int
	fmt.Scan(&age)

	if age > 0 {
		fmt.Println("未成年")
	}
	if age <= 18 {
		fmt.Println("未成年")
	}
	if age > 18 {
		fmt.Println("青年或中年")
	}
}
查看参考答案

一种可行的改法如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
package main

import "fmt"

func main() {
	var age int
	fmt.Scan(&age)

	if age <= 0 {
		fmt.Println("未出生")
	} else if age <= 18 {
		fmt.Println("未成年")
	} else {
		fmt.Println("青年或中年")
	}
}

说明:原程序用了多个并列 if,条件又没有互斥,所以一次输入可能命中多个分支。这里改成 if -> else if -> else 更合适。

第 5 题:写出 fallthrough 的输出结果

第 5 题 简单

阅读下面代码,写出它的输出结果:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
package main

import "fmt"

func main() {
	level := 1

	switch level {
	case 1:
		fmt.Println("初级")
		fallthrough
	case 2:
		fmt.Println("继续学习")
	default:
		fmt.Println("结束")
	}
}
查看参考答案
1
2
初级
继续学习

说明:fallthrough 会直接进入下一个 case 执行,不会重新判断下一个 case 的条件。

一般

第 6 题:用 if 查询年龄表

第 6 题 一般

编写一个程序,完成下面要求:

  • 先准备一个 map:
1
2
3
4
ages := map[string]int{
	"阿斌": 21,
	"小王": 18,
}
  • 再读取一个姓名
  • 使用 if 初始化语句; 条件 的写法判断这个姓名是否存在于 map 中
  • 如果存在,输出 阿斌 的年龄是 21
  • 如果不存在,输出 没有找到 阿华 的年龄信息

其中姓名要替换成用户真正输入的内容。

查看参考答案
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
package main

import "fmt"

func main() {
	ages := map[string]int{
		"阿斌": 21,
		"小王": 18,
	}

	var name string

	fmt.Print("请输入姓名:")
	fmt.Scan(&name)

	if age, ok := ages[name]; ok {
		fmt.Printf("%s 的年龄是 %d\n", name, age)
	} else {
		fmt.Printf("没有找到 %s 的年龄信息\n", name)
	}
}

说明:ageok 是在 if 初始化语句里声明的,它们只在当前 if/else 代码块中可用。

第 7 题:用 switch {} 判断成绩等级

第 7 题 一般

编写一个程序,完成下面要求:

  • 读取一个整数分数
  • 如果分数小于 0 或大于 100,输出 分数非法
  • 如果分数在 90 ~ 100,输出 A
  • 如果分数在 80 ~ 89,输出 B
  • 如果分数在 60 ~ 79,输出 C
  • 其他情况输出 D

要求使用 switch {} 实现区间判断。

查看参考答案
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package main

import "fmt"

func main() {
	var score int

	fmt.Print("请输入分数:")
	fmt.Scan(&score)

	switch {
	case score < 0 || score > 100:
		fmt.Println("分数非法")
	case score >= 90:
		fmt.Println("A")
	case score >= 80:
		fmt.Println("B")
	case score >= 60:
		fmt.Println("C")
	default:
		fmt.Println("D")
	}
}

说明:switch {} 里每个 case 后面直接写条件,写区间判断时通常比多层 if-else 更整齐。

第 8 题:先校验姓名,再分配角色欢迎语

第 8 题 一般

编写一个程序,完成下面要求:

  • 先定义两个变量:姓名 name 和角色 role,值可以自行设置
  • 如果 name 是空字符串,输出 姓名不能为空 并结束程序
  • 如果 roleadmin,输出 管理员,欢迎你
  • 如果 roleteacher,输出 老师,欢迎你
  • 如果 rolestudent,输出 同学,欢迎你
  • 其他情况输出 未知角色

要求:

  • 姓名校验使用 if
  • 角色分流使用 switch
查看参考答案
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package main

import "fmt"

func main() {
	name := "阿斌"
	role := "teacher"

	if name == "" {
		fmt.Println("姓名不能为空")
		return
	}

	switch role {
	case "admin":
		fmt.Println("管理员,欢迎你")
	case "teacher":
		fmt.Println("老师,欢迎你")
	case "student":
		fmt.Println("同学,欢迎你")
	default:
		fmt.Println("未知角色")
	}
}

说明:这道题把 ifswitch 放在同一个小场景里,前者做输入校验,后者做状态分流。

进阶

下面两题会把 ifswitch 放到更完整的输入处理场景里,重点考察分支顺序、边界判断和多知识点组合。

第 9 题:查询成绩并输出等级

第 9 题 进阶

已知有一份成绩表:

1
2
3
4
5
scores := map[string]int{
	"阿斌": 92,
	"小李": 76,
	"小王": 58,
}

请编写一个程序,完成下面要求:

  • 读取一个姓名
  • 先用 if 初始化语句; 条件 判断这个姓名是否存在于成绩表中
  • 如果不存在,输出 没有找到该学生
  • 如果存在,再根据分数输出等级: 90 ~ 100 输出 A 80 ~ 89 输出 B 60 ~ 79 输出 C 其他输出 D
  • 最后输出一行完整结果,例如:
1
阿斌 的分数是 92,等级是 A
查看参考答案
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package main

import "fmt"

func main() {
	scores := map[string]int{
		"阿斌": 92,
		"小李": 76,
		"小王": 58,
	}

	var name string

	fmt.Print("请输入姓名:")
	fmt.Scan(&name)

	if score, ok := scores[name]; ok {
		level := ""

		switch {
		case score >= 90:
			level = "A"
		case score >= 80:
			level = "B"
		case score >= 60:
			level = "C"
		default:
			level = "D"
		}

		fmt.Printf("%s 的分数是 %d,等级是 %s\n", name, score, level)
	} else {
		fmt.Println("没有找到该学生")
	}
}

说明:这道题先用 if 处理“有没有这个人”,再用 switch {} 处理“这个人的分数属于哪个区间”,是很常见的两段式判断。

第 10 题:快递费用判断

第 10 题 进阶

编写一个程序,完成下面要求:

  • 读取两个输入:快递类型 kind 和重量 weight
  • 如果 weight <= 0,输出 重量非法 并结束程序
  • 运费规则如下:

standardweight <= 1 时运费 8 其他情况运费 12

expressweight <= 1 时运费 12 其他情况运费 18

其他快递类型输出 未知快递类型

  • 如果类型合法,最后输出:
1
运费:12元

要求:

  • 先用 if 处理重量非法
  • 再用 switch 判断快递类型
查看参考答案
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package main

import "fmt"

func main() {
	var kind string
	var weight float64

	fmt.Print("请输入快递类型和重量:")
	fmt.Scan(&kind, &weight)

	if weight <= 0 {
		fmt.Println("重量非法")
		return
	}

	switch kind {
	case "standard":
		if weight <= 1 {
			fmt.Println("运费:8元")
		} else {
			fmt.Println("运费:12元")
		}
	case "express":
		if weight <= 1 {
			fmt.Println("运费:12元")
		} else {
			fmt.Println("运费:18元")
		}
	default:
		fmt.Println("未知快递类型")
	}
}

说明:这道题里 switch 先区分类型,进入具体类型后再用 if 做更细的条件判断,这是一种很常见的组合写法。

本文禁止转载
使用 Hugo 构建
主题 StackJimmy 设计 由 Hobin 魔改
最近构建时间:2026-04-17 19:07:48 CST
载入天数...载入时分秒...
发表了 1 篇文章 · 发表了 152 篇笔记 · 总计 18 万 0 千字