在程序中,程序运行的流程控制决定程序是如何执行的,主要有三大流程控制:
1).顺序控制
程序从上到下逐行执行,中间没有任何判断和跳转
2).分支控制
让程序有选择的执行
(1).单分支
(2).双分支
(3).多分支
(4).嵌套分支
3).循环控制
让代码可以循环的执行
(1).for循环
(2).多重循环
下面从分支控制讲解
分支控制if-else
(1).单分支
(2).双分支
(3).多分支
(4).嵌套分支
1.单分支
//基本语法
if 条件表达式 {
执行代码块
}
//说明:当条件表达式为true时,执行{}中的代码
//注意:{}必须有,就算只写一行代码
细节说明:
go的if有一个强大的地方就是条件判断语句里面允许声明一个变量,这个变量的作用域只能在该条件逻辑块中,其他地方不起作用
//go支持在if中,直接定义一个变量,如下
if age := 20; age > 18 {
fmt.Println("你年龄大于18,应该为自己的行为负责~")
}
2.双分支
//基本语法
if 条件表达式 {
执行代码块1
} else {
执行代码块2
}
//说明:当条件表达式成立时,执行代码块1中的代码,否则执行代码块2中的代码. {}也是必须有的
//编写一个程序:输入人的年龄,如果年龄大于18,则输出"你年龄大于18,该为自己的行为负责".否则输出"你的年龄小于18,只对你进行口头教育"
package main
import (
"fmt"
)
func main() {
var age byte
fmt.Println("请输入你的年龄:")
fmt.Scanln(&age)
if age > 18 {
fmt.Println("你年龄大于18,该为自己的行为负责")
} else {
fmt.Println("你的年龄小于18,只对你进行口头教育")
}
}
//练习1
var x int = 4
if x > 2 {
frm.Pringln("ok)
}
else {
fmt.Prinrtln("hello")
}
//编程错误: else 不能换行
//练习2
var x int = 4
if x > 2 {
frm.Pringln("ok)
} else {
fmt.Prinrtln("hello")
}
//正确,输出"ok"
//练习3
var x int = 4
if (x > 2) {
frm.Pringln("ok)
} else {
fmt.Prinrtln("hello")
}
//正确,输出"ok"; 虽然正确,但要求一般把if (x > 2) { 写成 if x > 2 {
//声明两个int32的变量并赋值,判断两数之和,如果大于50,输出hello workd,否则输出ou!
var num1 int32
var num2 int32
fmt.Println("请输入两个变量,以空格区分:")
fmt.Scanf("%d %d", &num1, &num2)
var sum int32
sum = num1 + num2
if sum > 50 {
fmt.Println("hello workd")
} else {
fmt.Println("ou!")
}
//声明两个float64的变量并赋值,判断第一个数大于10.0并且第二个数小于20.0,打印两数之和
var f1 float64
var f2 float64
fmt.Println("请输入两个变量,以空格区分:")
fmt.Scanf("%f %f", &f1, &f2)
if f1 > 10.0 && f2 < 20.0{
fmt.Println("f1 + f2 =", f1 + f2)
}
//判断一个年份是否是闰年,闰年的条件是符合下面条件之一:(1).年份能被4整除,但不能被100整除. (2)能被400整除
var year int = 2000
if (year % 4 == 0 && year 5 100 != 0) || year % 400 == 0 {
fmt.Println(year,"是闰年")
}
3.多分支
//基本语法
if 条件表达式 {
执行语句1
} else if {
执行语句2
}
...
else {
执行语句...
}
//案例:小明参加考试,和父亲达成协议,如果:
//成绩为100分,奖励一部手机
//成绩为80~99,奖励一部游戏机
//成绩为60~80,奖励一支钢笔
//成绩小于60,什么都没有
//请从键盘输入小明成绩,并加以判断
package main
import "fmt"
func main() {
var score int
fmt.Println("请输入成绩:")
fmt.Scanln(&score)
//多分支判断
if score == 100 {
fmt.Println("奖励一部手机")
} else if score > 80 && score <= 99 {
fmt.Println("奖励一部游戏机")
} else if score > 60 && score <=80 {
fmt.Println("奖励一支钢笔")
} else {
fmt.Println("什么都没有")
}
//使用陷阱: 只会输出ok1
var n int = 20
if n > 9 {
fmt.Println("ok1") //输出ok1
} else if n > 6 {
fmt.Println("ok2")
} else if n > 3{
fmt.Println("ok3")
} else {
fmt.Println("ok4")
}
}
package main
import "fmt"
func main() {
var b bool = true
if b == false {
fmt.Println("a")
} else if b {
fmt.Println("b")
} else if !b {
fmt.Println("c")
} else {
fmt.Println("d")
}
}
//上面的代码输出结果为:b
//思考:如果把b == false 换成 b = false,能编译通过吗?如果能,结果是多少?
//答案:把b == false 换成 b = false,会发生编译错误,因为if的条件表达式不能是赋值语句
package main
import (
"fmt"
"math"
)
func main() {
//求a * x^2 + b * x + c = 0方程的根,a,b,c分别为函数的参数,
//如果b^2 - 4 * a *c > 0,则有两个根
//如果b^2 - 4 * a *c = 0,则有一个根
//如果b^2 - 4 * a *c < 0,则无根
var a float64
var b float64
var c float64
fmt.Println("请输入三个数a,b,c,求其a * x^2 + b * x + c = 0的解:")
fmt.Println("请输入a:")
fmt.Scanln(&a)
fmt.Println("请输入b:")
fmt.Scanln(&b)
fmt.Println("请输入c:")
fmt.Scanln(&c)
m := b * b - 4 * a * c
if m > 0 {
fmt.Println("有两个根:")
var x1 = (-b + math.Sqrt(m)) / 2 * a
fmt.Println("x1=", x1)
var x2 = (-b - math.Sqrt(m)) / 2 * a
fmt.Println("x2=", x2)
} else if m == 0 {
fmt.Println("有一个根:")
var x1 = (-b + math.Sqrt(m)) / 2 * a
fmt.Println("x1=", x1)
} else {
fmt.Println("无解")
}
}
4.嵌套分支
在一个分支结构中完整的嵌套了另一个完整的分支结构,里面的分支的结构称为内层分支,外面的分支称为外层分支
//基本语法
if 条件表达式 {
if 条件表达式 {
执行代码块1
} else {
执行代码块2
}
}
//注意:嵌套分支不宜过多,建议控制在3层内
//案例
//出票系统:根据淡旺季的月份和年龄,打印票价
//4~10 旺季
// 成人(18~60) : 60元
// 儿童(<18) : 半价
// 老人(>60) : 1/3
//淡季
// 成人:40元
// 其他:20元
var mouth byte
var age byte
var price float64 = 100
fmt.Println("请输入月份,年龄,以空格隔开:")
fmt.Scanf("%d %d", &mouth, &age)
if mouth >= 4 && mouth < 10 {
if age >= 60 {
fmt.Printf("%v 月份年龄在%v的游客票价为 %v", mouth, age, price / 3)
} else if age >= 18 {
fmt.Printf("%v 月份年龄在%v的游客票价为 %v", mouth, age, price)
} else {
fmt.Printf("%v 月份年龄在%v的游客票价为 %v", mouth, age, price)
}
} else {
if age >= 18 {
fmt.Printf("%v 月份年龄在%v的成人游客票价为 %v", mouth, age, price)
} else {
fmt.Printf("%v 月份年龄在%v的未成年游客票价为 %v", mouth, age, price / 2)
}
}
/**
*参加百米运动会,如果用时8秒以内进入决赛,否则淘汰,并根据性别提示进入男子组还是女子组,输入成绩和性
*别,进行判断
*/
//1.定义一个变量,来接收跑步使用的秒速,float64
//2.定义一个变量,来接收性别,string
//3.因为判断是嵌套的判断,所以使用嵌套分支
var score float64
fmt.Println("请输入跑步的成绩:")
fmt.Scanln(&score)
if score >= 8 {
var sex string
fmt.Println("请输入性别 :")
fmt.Scanln(&sex)
if sex == "男" {
fmt.Println("男子组")
} else if sex == "女" {
fmt.Println("女子组")
}
} else {
fmt.Println("out...")
}