Scala第四章节(分支结构的格式和用法、for循环和while循环、控制跳转语句以及循环案例)

Scala第四章节

章节目标

  1. 掌握分支结构的格式和用法
  2. 掌握for循环和while循环的格式和用法
  3. 掌握控制跳转语句的用法
  4. 掌握循环案例
  5. 理解do.while循环的格式和用法

1. 流程控制结构

1.1 概述

在实际开发中, 我们要编写成千上万行代码, 代码的顺序不同, 执行结果肯定也会受到一些影响, 并且有些代码是满足特定条件才能执行的, 有些代码是要重复执行的. 那如何合理规划这些代码呢? 这就需要用到: 流程控制结构了.

1.2 分类
  • 顺序结构

  • 选择(分支)结构

  • 循环结构

    注意: Scala和Java中的流程控制结构是基本一致的.

2. 顺序结构

2.1 概述

顺序结构是指: 程序是按照从上至下, 从左至右的顺序, 依次逐行执行的, 中间没有任何判断和跳转.

如图:

在这里插入图片描述

注意: 顺序结构是Scala代码的默认流程控制结构.

2.2 代码演示
val a = 10
println("a: " + a)	//打印结果为10println("键盘敲烂, ")
println("月薪过万! ")
2.3 思考题

下边这行代码的打印结果应该是什么呢?

println(10 + 10 + "Hello,Scala" + 10 + 10)

提示: 代码是按照从上至下, 从左至右的顺序, 依次逐行执行的.

3. 选择结构(if语句)

3.1 概述

选择结构是指: 某些代码的执行需要依赖于特定的判断条件, 如果判断条件成立, 则代码执行, 否则, 代码不执行.

3.2 分类
  • 单分支
  • 双分支
  • 多分支
3.3 单分支

所谓的单分支是指: 只有一个判断条件的if语句.

3.3.1 格式
if(关系表达式) {//具体的代码
}

注意: 关系表达式不管简单还是复杂, 结果必须是Boolean类型的值.

3.3.2 执行流程
  1. 先执行关系表达式, 看其结果是true还是false.

  2. 如果是true, 则执行具体的代码, 否则, 不执行.

  3. 如图:

在这里插入图片描述

3.3.3 示例

**需求: **

​ 定义一个变量记录某个学生的成绩, 如果成绩大于或者等于60分, 则打印: 分数及格.

参考代码

//定义变量, 记录成绩
val score = 61
//判断成绩是否不小于60分
if(score >= 60) {println("成绩及格")
}
3.4 双分支

所谓的双分支是指: 只有两个判断条件的if语句.

3.4.1 格式
if(关系表达式) {//代码1
} else {//代码2
}
3.4.2 执行流程
  1. 先执行关系表达式, 看其结果是true还是false.
  2. 如果是true, 则执行代码1. 如果是false, 则执行代码2.
  3. 如图:
    在这里插入图片描述
3.4.3 示例

**需求: **

​ 定义一个变量记录某个学生的成绩, 如果成绩大于或者等于60分, 则打印: 分数及格, 否则打印分数不及格.

参考代码

//定义变量, 记录成绩
val score = 61
//判断成绩是否不小于60分
if(score >= 60) {println("成绩及格")
} else {println("成绩不及格")
}
3.5 多分支

所谓的多分支是指: 有多个判断条件的if语句.

3.5.1 格式
if(关系表达式1) {//代码1
} else if(关系表达式2) {//代码2
}else if(关系表达式n) {	//else if可以有多组//代码n
} else {//代码n+1			  //所有的关系表达式都不成立的时候, 执行这里的代码.
}
3.5.2 执行流程
  1. 先执行关系表达式1, 看其结果是true还是false.
  2. 如果是true, 则执行代码1, 分支语句结束. 如果是false, 则执行关系表达式2, 看其结果是true还是false.
  3. 如果是true, 则执行代码2. 分支语句结束. 如果是false, 则执行关系表达式3, 看其结果是true还是false.
  4. 以此类推, 直到所有的关系表达式都不满足, 执行最后一个else中的代码.
  5. 如图:
    在这里插入图片描述
