Go第 5 章:程序流程控制

news2024/11/15 21:31:35

第五章程序流程控制

5.1程序流程控制介绍

在程序中,程序运行的流程控制决定程序是如何执行的,是我们必须掌握的,主要有三大流程控 制语句。
1)顺序控制
2)分支控制
3)循环控制


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分支控制的基本介绍
分支控制就是让程序有选择执行。有下面三种形式

  1. 单分支
  2. 双分支
  3. 多分支

5.3.2单分支控制

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

5.3.3双分支控制

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
对双分支的总结

  1. 从上图看 条件表达式就是 age >18
  2. 执行代码块 1 => fmt.Println(“你的年龄大于 18”) …
  3. 执行代码块 2 ===> fmt.Println(“你的年龄不大…”) .
  4. 强调一下 双分支只会执行其中的一个分支。

5.3.5多分支控制

请添加图片描述
对上面基本语法的说明

  1. 多分支的判断流程如下:
  • (1) 先判断条件表达式 1 是否成立,如果为真,就执行代码块 1
  • (2) 如果条件表达式 1 如果为假,就去判断条件表达式 2 是否成立, 如果条件表达式 2 为真, 就执行代码块 2
  • (3) 依次类推.
  • (4) 如果所有的条件表达式不成立,则执行 else 的语句块。
  1. else 不是必须的。
  2. 多分支只能有一个执行入口。

看一个多分支的流程图(更加清晰)
请添加图片描述
案例

岳小鹏参加 Golang 考试,他和父亲岳不群达成承诺:
如果:
成绩为 100 分时,奖励一辆 BMW;
成绩为(80,99]时,奖励一台 iphone7plus;
当成绩为[60,80]时,奖励一个 iPad;
其它时,什么奖励也没有。
请从键盘输入岳小鹏的期末成绩,并加以判断
代码如下:

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

5.3.6嵌套分支

请添加图片描述
请添加图片描述
请添加图片描述


5.4 switch 分支控制

5.4.1基本的介绍

  1. switch 语句用于基于不同条件执行不同动作,每一个 case 分支都是唯一的,从上到下逐一测 试,直到匹配为止。
  2. 匹配项后面也不需要再加 break

5.4.2基本语法

请添加图片描述
请添加图片描述
对上图的说明和总结

  1. switch 的执行的流程是,先执行表达式,得到值,然后和 case 的表达式进行比较,如果相等, 就匹配到,然后执行对应的 case的语句块,然后退出 switch 控制。
  2. 如果 switch 的表达式的值没有和任何的 case 的表达式匹配成功,则执行 default 的语句块。执行后退出 switch 的控制.
  3. golang 的 case 后的表达式可以有多个,使用 逗号 间隔.
  4. golang 中的 case 语句块不需要写 break , 因为默认会有,即在默认情况下,当程序执行完 case 语 句块后,就直接退出该 switch 控制结构。

5.4.4switch 快速入门案例

请添加图片描述

5.4.5switch 的使用的注意事项和细节

  1. case/switch 后是一个表达式( 即:常量值变量一个有返回值的函数等都可以)
    请添加图片描述
  2. case 后的各个表达式的值的数据类型,必须和 switch 的表达式数据类型一致
    请添加图片描述
  3. case 后面可以带多个表达式,使用逗号间隔。比如 case 表达式 1, 表达式 2 …
    请添加图片描述
  4. case 后面的表达式如果是常量值(字面量),则要求不能重复
    请添加图片描述
  5. case 后面不需要带 break , 程序匹配到一个 case 后就会执行对应的代码块,然后退出 switch,如 果一个都匹配不到,则执行 default
  6. default 语句不是必须的.
  7. switch 后也可以不带表达式,类似 if --else 分支来使用。【案例演示】
    请添加图片描述
  8. switch 后也可以直接声明/定义一个变量,分号结束,不推荐。 【案例演示】
    请添加图片描述
  9. switch 穿透-fallthrough ,如果在 case 语句块后增加 fallthrough ,则会继续执行下一个 case,也 叫 switch 穿透
    请添加图片描述
  10. Type Switch:switch 语句还可以被用于 type-switch 来判断某个 interface 变量中实际指向的 变量类型 【还没有学 interface, 先体验一把】
    请添加图片描述

5.4.6switch 的课堂练习

  1. 使用 switch 把小写类型的 char 型转为大写(键盘输入)。只转换 a, b, c, d, e. 其它的输出
    “other”。
    请添加图片描述
  2. 对学生成绩大于 60 分的,输出“合格”。低于 60 分的,输出“不合格”。(注:输入的成绩不 能大于 100)
    请添加图片描述
  3. 根据用户指定月份,打印该月份所属的季节。3,4,5 春季 6,7,8 夏季 9,10,11 秋季 12, 1, 2 冬 季
    请添加图片描述
