第 5 章 程序流程控制
5.1 程序流程控制介绍
在程序中,程序运行的流程控制决定程序是如何执行的,是我们必须掌握的,主要有三大流程控
制语句。
- 顺序控制
- 分支控制
- 循环控制
5.2 顺序控制
程序从上到下逐行地执行,中间没有任何判断和跳转。
一个案例说明,必须下面的代码中,没有判断,也没有跳转.因此程序按照默认的流程执行,即顺
序控制。
5.2.1顺序控制的一个流程图
5.2.2顺序控制举例和注意事项
Golang 中定义变量时采用合法的前向引用。如:
func main() {
var num1 int = 10 //声明了 num1
var num2 int = num1 + 20 //使用 num1
fmt.Println(num2)
}
错误形式:
func main() {
var num2 int = num1 + 20 //使用 num1
var num1 int = 10 //声明 num1 (×)
fmt.Println(num2)
}
5.3 分支控制
5.3.1分支控制的基本介绍
分支控制就是让程序有选择执行。有下面三种形式
- 单分支
- 双分支
- 多分支
5.3.2单分支控制
- 基本语法
- 应用案例
请大家看个案例[ifDemo.go]:
编写一个程序,可以输入人的年龄,如果该同志的年龄大于 18 岁,则输出 “你年龄大
于 18,要对自己的行为负责!” 需求—[分析]---->代码
代码:
输出结果
- 单分支的流程图
流程图可以用图形方式来更加清晰的描述程序执行的流程。
- 单分支的细节说明
5.3.3双分支控制
- 基本语法
- - 应用案例
请大家看个案例[IfDemo2.go]:
编写一个程序,可以输入人的年龄,如果该同志的年龄大于 18 岁,则输出 “你年龄大于 18,要对
自己的行为负责!”。否则 ,输出”你的年龄不大这次放过你了.”
- 双分支的流程图的分析
- 对双分支的总结
- 从上图看 条件表达式就是 age >18
- 执行代码块 1 ===> fmt.Println(“你的年龄大于 18”) …
- 执行代码块 2 ===> fmt.Println(“你的年龄不大…”) .
- 强调一下 双分支只会执行其中的一个分支。
5.3.4单分支和双分支的案例
5. 编写程序,声明 2 个 int32 型变量并赋值。判断两数之和,如果大于等于 50,打印“hello world!
-
编写程序,声明 2 个 float64 型变量并赋值。判断第一个数大于 10.0,且第 2 个数小于 20.0,打印两数之和。
-
【选作】定义两个变量 int32,判断二者的和,是否能被 3 又能被 5 整除,打印提示信息
-
判断一个年份是否是闰年,闰年的条件是符合下面二者之一:(1)年份能被 4 整除,但不能被 100整除;(2)能被 400 整除
5.3.5多分支控制
- 基本语法
- 对上面基本语法的说明
- 多分支的判断流程如下:
(1) 先判断条件表达式 1 是否成立,如果为真,就执行代码块 1
(2) 如果条件表达式 1 如果为假,就去判断条件表达式 2 是否成立, 如果条件表达式 2 为真,就执行代码块 2
(3) 依次类推. (4) 如果所有的条件表达式不成立,则执行 else 的语句块。 - else 不是必须的。
- 多分支只能有一个执行入口。
-
看一个多分支的流程图(更加清晰)
-
多分支的快速入门案例
岳小鹏参加 Golang 考试,他和父亲岳不群达成承诺:
如果:
成绩为 100 分时,奖励一辆 BMW;
成绩为(80,99]时,奖励一台 iphone7plus;
当成绩为[60,80]时,奖励一个 iPad;
其它时,什么奖励也没有。
请从键盘输入岳小鹏的期末成绩,并加以判断
代码如下:
对初学者而言,有一个使用陷阱.
-
多分支的课堂练习
案例 3:
5.3.6嵌套分支
- 基本介绍
在一个分支结构中又完整的嵌套了另一个完整的分支结构,里面的分支的结构称为内层分
支外面的分支结构称为外层分支。 - 基本语法
- 应用案例 1
参加百米运动会,如果用时 8 秒以内进入决赛,否则提示淘汰。并且根据性别提示进入男子组或女子组。【可以让学员先练习下】, 输入成绩和性别。
代码:
- 应用案例 2
出票系统:根据淡旺季的月份和年龄,打印票价 [考虑学生先做]
4_10 旺季:
成人(18-60):60
儿童(<18):半价
老人(>60):1/3
淡季:
成人:40
其他:20
代码:
5.4 switch 分支控制
5.4.1基本的介绍
- switch 语句用于基于不同条件执行不同动作,每一个 case 分支都是唯一的,从上到下逐一测
试,直到匹配为止。 - 匹配项后面也不需要再加 break
5.4.2基本语法
5.4.3switch 的流程图
- 对上图的说明和总结
- switch 的执行的流程是,先执行表达式,得到值,然后和 case 的表达式进行比较,如果相等,
就匹配到,然后执行对应的 case 的语句块,然后退出 switch 控制。 - 如果 switch 的表达式的值没有和任何的 case 的表达式匹配成功,则执行 default 的语句块。执行后退出 switch 的控制. 3) golang 的 case 后的表达式可以有多个,使用 逗号 间隔. 4) golang 中的 case 语句块不需要写 break , 因为默认会有,即在默认情况下,当程序执行完 case 语
句块后,就直接退出该 switch 控制结构。
5.4.4switch 快速入门案例
- 案例:
请编写一个程序,该程序可以接收一个字符,比如: a,b,c,d,e,f,g a表示星期一,b表示星期二 … 根
据用户的输入显示相依的信息.要求使用 switch 语句完成 - 代码
5.4.5switch 的使用的注意事项和细节
- case/switch 后是一个表达式( 即:常量值、变量、一个有返回值的函数等都可以)
- case 后的各个表达式的值的数据类型,必须和 switch 的表达式数据类型一致
- case 后面可以带多个表达式,使用逗号间隔。比如 case 表达式 1, 表达式 2 …
- case 后面的表达式如果是常量值(字面量),则要求不能重复
- case 后面不需要带 break , 程序匹配到一个 case 后就会执行对应的代码块,然后退出 switch,如
果一个都匹配不到,则执行 default - default 语句不是必须的.
- switch 后也可以不带表达式,类似 if --else 分支来使用。【案例演示】
- switch 后也可以直接声明/定义一个变量,分号结束,不推荐。 【案例演示】
- switch 穿透-fallthrough ,如果在 case 语句块后增加 fallthrough ,则会继续执行下一个 case,也
叫 switch 穿透
- Type Switch:switch 语句还可以被用于 type-switch 来判断某个 interface 变量中实际指向的
变量类型 【还没有学 interface, 先体验一把】
5.4.6switch 的课堂练习
- 使用 switch 把小写类型的 char 型转为大写(键盘输入)。只转换 a, b, c, d, e. 其它的输出
“other”。
- 对学生成绩大于 60 分的,输出“合格”。低于 60 分的,输出“不合格”。(注:输入的成绩不
能大于 100)
- 根据用户指定月份,打印该月份所属的季节。3,4,5 春季 6,7,8 夏季 9,10,11 秋季 12, 1, 2 冬
季
5.4.7switch 和 if 的比较
总结了什么情况下使用 switch ,什么情况下使用 if
- 如果判断的具体数值不多,而且符合整数、浮点数、字符、字符串这几种类型。建议使用 swtich
语句,简洁高效。 - 其他情况:对区间判断和结果为 bool 类型的判断,使用 if,if 的使用范围更广。
5.5 for 循环控制
5.5.1基本介绍
听其名而知其意。就是让我们的一段代码循环的执行。
5.5.2一个实际的需求
- 请大家看个案例 [forTest.go]:
编写一个程序, 可以打印 10 句
“你好,尚硅谷!”。请大家想想怎么做? - 使用传统的方式实现
- for 循环的快速入门
5.5.3for 循环的基本语法
- 语法格式
for 循环变量初始化; 循环条件; 循环变量迭代 {
循环操作(语句)
} - 对上面的语法格式说明
- 对 for 循环来说,有四个要素:
- 循环变量初始化
- 循环条件
- 循环操作(语句) ,有人也叫循环体。
- 循环变量迭代
- for 循环执行的顺序说明:
- 执行循环变量初始化,比如 i := 1
- 执行循环条件, 比如 i <= 10
- 如果循环条件为真,就执行循环操作 :比如 fmt.Println(“…”)
- 执行循环变量迭代 , 比如 i++
- 反复执行 2, 3, 4 步骤,直到 循环条件为 False ,就退出 for 循环。
5.5.4for 循环执行流程分析
- for 循环的流程图
- 对照代码分析 for 循环的执行过程
5.5.5for 循环的使用注意事项和细节讨论
- 循环条件是返回一个布尔值的表达式
- for 循环的第二种使用方式
for 循环判断条件 {
//循环执行语句
}
将变量初始化和变量迭代写到其它位置
- 案例演示:
- for 循环的第三种使用方式
上面的写法等价 for ; ; {} 是一个无限循环, 通常需要配合 break 语句使用for { //循环执行语句 }
- Golang 提供 for-range 的方式,可以方便遍历字符串和数组(注: 数组的遍历,我们放到讲数组
的时候再讲解) ,案例说明如何遍历字符串。
- 字符串遍历方式 1-传统方式
- 字符串遍历方式 2-for - range
- 上面代码的细节讨论
如果我们的字符串含有中文,那么传统的遍历字符串方式,就是错误,会出现乱码。原因是传统的
对字符串的遍历是按照字节来遍历,而一个汉字在 utf8 编码是对应 3 个字节。
如何解决 需要要将 str 转成 []rune 切片.=> 体验一把
- 对应 for-range 遍历方式而言,是按照字符方式遍历。因此如果有字符串有中文,也是 ok
5.5.6for 循环的课堂练习
- 打印 1~100 之间所有是 9 的倍数的整数的个数及总和
- 完成下面的表达式输出 ,6 是可变的。
5.6 while 和 do…while 的实现
Go 语言没有 while 和 do…while 语法,这一点需要同学们注意一下,如果我们需要使用类似其它语
言(比如 java / c 的 while 和 do…while ),可以通过 for 循环来实现其使用效果。
5.6.1while 循环的实现
- 说明上图
- for 循环是一个无限循环
- break 语句就是跳出 for 循环
- 使用上面的 while 实现完成输出 10 句”hello,wrold”
5.6.2do…while 的实现
- 对上图的说明
- 上面的循环是先执行,在判断,因此至少执行一次。
- 当循环条件成立后,就会执行 break, break 就是跳出 for 循环,结束循环.
- 案例演示
使用上面的 do…while 实现完成输出 10 句”hello,ok”
5.7 多重循环控制(重点,难点)
5.7.1基本介绍
- 将一个循环放在另一个循环体内,就形成了嵌套循环。在外边的 for 称为外层循环在里面的 for
循环称为内层循环。【建议一般使用两层,最多不要超过 3 层】 - 实质上,嵌套循环就是把内层循环当成外层循环的循环体。当只有内层循环的循环条件为 false
时,才会完全跳出内层循环,才可结束外层的当次循环,开始下一次的循环。 - 外层循环次数为 m 次,内层为 n 次,则内层循环体实际上需要执行 m*n 次
5.7.2应用案例
- 统计 3 个班成绩情况,每个班有 5 名同学,求出各个班的平均分和所有班级的平均分[学生的成
绩从键盘输入]
编程时两大绝招
(1) 先易后难, 即将一个复杂的问题分解成简单的问题。
(2) 先死后活
代码:
- 统计三个班及格人数,每个班有 5 名同学
对上面的代码进行了一点修改
- 打印金字塔经典案例
使用 for 循环完成下面的案例请编写一个程序,可以接收一个整数,表示层数,打印出金字
- 分析编程思路
- 走代码
- 打印出九九乘法表
代码:
5.8 跳转控制语句-break
5.8.1看一个具体需求,引出 break
随机生成 1-100 的一个数,直到生成了 99 这个数,看看你一共用了几次?
分析:编写一个无限循环的控制,然后不停的随机生成数,当生成了 99 时,就退出这个无限循环
==》break 提示使用
这里我们给大家说一下,如下随机生成 1-100 整数.
5.8.2break 的快速入门案例
5.8.3基本介绍:
break 语句用于终止某个语句块的执行,用于中断当前 for 循环或跳出 switch 语句。
5.8.4基本语法:
{ ……
break ……
}
5.8.5以 for 循环使用 break 为例,画出示意图
5.8.6break 的注意事项和使用细节
- break 语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的是哪一层语句块
- 看一个案例
- 对上面案例的说明
(1) break 默认会跳出最近的 for 循环
(2) break 后面可以指定标签,跳出标签对应的 for 循环
5.8.7课堂练习
- 100 以内的数求和,求出 当和 第一次大于 20 的当前数
- 实现登录验证,有三次机会,如果用户名为”张无忌” ,密码”888”提示登录成功,否则提示
还有几次机会
5.9 跳转控制语句-continue
5.9.1基本介绍:
continue 语句用于结束本次循环,继续执行下一次循环。
continue 语句出现在多层嵌套的循环语句体中时,可以通过标签指明要跳过的是哪一层循环 , 这
个和前面的 break 标签的使用的规则一样. 5.9.2基本语法:
{ ……
continue ……
}
5.9.3continue 流程图
5.9.4案例分析 continue 的使用
5.9.5continu 的课堂练习
- 练习
- continue 实现 打印 1——100 之内的奇数[要求使用 for 循环+continue]
代码:
- 从键盘读入个数不确定的整数,并判断读入的正数和负数的个数,输入为 0 时结束程序
- 课后练习题(同学们课后自己完成):
某人有 100,000 元,每经过一次路口,需要交费,规则如下:
当现金>50000 时,每次交 5%
当现金<=50000 时,每次交 1000
编程计算该人可以经过多少次路口,使用 for break 方式完成
5.10 跳转控制语句-goto
5.10.1 goto 基本介绍
- Go 语言的 goto 语句可以无条件地转移到程序中指定的行。
- goto 语句通常与条件语句配合使用。可用来实现条件转移,跳出循环体等功能。
- 在 Go 程序设计中一般不主张使用 goto 语句, 以免造成程序流程的混乱,使理解和调试程序
都产生困难
5.10.2 goto 基本语法
goto label
… . label: statement
5.10.3 goto 的流程图
5.10.4 快速入门案例
5.11 跳转控制语句-return
5.11.1 介绍:
return 使用在方法或者函数中,表示跳出所在的方法或函数,在讲解函数的时候,会详细的介绍。
说明
- 如果 return 是在普通的函数,则表示跳出该函数,即不再执行函数中 return 后面代码,也可以
理解成终止函数。 - 如果 return 是在 main 函数,表示终止 main 函数,也就是说终止程序