3.5.3 示例

**需求: **

​ 定义一个变量记录某个学生的成绩, 根据成绩发放对应的奖励, 奖励机制如下:

​ [90, 100] -> VR设备一套

​ [80, 90) -> 考试卷一套

​ [0, 80) -> 组合拳一套

​ 其他 -> 成绩无效

参考代码

//定义变量, 记录成绩
val score = 80
//根据成绩发放对应的奖励
if(score >= 90 && score <= 100) {println("VR设备一套")
} else if(score >= 80 && score < 90) {println("考试卷一套")
} else if(score >= 0 && score < 80) {println("组合拳一套")
} else {println("成绩无效")
}
3.6 注意事项

if语句在使用时, 要注意的事项有以下三点:

  1. 和Java一样, 在Scala中, 如果大括号{}内的逻辑代码只有一行, 则大括号可以省略.
  2. 在scala中,条件表达式也是有返回值的
  3. 在scala中,没有三元表达式,可以使用if表达式替代三元表达式

示例

定义一个变量sex,再定义一个result变量,如果sex等于"male",result等于1,否则result等于0

参考代码

//定义变量, 表示性别
val sex = "male"
//定义变量, 记录if语句的返回值结果
val result = if(sex == "male") 1 else 0
//打印结果为 result: 1
println("result: " + result)
3.7 嵌套分支

有些时候, 我们会涉及到"组合判断", 即一个分支结构中又嵌套了另一个分支结构, 这种写法就叫嵌套分支. 里边的那个分支结构叫: 内层分支, 外边的那个分支结构叫: 外层分支.

示例

定义三个变量a,b,c, 初始化值分别为: 10, 20, 30, 通过if分支语句, 获取其中的最大值.

思路分析

  1. 定义三个变量a, b, c, 分别记录要进行操作的值.
  2. 定义变量max, 用来记录获取到的最大值.
  3. 先判断a是否大于或者等于b.
  4. 条件成立, 说明 a大(或者等于b), 接着比较a和c的值, 获取最大值, 并将结果赋值给变量max
  5. 条件不成立, 说明 b大, 接着比较b和c的值, 获取最大值, 并将结果赋值给变量max
  6. 此时, max记录的就是a, b, c这三个变量的最大值, 打印即可.

参考代码

//1. 定义三个变量a, b, c, 分别记录要进行操作的值.
val a = 10
val b = 20
val c = 30
//2. 定义变量max, 用来记录获取到的最大值.
var max = 0
//3. 先判断a是否大于或者等于b.
if(a >= b) {//4. 走这里说明a大(或者等于b), 接着比较a和c的值max = if(a >= c) a else c
} else {//5.  走这里说明b大, 接着比较b和c的值max = if(b >= c) b else c
}
//6. 打印max的值
println("max: " + max)

注意: 嵌套一般不超过3层.

3.8 扩展: 块表达式
  • scala中,使用{}表示一个块表达式
  • 和if表达式一样,块表达式也是有值的
  • 值就是最后一个表达式的值

问题

请问以下代码,变量a的值是什么?

val a = {println("1 + 1")1 + 1
}
println("a: " + a)

4. 循环结构

4.1 概述

循环,指的是事物周而复始的变化。而Scala中的循环结构,是指: 使一部分代码按照次数或一定的条件反复执行的一种代码结构。例如: 打印10次"Hello, Scala!", 如果纯写输出语句, 需要写10次, 而通过循环来实现的话, 输出语句只需要写1次, 这样就变得很简单了.

4.2 分类
  • for循环
  • while循环
  • do.while循环

注意: 这三种循环推荐使用for循环, 因为它的语法更简洁, 更优雅.

4.3 for循环