package main

import "fmt"

func main() {
	var num int = 10
	switch num {
	case 10:
		var month byte
		fmt.Println("imput month")
		fmt.Scanln(&month)

		switch month {
		case 3,4,5:
			fmt.Println("spring")
		case 6,7,8:
			fmt.Println("summer")
		case 9,10,11:
			fmt.Println("autumn")
		case 12,1,2:
			fmt.Println("winter")
		default:
			fmt.Println("error")
		}
		fallthrough
	case 20:
		fmt.Println("ok2")
		fallthrough
	case 30:
		fmt.Println("ok3")
	default:
		fmt.Println("no")

	}

}

5.4.7switch 和 if 的比较

总结了什么情况下使用 switch ,什么情况下使用 if

  1. 如果判断的具体数值不多,而且符合整数、浮点数、字符、字符串这几种类型。建议使用 swtich
    语句,简洁高效。
  2. 其他情况:对区间判断和结果为 bool 类型的判断,使用 if,if 的使用范围更广。

5.5 for 循环控制 5.5.1基本介绍

听其名而知其意。就是让我们的一段代码循环的执行。

5.5.2一个实际的需求

 请大家看个案例 [forTest.go]:
编写一个程序, 可以打印 10 句
“你好,尚硅谷!”。请大家想想怎么做?
 使用传统的方式实现
请添加图片描述
请添加图片描述

5.5.3for 循环的基本语法

请添加图片描述
3) 如果循环条件为真,就执行循环操作 :比如 fmt.Println(“…”)
4) 执行循环变量迭代 , 比如 i++
5) 反复执行 2, 3, 4 步骤,直到 循环条件为 False ,就退出 for 循环。
请添加图片描述
对照代码分析 for 循环的执行过程
请添加图片描述

5.5.5for 循环的使用注意事项和细节讨论

  1. 循环条件是返回一个布尔值的表达式
  2. for 循环的第二种使用方式
    for 循环判断条件 {
    //循环执行语句 } 将变量初始化和变量迭代写到其它位置

请添加图片描述
3) for 循环的第三种使用方式
for {
//循环执行语句 } 上面的写法等价 for ; ; {} 是一个无限循环, 通常需要配合 break语句使用
请添加图片描述
4) Golang 提供 for-range 的方式,可以方便遍历字符串和数组(注: 数组的遍历,我们放到讲数组 的时候再讲解) ,案例说明如何遍历字符串。
请添加图片描述
字符串遍历方式 2-for - range
请添加图片描述
上面代码的细节讨论
如果我们的字符串含有中文,那么传统的遍历字符串方式,就是错误,会出现乱码。原因是传统的 对字符串的遍历是按照字节来遍历,而一个汉字在 utf8 编码是对应 3 个字节。
请添加图片描述
请添加图片描述

5.5.6for 循环的课堂练习

  1. 打印 1~100 之间所有是 9 的倍数的整数的个数及总和

请添加图片描述

  1. 完成下面的表达式输出 ,6 是可变的
package main

import "fmt"

func main () {
	var j int = 6
	for i := 0 ; i < j ; i ++ {
		fmt.Printf("%v + % v = %v \n", i, j-i , j)
	}
}

5.6 while 和 do…while 的实现

Go 语言没有 while 和 do…while 语法,这一点需要同学们注意一下,如果我们需要使用类似其它语 言(比如 java / c 的 while 和 do…while ),可以通过 for 循环来实现其使用效果。

5.6.1while 循环的实现

请添加图片描述
说明上图

  1. for 循环是一个无限循环
  2. break 语句就是跳出 for 循环

 使用上面的 while 实现完成输出 10 句”hello,wrold”请添加图片描述

5.6.2do…while 的实现

对上图的说明

  1. 上面的循环是先执行,在判断,因此至少执行一次。
  2. 当循环条件成立后,就会执行 break, break 就是跳出 for 循环,结束循环.  案例演示
    使用上面的 do…while实现完成输出 10 句”hello,ok”
    请添加图片描述

5.7 多重循环控制(重点,难点)

  1. 将一个循环放在另一个循环体内,就形成了嵌套循环。在外边的 for 称为外层循环在里面的 for 循环称为内层循环。
    【建议一般使用两层,最多不要超过 3 层】
  2. 实质上,嵌套循环就是把内层循环当成外层循环的循环体。当只有内层循环的循环条件为 false 时,才会完全跳出内层循环,才可结束外层的当次循环,开始下一次的循环。
  3. 外层循环次数为 m 次,内层为 n 次,则内层循环体实际上需要执行 m*n 次

