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

109 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情

一、控制语句分类

  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)
		}
	}

}