在Scala中, for的格式和用法和Java中有些差异, Scala中的for表达式功能更加强大.

4.3.1 格式
for(i <- 表达式/数组/集合) {//逻辑代码
}

注意: 执行流程和Java一致

4.3.2 简单循环

**需求: **

​ 打印10次"Hello, Scala!"

**参考代码: **

//定义一个变量, 记录1到10的数字
val nums = 1 to 10	//to是Scala中的一个关键字
//通过for循环, 打印指定的内容
for(i <- nums) {println("Hello, Scala! " + i)
}

**上述代码可以简写成: **

for(i <- 1 to 10) println("Hello, Scala! " + i)
4.3.3 嵌套循环

**需求: **使用for表达式,打印以下字符, 每次只能输出一个"*"

*****
*****
*****

步骤

  1. 使用for表达式打印3行,5列星星
  2. 每打印5个星星,换行

参考代码

//写法一: 普通写法
for(i <- 1 to 3) {		//外循环控制行数for(j <- 1 to 5) {	//内循环控制列数print("*")		//每次打印一个*}println()			//打印完一行(5个*)之后, 记得换行
}//写法二: 压缩版
for(i <- 1 to 3) {		//这是两行代码for(j <- 1 to 5) if(j == 5) println("*") else print("*")
}//写法三: 合并版
for(i <- 1 to 3; j <- 1 to 5) if(j == 5) println("*") else print("*")
4.3.4 守卫

for表达式中,可以添加if判断语句,这个if判断就称之为守卫。我们可以使用守卫让for表达式更简洁。

语法

for(i <- 表达式/数组/集合 if 表达式) {//逻辑代码
}

示例

使用for表达式打印1-10之间能够整除3的数字

参考代码

// 添加守卫,打印能够整除3的数字
for(i <- 1 to 10 if i % 3 == 0) println(i)
4.4.5 for推导式

Scala中的for循环也是有返回值的, 在for循环体中,可以使用yield表达式构建出一个集合(可以简单理解为: 就是一组数据),我们把使用yield的for表达式称之为推导式.

示例

生成一个10、20、30…100的集合

参考代码

// for推导式:for表达式中以yield开始,该for表达式会构建出一个集合
val v = for(i <- 1 to 10) yield i * 10
println(v)
4.4 while循环

scala中while循环和Java中是一致的, 所以学起来非常简单.

4.4.1 格式
初始化条件
while(判断条件) {//循环体//控制条件
}
4.4.2 执行流程
  1. 执行初始化条件.
  2. 执行判断条件, 看其结果是true还是false.
  3. 如果是false则循环结束.
  4. 如果是true则执行循环体.
  5. 执行控制条件.
  6. 返回第二步, 重复执行.
4.4.3 示例

**需求: **

​ 打印1-10的数字

参考代码

//初始化条件
var i = 1
//判断条件
while(i <= 10) {//循环体println(i)//控制条件i = i + 1
}
4.5 do.while循环

scala中do.while循环和Java中是一致的, 所以学起来非常简单.

4.4.1 格式
初始化条件
do{//循环体//控制条件
}while(判断条件) 
4.4.2 执行流程
  1. 执行初始化条件.
  2. 执行循环体.
  3. 执行控制条件.
  4. 执行判断条件, 看其结果是true还是false.
  5. 如果是false则循环结束.
  6. 如果是true则返回第2步继续执行.

注意:

  1. do.while循环不管判断条件是否成立, 循环体都会执行一次.
  2. for循环, while循环都是如果判断条件不成立, 则循环体不执行.
4.4.3 示例

**需求: **

​ 打印1-10的数字

参考代码

//初始化条件
var i = 1
do{//循环体println(i)//控制条件i = i + 1
}while(i <= 10)	//判断条件
4.6 break和continue
  • 在scala中,类似Java和C++的break/continue关键字被移除了
  • 如果一定要使用break/continue,就需要使用scala.util.control包下的Breaks类的breablebreak方法。