5.7.2应用案例

  1. 统计 3 个班成绩情况,每个班有 5 名同学,求出各个班的平均分和所有班级的平均分[学生的成
    绩从键盘输入]
    编程时两大绝招
    (1) 先易后难, 即将一个复杂的问题分解成简单的问题。 (2) 先死后活
    代码:
package main

import (
	"fmt"
)

func main() {

	var score float32 = 0.0
	var count1 int = 5
	//var count2 int = 0
	var sum float32 = 0.0
	var totalsum float32 = 0.0
	for i := 1; i <= 3; i++ {
		for j := 1; j <= 5; j++ {
			fmt.Printf("请输入%v班学生%v的成绩:\n", i, j)
			fmt.Scanln(&score)
			sum += score
		}
		fmt.Printf("%v班的平均分为:%v \n", i, sum/float32(count1))
		totalsum += sum
		sum = 0.0
	}
	fmt.Printf("各个班总成绩为:%v,所有班的平均分为L:%v \n", totalsum, totalsum/float32(count1))
}

  1. 统计三个班及格人数,每个班有 5 名同学
    对上面的代码进行了一点修改.
package main

import (
	"fmt"
)

func main() {
	//var j int = 6
	//for i := 0 ; i < j ; i ++ {
	//	fmt.Printf("%v + % v = %v \n", i, j-i , j)
	//}
	var score float32 = 0.0
	var count1 int = 5
	//var count2 int = 0
	var sum float32 = 0.0
	var totalsum float32 = 0.0
	var passCount int = 0
	for i := 1; i <= 3; i++ {
		for j := 1; j <= 5; j++ {
			fmt.Printf("请输入%v班学生%v的成绩:\n", i, j)
			fmt.Scanln(&score)
			sum += score

			if score > 60 {
				passCount++
			}
		}
		fmt.Printf("%v班的平均分为:%v,及格人数为:%v \n", i, sum/float32(count1), passCount)
		totalsum += sum
		sum = 0.0
		passCount = 0
	}
	fmt.Printf("各个班总成绩为:%v,所有班的平均分为L:%v \n", totalsum, totalsum/float32(count1))
}

  1. 打印金字塔经典案例
    使用 for 循环完成下面的案例请编写一个程序,可以接收一个整数,表示层数,打印出金字
     分析编程思路
    请添加图片描述请添加图片描述

请添加图片描述
4) 打印出九九乘法表
请添加图片描述
请添加图片描述

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 的注意事项和使用细节

  1. break 语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的是哪一层语句块
  2. 看一个案例
    请添加图片描述
  3. 对上面案例的说明
    (1) break 默认会跳出最近的 for 循环
    (2) break 后面可以指定标签,跳出标签对应的 for 循环

5.8.7课堂练习

  1. 100 以内的数求和,求出 当和 第一次大于 20 的当前数
    请添加图片描述
  2. 实现登录验证,有三次机会,如果用户名为”张无忌” ,密码”888”提示登录成功,否则提示 还有几次机会.
    请添加图片描述

5.9 跳转控制语句-continue

5.9.1基本介绍:

continue 语句用于结束本次循环,继续执行下一次循环。 continue 语句出现在多层嵌套的循环语句体中时,可以通过标签指明要跳过的是哪一层循环 ,
这个和前面的 break 标签的使用的规则一样.

5.9.2基本语法:

{ ……
continue ……
}

5.9.3continue 流程图

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

课后练习题(同学们课后自己完成):

某人有 100,000 元,每经过一次路口,需要交费,规则如下:
当现金>50000 时,每次交 5%
当现金<=50000时,每次交 1000
编程计算该人可以经过多少次路口,使用 for break 方式完成

func main() {
   var moneny int = 100000
   count := 0
   for {
   	if moneny > 50000 {
   		moneny = moneny - int(float64(moneny)*0.05)
   		fmt.Println("1", moneny)
   	}
   	if moneny < 50000 {
   		moneny = moneny - 1000
   		fmt.Println("2", moneny)
   	}
   	if moneny < 1000 {
   		break
   	}
   	count++
   }
   fmt.Println(count)
}

5.10 跳转控制语句-goto

5.10.1 goto 基本介绍

  1. Go 语言的 goto 语句可以无条件地转移到程序中指定的行。
  2. goto 语句通常与条件语句配合使用。可用来实现条件转移,跳出循环体等功能。
  3. 在 Go 程序设计中一般不主张使用 goto 语句, 以免造成程序流程的混乱,使理解和调试程序
    都产生困难

