写点什么

【一 Go 到底】第十一天 --- 流程控制

作者:指剑
  • 2022 年 10 月 11 日
    重庆
  • 本文字数:2891 字

    阅读完需:约 9 分钟

【一Go到底】第十一天---流程控制

一、控制语句分类

  1. 顺序控制

  2. 分支控制

  3. 循环控制

二、顺序控制

程序从上到下逐行执行,中间无判断和跳转


package main
import "fmt"
func main() { // 顺序执行 var a int = 100 var b int = 200 a, b = b, a fmt.Printf("a = %v, b = %v\n", a, b)
safe := true fmt.Println("safe : ", safe)}
复制代码

三、分支控制(if-else)

让程序有选择的执行,有如下三种:


  1. 单分支

  2. 双分支

  3. 多分支

3.1 单分支

基本语法


// 当条件表达式为 true 时,运行 代码块if 条件表达式{    代码块}
复制代码


{} 不能省略


案例


定义年龄变量age ,从用户输入存储到变量age中,如果年龄大于 18 则提示:你已经是成年人了


package main
import "fmt"
func main() {
// 定义年龄 var age int fmt.Printf("请输入您的年龄:") fmt.Scanln(&age)
if age >= 18 { fmt.Println("您已经是个成年人了") }}
复制代码

3.2 双分支

基本语法


当条件表达式成立时,执行 代码块1,否则执行代码块2


if 条件表达式{    代码块1}else{    代码块2}
复制代码


{} 不能省略

3.2.1 案例 1

取最大数