4.6.1 实现break

用法

  1. 导包.

    import scala.util.control.Breaks._

  2. 使用breakable将for表达式包起来

  3. for表达式中需要退出循环的地方,添加break()方法调用

示例

使用for表达式打印1-10的数字,如果遇到数字5,则退出for表达式

参考代码

// 导入scala.util.control包下的Break
import scala.util.control.Breaks._breakable{for(i <- 1 to 10) {if(i == 5) break() else println(i)}
}
4.6.2 实现continue

用法

continue的实现与break类似,但有一点不同:

注意:

  1. 实现break是用breakable{}将整个for表达式包起来.
  2. 而实现continue是用breakable{}将for表达式的循环体包含起来就可以了.

示例

用for表达式打印1~10之间, 所有不能整除3的数字.

// 导入scala.util.control包下的Break    
import scala.util.control.Breaks._for(i <- 1 to 100 ) {breakable{if(i % 3 == 0) break()else println(i)}
}

5. 综合案例

5.1 九九乘法表

**需求: **

打印九九乘法表, 如下图:
在这里插入图片描述

步骤

  1. 通过外循环控制打印的行数.

  2. 通过内循环控制每行打印的列数.

    注意: 因为列数是随着行数递增的, 即:

    行数该行的总列数
    11
    22
    33
    nn

    结论: 如果用i表示行数, 那么该行的列数取值范围为: [1, i]

参考代码

  • 方式一: 普通写法
//外循环控制行
for(i <- 1 to 9) {		//内循环控制列for(j <- 1 to i) {print(s"${i} * ${j} = ${i * j}\t")}println()			//别忘了换行
}
  • 方式二: 合并版写法
//外循环控制行
for(i <- 1 to 9; j <- 1 to i) {		print(s"${i} * ${j} = ${i * j}\t")if(j == i) println()	//别忘了换行
}
5.2 模拟登陆

**需求: **

老王要登陆黑马官网学习Scala, 假设老王的账号和密码分别为"itcast", “heima”, 且同一账号只有3次登陆机会, 如果3次都录入错误, 则提示账号被锁定. 请用所学模拟该场景.

步骤

  1. 导包
    • scala.io.StdIn
    • scala.util.control.Breaks._
  2. 定义变量, 记录用户录入的账号和密码.
  3. 因为涉及到break的动作, 所以要用breakable{}把整个for表达式包裹起来
  4. 因为只有3次登陆机会, 所以推荐使用for循环.
  5. 提示用户录入他/她的账号和密码, 并接收.
  6. 判断用户录入的账号和密码是否正确.
  7. 如果录入正确, 则提示"登陆成功, 开始学习Scala!", 循环结束.
  8. 如果录入错误, 则判断是否还有登陆机会
    • 有, 则提示"用户名或者密码错误, 您还有*次机会", 然后返回第5步继续执行.
    • 没有, 则提示"账号被锁定, 请与管理员联系", 循环结束.

参考代码

//1. 导包
import scala.io.StdIn
import scala.util.control.Breaks._//2. 定义变量, 记录用户录入的账号和密码
var username = ""
var password = ""
//3. 因为涉及到break的动作, 所以要用breakable{}把整个for表达式包裹起来
breakable {//4. 因为只有3次登陆机会, 所以推荐使用for循环.for(i <- 1 to 3) {//5. 提示用户录入他/她的账号和密码, 并接收.println("请录入您的账号: ")username = StdIn.readLine()println("请录入您的密码: ")password = StdIn.readLine()//6. 判断用户录入的账号和密码是否正确.if(username == "itcast" && password == "heima") {//7. 走到这里, 说明登陆成功, 循环结束.println("登陆成功, 开始学习Scala吧!")break()} else {//8. 走到这里, 说明登陆失败. 则判断是否还有登陆机会if(i == 3) println("账号被锁定, 请与管理员联系!") else println(s"用户名或者密码错误, 您还有${3 - i}次机会")}}  
}

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

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