5.10.2 goto 基本语法

goto label
… .
label: statement

5.10.3 goto 的流程图

请添加图片描述

5.10.4 快速入门案例

package main

import "fmt"

func main(){
	var n int
	fmt.Println("请输入数字n:")
	fmt.Scanln(&n)
	fmt.Println("ok1")
	if n>20{
		goto label1
	}
	fmt.Println("ok1")
	fmt.Println("ok1")
	fmt.Println("ok1")
	label1:
	fmt.Println("ok1")
	fmt.Println("ok1")
	fmt.Println("ok1")

}

5.11 跳转控制语句-return

5.11.1 介绍:

return 使用在方法或者函数中,表示跳出所在的方法或函数,在讲解函数的时候,会详细的介绍。
请添加图片描述
说明

  1. 如果 return 是在普通的函数,则表示跳出该函数,即不再执行函数中 return 后面代码,也可以 理解成终止函数。
  2. 如果 return 是在 main 函数,表示终止 main 函数,也就是说终止程序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/137015.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++标准库的智能指针:shared_ptr、weak_ptr和unique_ptr

文章目录智能指针shared_ptr模版类week_ptr模版类unique_ptrC中是没有内存回收机制的&#xff0c;我在之前的一篇文章中提到使用指针的一些基本方法。C在std标准库中也提供了三种封装过的指针模版类&#xff0c;称作为智能指针&#xff1a;shared_ptrunique_ptrweek_ptr 我这里…

JVM性能调优详解

前面我们学习了整个JVM系列&#xff0c;最终目标的不仅仅是了解JVM的基础知识&#xff0c;也是为了进行JVM性能调优做准备。这篇文章带领大家学习JVM性能调优的知识。 性能调优 性能调优包含多个层次&#xff0c;比如&#xff1a;架构调优、代码调优、JVM调优、数据库调优、操…

最优二叉树(哈夫曼树)

一、最优二叉树 1、定义 官方定义&#xff1a;在权值为w1&#xff0c;w2&#xff0c;…&#xff0c;wn的 n个叶子所构成的所有二叉树中&#xff0c;带权路径长度最小(即代价最小)的二叉树称为最优二叉树或哈夫曼树。 通俗来讲&#xff0c;就是给定N个权值作为N个叶子结点&…

仿牛客论坛项目总结

一.数据库中每一张表有哪些字段 user表 用户表 &#xff08;1&#xff09;id 用户的id &#xff08;2&#xff09; username 用户名 &#xff08;3&#xff09;password 密码 &#xff08;4&#xff09;salt 盐 &#xff08;5&#xff09;emai邮箱 &#xff08;6&…

PAT甲级1008 Elevator C++/C语言

1008 Elevator 分数 20 作者 CHEN, Yue 单位 浙江大学 The highest building in our city has only one elevator. A request list is made up with N positive numbers. The numbers denote at which floors the elevator will stop, in specified order. It costs 6 seconds …

联邦学习将如何影响您的日常生活?

人工智能 (AI) 被认为是下一次工业革命的最大创新之一&#xff0c;其中包括机器学习。另一方面&#xff0c;随着原油和电力成为现代工业的基础资源&#xff0c;数据成为人工智能和机器学习的关键要素。 数据隐私与需求之间的冲突 训练的数据样本的大小决定了可用于增强 AI 性能…

CPT203-Software Engineering(2)

文章目录5. Scrum Framework5.1 Scrum Roles5.2 Scrum Activities and Artifacts6. Requirements Engineering6.1 User requirements and system requirements6.2 Functional & Non-functional requirements6.2.1 Functional requirements6.2.2 Non-functional requirement…

第一章:C++算法基础之基础算法

系列文章目录 文章目录系列文章目录前言一、排序&#xff08;1&#xff09;快速排序核心思想思路分析模板&#xff08;2&#xff09;归并排序核心思想思路分析模板稳定性时间复杂度二分查找&#xff08;1&#xff09;整数二分核心思想思路分析模板&#xff08;2&#xff09;浮点…

jetson nano系统引导安装(无外设安装方式)

文章目录一.硬件设置二.系统设置一.硬件设置 插入烧写好系统的SD卡将micro USB线接到jetson nano上&#xff0c;另一端USB A接到电脑上为jetson nano插入电源&#xff0c;开机等待电脑检测到如下盘符说明jetson nano连接成功 二.系统设置 进入电脑的设备管理器&#xff0c;查…

【linux】三种权限的使用和更改、粘滞位和yum的使用