package main
import "fmt"
func main() {
var a int = 10 var b int = 20 var max int if a > b { max = a } else { // else不能换行,必须跟在 } 后面 max = b } fmt.Println("max = ", max)}
复制代码

3.2.2 案例 2

编写程序,声明 2 个 float64 型变量并赋值。判断第一个数大于 10.0,且第 2 个数小于 20.0,打印两数之和。


package main
import "fmt"
func main() {
// 编写程序,声明2个float64型变量并赋值。判断第一个数大于10.0,且第2个数小于20.0,打印两数之和 var a, b float64 fmt.Printf("请输入a的值:") fmt.Scanln(&a) fmt.Printf("请输入b的值:") fmt.Scanln(&b) if a > 10.0 && b < 20.0 { fmt.Println(a + b) }
复制代码

3.2.3 案例 3

定义两个变量 int32,判断二者的和,是否能被 3 又能被 5 整除,打印提示信息


package main
import "fmt"
func main() {
// 定义两个变量int32,判断二者的和,是否能被3又能被5整除,打印提示信息 var m, n int32 fmt.Printf("请输入m的值:") fmt.Scanln(&m) fmt.Printf("请输入n的值:") fmt.Scanln(&n)
if (m+n)%3 == 0 && (m+n)%5 == 0 { fmt.Printf("%v 可以被3和5整除", m+n) } else { fmt.Printf("%v 不能同时被3和5整除", m+n) }
复制代码

3.2.4 案例 4

判断一个年份是否是闰年,闰年的条件是符合下面二者之一: (1)年份能被 4 整除,但不能被 100 整除; (2)能被 400 整除


package main
import "fmt"
func main() { // 判断一个年份是否是闰年,闰年的条件是符合下面二者之一: (1)年份能被4整除,但不能被100整除; (2)能被400整除 var years int fmt.Printf("请输入年份:") fmt.Scanln(&years) if (years%4 == 0 && years%100 != 0) || years%400 == 0 { fmt.Printf("%v 是闰年", years) } else { fmt.Printf("%v 不是闰年", years) }}
复制代码

3.3 多分支

基本语法


if 条件表达式1{    代码块1}else if 条件表达式2{    代码块2}.....}else{    代码块n}
复制代码


{} 不能省略


else 可以没有


执行流程


  1. 判断 条件表达式1 是否成立,如果成立,执行代码块1

  2. 如果 条件表达式1 不成立,那么判断 条件表达式2 执行 代码块2

  3. 依次向下,如果都不满足则执行 else(若存在 else) 中的 代码块

3.3.1 案例一

定义一个成绩变量score,接收用户输入,判断用户成绩并打印


package main
import "fmt"
func main() {
// 按照成绩划分等级 var score int fmt.Printf("请输入您的成绩:") fmt.Scanln(&score) if score >= 90 { fmt.Println("您的成绩等级为: A") } else if score >= 80 && score < 90 { fmt.Println("您的成绩等级为: B") } else if score >= 70 && score < 80 { fmt.Println("您的成绩等级为: C") } else if score >= 60 && score < 70 { fmt.Println("您的成绩等级为: D") } else { fmt.Println("很抱歉,您没有及格!") }}
复制代码

3.3.2 案例二

求 ax²+bx+c=0 方程的根。a,b,c 分别为函数的参数,如果: b²-4ac>0,则有两个解;b²-4ac=0,则有一个解; b²-4ac<0, 则无解;


求根公式(-b±sqrt(b²-4ac))/2*a


a=2,b=4,c=2


package main
import ( "fmt" "math")
func main() { //求ax2+bx+c=0方程的根。a,b,c分别为函数的参数,如果: b2-4ac>0,则有两个解;b2-4ac=0,则有一个解; b2-4ac<0, 则无解; var a, b, c float64 = 2.0, 4.0, 2.0 // 定义 b²-4ac 的值 var i = b*b - 4*a*c if i > 0 { x1 := (-b + math.Sqrt(i)) / 2 * a x2 := (-b - math.Sqrt(i)) / 2 * a fmt.Printf("该方程的根为x1=%v, x2=%v", x1, x2) } else if i == 0 { x := (-b + math.Sqrt(i)) / 2 * a fmt.Println("该方程的解为:", x) } else { fmt.Println("该方程无解!") }}
复制代码

3.4 嵌套分支

在一个分支结构中又完整的嵌套了另一个完整的分支结构,里面的分支的结构称为内层分支外面的分支结构称为外层分支。


基本语法


if 条件表达式out{    if 条件表达式in{    ....    }else{    }}
复制代码


{} 不能省略


建议嵌套控制在三层内(含三层)

3.4.1 案例一

参加百米运动会,如果用时 8 秒以内进入决赛,否则提示淘汰。并且根据性别提示进入男子组或女子组


package main
import ( "fmt")
func main() {
// 参加百米运动会,如果用时8秒以内进入决赛,否则提示淘汰。并且根据性别提示进入男子组或女子组 var time float32 var gender string fmt.Printf("请输入您的百米用时(s): ") fmt.Scanln(&time) fmt.Printf("请输入您的性别(male/female): ") fmt.Scanln(&gender)
if time < 8 { if gender == "male" { fmt.Printf("您的百秒用时为 %v s,进入 男子组\n", time) } else if gender == "female" { fmt.Printf("您的百秒用时为 %v s,进入 女子组", time) } } else { fmt.Println("您已被淘汰") }}
复制代码

3.4.2 案例 2

根据淡旺季打印出购票票价


4(含)-10月(含)旺季


  • 成人票 60

  • 儿童票 半价

  • 老年票 1/3


淡季


  • 成人票 40

  • 其他票 20


package main
import ( "fmt")
func main() {

// 淡旺季购票 var age byte var price float32 = 60 var month byte
fmt.Printf("请输入您的年龄:") fmt.Scanln(&age) fmt.Printf("请输入您的购票月份:") fmt.Scanln(&month)
if month >= 4 && month <= 10 { if age < 18 { price *= 0.5 fmt.Printf("%v 月, 年龄为: %v ,票价为: %v", month, age, price/2) } else if age >= 60 { fmt.Printf("%v 月, 年龄为: %v ,票价为: %v", month, age, price/3) } else { fmt.Printf("%v 月, 年龄为: %v ,票价为: %v", month, age, price) } } else if month == 0 { fmt.Println("您的购票月份错误,请重新购买") } else { if age >= 18 && age < 60 { fmt.Printf("%v 月, 年龄为: %v ,票价为: %v", month, age, 40) } else { fmt.Printf("%v 月, 年龄为: %v ,票价为: %v", month, age, 20) } }
}
复制代码


发布于: 刚刚阅读数: 3
用户头像

指剑

关注

InfoQ签约作者 2022.07.13 加入

AWS Community Builder,AWS Student Ambassador,阿里云专家博主,OPS社区创始成员

评论

发布
暂无评论
【一Go到底】第十一天---流程控制_Go_指剑_InfoQ写作社区