相关文章

2.26回顾章节主体线索脉络,课程要求(评分)

3)翻译程序、汇编程序、编译程序、解释程序有什么差别&#xff1f;各自的特性是什么&#xff1f; 翻译程序是指把高级语言源程序翻译成机器语言程序&#xff08;目标代码&#xff09;的软件。 翻译程序有两种&#xff1a;一种是编译程序&#xff0c;它将高级语言源程序一次全部…

紫色星空月亮404网页模板源码

紫色星空月亮404网页模板源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面 源码下载 紫色星空月亮404网页模板源码

zookeeper快速入门二:zookeeper基本概念

本文是zookeeper系列之快速入门中的第二篇&#xff0c;欢迎大家观看与指出不足。 目录 一、zookeeper的存储结构 二、什么是znode 三、znode节点的四种类型 四、权限控制ACL&#xff08;Access Control List&#xff09; 五、事件监听watcher 一、zookeeper的存储结构 z…

练习8 Web [GYCTF2020]Blacklist

这道题其实不是堆叠注入&#xff0c;但是我在联合查询无效后&#xff0c;试了一下堆叠&#xff0c;最后一步发现被过滤的sql语句太多了&#xff0c;完全没法 查阅其他wp的过程[GYCTF2020]Blacklist 1&#xff08;详细做题过程&#xff09; 是用的handler语句&#xff0c;只能用…

控制学习_正弦波无刷直流力矩电机建模、控制带宽讨论与选择

无刷电机通过电子换向器实现定子的磁场旋转&#xff0c;去电刷后使用寿命大幅提升&#xff0c;是现在更流行的选择。三相无刷电机则是无刷电机中比较流行的一款。三相无刷电机的驱动方式有多种&#xff0c;最简单的被称为梯形波驱动、方波驱动或正弦波驱动。而正弦波驱动技术可…

【工具】一键生成动态歌词字幕

那眼神如此熟悉 让人着迷无力抗拒 一次又一次相遇 在眼前却遥不可及 命运总爱淘气 将一切都藏匿 曾有你的回忆 无痕迹 若不是心心相吸 又怎么会一步一步靠近 &#x1f3b5; 董真《思如雪》 下载LRC歌词 https://www.musicenc.com/article/50287.htmlhttp…

这次玩个猛的,复现 2000 年前碳化卷轴

公元79年10月24日&#xff0c;意大利的维苏威火山爆发&#xff0c;一天之内就毁灭了两万多人的庞贝古城。 火山灰掩盖了整座城市&#xff0c;其中有一栋房子存放了各种书籍。直到18世纪&#xff0c;这栋房子才重新被发现&#xff0c;下面是考古学家的建筑复原图。 房子里面的1…

本地用AIGC生成图像与视频

最近AI界最火的话题&#xff0c;当属Sora了。遗憾的是&#xff0c;Sora目前还没开源或提供模型下载&#xff0c;所以没法在本地跑起来。但是&#xff0c;业界有一些开源的图像与视频生成模型。虽然效果上还没那么惊艳&#xff0c;但还是值得我们体验与学习下的。 Stable Diffu…

基于粒子群算法的分布式电源配电网重构优化matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1基本PSO算法原理 4.2配电网重构的目标函数 5.完整工程文件 1.课题概述 基于粒子群算法的分布式电源配电网重构优化。通过Matlab仿真&#xff0c;对比优化前后 1.节点的电压值 2.线路的损耗,这里计…

阿里二面:什么情况会发生Full GC?如何避免频繁Full GC?

阿里二面&#xff1a;什么情况会发生Full GC&#xff1f;如何避免频繁Full GC&#xff1f; Minor GC、Major GC 和 Full GC区别&#xff1f; Minor GC、Major GC和Full GC是垃圾回收中的三个重要概念&#xff0c;它们描述了垃圾回收的不同阶段和范围&#xff1a; Minor GC&am…