目录 1.权限问题 ①什么是权限&#xff1f; ②小问题 ③默认权限 ④如何更改“人”的权限呢&#xff1f; ⑤更改权限的八进制方案 ⑥强制改权限里的“人”&#xff08;权限人文件属性&#xff09; 2.粘滞位 2.yum的使用 1.权限问题 ①什么是权限&#xff1f; 权限人&a…

HTTP协议解析

HTTP概述 HTTP (全称为 "超文本传输协议") 是一种应用非常广泛的应用层协议~~我们平时打开一个网站, 就是通过 HTTP 协议来传输数据的。 HTTP工作过程&#xff1a; 当我们在浏览器中输入一个 "网址"&#xff0c;此时浏览器就会给对应的服务器发送一个 H…

CTF中的PHP特性函数(上)

前言 对于PHP大家一定不陌生&#xff0c;但你知道PHP在CTF中是如何考察的吗&#xff0c;本文给大家带来的是通过PHP特性来进行CTF比赛中解题出题的知识&#xff0c;会介绍一下CTF中常见的php特性以及围绕该知识点的相关案例&#xff0c;因为内容过多这里分成上中下三篇来讲&am…

操作系统的特征

文章目录&#x1f380;前言&#xff1a;本篇博客知识总览&#x1f354;并发&#x1f387;概念&#xff1a;&#x1f354;共享&#x1f387;概念&#xff1a;&#x1f354;虚拟&#x1f387;概念&#xff1a;&#x1f354;异步&#x1f387;概念&#xff1a;&#x1f3f3;️‍&a…

ThinkPHP 多应用模式之Api路由分组+中间件

ThinkPHP 6.1 在多应用模式下实现API路由分组中间件验证业务 目录 1.创建中间件文件 2.迁移中间件到子应用目录中 3.编辑中间件验证业务 修改命名空间 编写handle处理代码 4.注册中间件 编辑中间件文件 TP内置中间件 5.设置路由分组 优化相同控制器前缀 最终效果&am…

【信息论与编码 沈连丰】第六章:连续信息和连续信道

【信息论与编码 沈连丰】第六章&#xff1a;连续信息和连续信道第六章 连续信息和连续信道6.1 连续消息的信息6.2 连续消息在信道上的传输问题6.3 香农信道容量公式6.4 连续消息的识别和理想接收机6.5 连续信源的数字处理及其编码第六章 连续信息和连续信道 6.1 连续消息的信息…

在 KubeSphere 上部署 OpenLDAP 并进行对接使用

在 KubeSphere 上部署 OpenLDAP 并进行对接-进阶背景前置条件KubeSphere 中部署 LDAP部署 LDAP 应用ApacheDirectoryStudio 验证 LDAP下载部署 ApacheDirectoryStudioApacheDirectoryStudio 测试 LDAP创建 Ldap Search &#xff0c;KS 对接时可选择使用KubeSphere 对接 LDAPHar…

【区块链 | EVM】深入理解学习EVM - 深入Solidity数据存储位置:内存

图片来源: Mech Mind on Unsplash 这是深入Solidity数据存储位置系列的另一篇。在今天的文章中,我们将学习EVM内存的布局,它的保留空间,空闲内存指针,如何使用memory引用来读写内存,以及使用内存时的常规最佳做法。 我们将使用 Ethereum Name Service (ENS)中的合约代码…

实模式和保护模式的区别

实模式和保护模式的区别 实模式和保护模式的来历 最早期的8086 CPU只有一种工作方式 ---- 实模式。数据总线为16位&#xff0c;地址总线为20位。实模式下所有寄存器都是16位。 从80286开始就有了保护模式&#xff0c;从80386开始CPU数据总线和地址总线均为32位&#xff0c;而且…

开发板测试手册——SPI FLASH 读写、USB WIFI 模块(2)

目录 1.8 SPI FLASH 读写测试 20 1.9 USB 接口读写测试 21 1.10 网络接口测试 23 1.10.1 网络连通测试 23 1.10.2 网络速度测试 25 2 网络静态 IP 设置 27 3 USB WIFI 模块测试 31 3.1 WIFI STA 功能测试 32 3.2 WIFI AP 功能测试 35 3.3 USB WIFI 驱动编译 39 前 言…

scikit-learn线性模型之线性回归

scikit-learn线性模型之线性回归线性回归参考文献线性回归 有监督学习中主要解决两个问题&#xff0c;一个是分类&#xff0c;另一个是回归。 在回归问题中&#xff0c;我们需要利用我们已知的特征 x1,x2,...,xpx_1,x_2,...,x_px1​,x2​,...,xp​ 去预测我们的目标变量 yyy 。…