【leetcode热题】 分数到小数

给定两个整数&#xff0c;分别表示分数的分子 numerator 和分母 denominator&#xff0c;以 字符串形式返回小数 。 如果小数部分为循环小数&#xff0c;则将循环的部分括在括号内。 如果存在多个答案&#xff0c;只需返回 任意一个 。 对于所有给定的输入&#xff0c;保证 …

【SQL Server】实验七 数据完整性

1 实验目的 掌握实体完整性、参照完整性和用户自定义完整性约束的创建方法。掌握完整性约束的运行检查机制。掌握参照完整性的级联删除和修改方法。掌握正确设计关系模式完整性约束的方法。 2 实验内容 2.1 掌握实体完整性约束的创建和使用方法 创建表时定义由一个属性组成…

【蓝桥杯选拔赛真题38】C++判断数字 第十四届蓝桥杯青少年创意编程大赛 算法思维 C++编程选拔赛真题解析

目录 C判断数字 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、推荐资料 C判断数字 第十四届蓝桥杯青少年创意编程大赛C选拔赛真题 一、题目要求 1、编程实现 给定一个正整数N(100≤N<100000)…

特殊内齿轮加工的另一种选择

内齿轮加工普遍采用插齿或拉削&#xff0c;但对于一些特殊齿廓的内齿轮来说&#xff0c;插齿可能会有一定的困难&#xff0c;或者成本较高。在这种情况下&#xff0c;线切割加工不失为一种不错的选择。那么什么样的零件需要选择这种加工方式呢&#xff1f;一起来看看&#xff1…

【Java】常用类和基础API

文章目录 一、String的特性二、String的内存结构2.1 拼接2.2 new 三、String的常用API-13.1 构造器 四、String的常用API-24.1 常用方法4.2 查找4.3 字符串截取4.4 和字符/字符数组相关4.5 开头与结尾4.6 替换 五、StringBuffer、StringBuilder5.1 StringBuilder、StringBuffer…

【RS422】基于未来科技FT4232HL芯片的多波特率串口通信收发实现

功能简介 串行通信接口常常用于在计算机和低速外部设备之间传输数据。串口通信存在多种标准&#xff0c;以RS422为例&#xff0c;它将数据分成多个位&#xff0c;采用异步通信方式进行传输。   本文基于Xilinx VCU128 FPGA开发板&#xff0c;对RS422串口通信进行学习。   根…

sqlite 常见命令 表结构

在 SQLite 中&#xff0c;将表结构保存为 SQL 具有一定的便捷性和重要性&#xff0c;原因如下 便捷性&#xff1a; 备份和恢复&#xff1a;将表结构保存为 SQL 可以方便地进行备份。如果需要还原或迁移数据库&#xff0c;只需执行保存的 SQL 脚本&#xff0c;就可以重新创建表…

如何在“Microsoft Visual Studio”中使用OpenCV编译应用程序

返回目录&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 前一篇&#xff1a;OpenCV4.9.0在windows系统下的安装 后一篇&#xff1a; 警告&#xff1a; 本教程可以包含过时的信息。 我在这里描述的所有内容都将适用于 OpenCV 的C\C接口。我首先假…

力扣热题100_矩阵_240_搜索二维矩阵 II

文章目录 题目链接解题思路解题代码 题目链接 240. 搜索二维矩阵 II 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 示例 1&#xff1a; 输入&#xf…

专升本 C语言笔记-07 逗号运算符

1.逗号表达式的用法 就是用逗号隔开的多个表达式。逗号表达式&#xff0c;从左向右依次执行。 2.逗号表达式的特性 2.1.当没有括号时&#xff0c;第一个表达式为整个表达式的值。 代码 int x 3,y 5,a 0; a x,y; printf("a %d",a); 说明:因为逗号优先级最低,会…