第4章 流程控制-if-else,Switch,For循环(循环守卫,循环步长,倒叙打印),While循环,多重循环...

news2024/11/15 13:04:27

4 章 流程控制-if-else,Switch,For循环(循环守卫,循环步长,倒叙打印),While循环,多重循环

4.1 分支控制 if-else

让程序有选择的的执行,分支控制有三种:单分支、双分支、多分支

4.1.1 单分支

1)基本语法

if (条件表达式) {

执行代码块

}

说明:当条件表达式为 ture 时,就会执行{ }的代码。

2)案例实操

object TestIfElse {
 def main(args: Array[String]): Unit = {
 
 println("input age:")
 var age = StdIn.readShort()
 if (age < 18){
 println("童年")
 }
 }
}

4.1.2 双分支

1)基本语法

if (条件表达式) {
执行代码块 1
} else {
执行代码块 2
}

2)案例实操

需求:输入年龄,如果年龄小于 18 岁,则输出“童年”。否则,输出“成年”。

object TestIfElse {
 def main(args: Array[String]): Unit = {
 	println("input age:")
 	var age = StdIn.readShort()
 	if (age < 18){
 		println("童年")
	 }else{
 		println("成年")
 }
 }
}

4.1.3 多分支

1)基本语法

if (条件表达式 1) {
	执行代码块 1
}
else if (条件表达式 2) {
	执行代码块 2
    }
 ……
else {
	执行代码块 n
}

2)案例实操

(1)需求 1:需求:输入年龄,如果年龄小于 18 岁,则输出“童年”。如果年龄大于

等于 18 且小于等于 30,则输出“中年”,否则,输出“老年”。

object TestIfElse {
 def main(args: Array[String]): Unit = {
 	println("input age")
 var age = StdIn.readInt()
 if (age < 18){
 	println("童年")
 }else if(age>=18 && age<30){
 	println("中年")
 }else{
 	println("老年")
 }
 }
}

(2)需求 2:Scala 中 if else 表达式其实是有返回值的,具体返回值取决于满足条件的

代码体的最后一行内容。

bject TestIfElse {
 def main(args: Array[String]): Unit = {
 	println("input age")
 	var age = StdIn.readInt()
 	val res :String = if (age < 18){
		"童年"
 	}else if(age>=18 && age<30){
 		"中年"
 	}else{
 		"老年"
 	}
	 println(res)
 }
}

(3)需求 3:Scala 中返回值类型不一致,取它们共同的祖先类型。

object TestIfElse {
    def main(args: Array[String]): Unit = {
 	println("input age")
 	var age = StdIn.readInt()
 	val res:Any = if (age < 18){
 		"童年"
 	}else if(age>=18 && age<30){
 		"中年"
 	}else{
 		100
 	}
	 println(res)
 }
}

(4)需求 4:Java 中的三元运算符可以用 if else 实现

如果大括号{}内的逻辑代码只有一行,大括号可以省略。如果省略大括号,if 只对最近

的一行逻辑代码起作用。

object TestIfElse {
 def main(args: Array[String]): Unit = {
 // Java
// int result = flag?1:0
 // Scala
 println("input age")
 var age = StdIn.readInt()
 val res:Any = if (age < 18) "童年" else "成年"
"不起作用"
 println(res)
 }
}

4.2 嵌套分支

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

分支外面的分支结构称为外层分支。嵌套分支不要超过 3 层。

1)基本语法

if(){
		if() {
		}else{
    }
}

2)案例实操

需求:如果输入的年龄小于 18,返回“童年”。如果输入的年龄大于等于 18,需要再判

断:如果年龄大于等于 18 且小于 30,返回“中年”;如果其他,返回“老年”。

object TestIfElse {
 def main(args: Array[String]): Unit = {
 println("input age")
 var age = StdIn.readInt()
 val res :String = if (age < 18){
 "童年"
 }else {
 if(age>=18 && age<30){
 "中年"
 }else{
 "老年"
 }
 }
 println(res)
 }
}

4.3 Switch 分支结构

在 Scala 中没有 Switch,而是使用模式匹配来处理。

模式匹配涉及到的知识点较为综合,因此我们放在后面讲解。

4.4 For 循环控制

Scala 也为 for 循环这一常见的控制结构提供了非常多的特性,这些 for 循环的特性被称为 for 推导式或 for 表达式。

4.4.1 范围数据循环( To )

1)基本语法

for(i <- 1 to 3){
 print(i + " ")
}
println()

(1)i 表示循环的变量,<- 规定 to

(2)i 将会从 1-3 循环,前后闭合

2)案例实操

需求:输出 5 句 "宋宋,告别海狗人参丸吧"

object TestFor {
 def main(args: Array[String]): Unit = {
 for(i <- 1 to 5){
 println("宋宋,告别海狗人参丸吧"+i)
 }
 }
}

4.4.2 范围数据循环( Until )

1)基本语法

for(i <- 1 until 3) {
 print(i + " ")
}
println()

(1)这种方式和前面的区别在于 i 是从 1 到 3-1

(2)即使前闭合后开的范围

2)案例实操

需求:输出 5 句 "宋宋,告别海狗人参丸吧"

object TestFor {
 def main(args: Array[String]): Unit = {
 for(i <- 1 until 5 + 1){
 println("宋宋,告别海狗人参丸吧" + i)
 }
 }
}

4.4.3 循环守卫

for(i <- 1 to 3 if i != 2) {
 print(i + " ")
}
println()

(1)循环守卫,即循环保护式(也称条件判断式,守卫)。保护式为 true 则进入循环

体内部,为 false 则跳过,类似于 continue。

(2)上面的代码等价

for (i <- 1 to 3){
if (i != 2) {
print(i + " ")
}
}

2)案例实操

需求:输出 1 到 5 中,不等于 3 的值

object TestFor {
 def main(args: Array[String]): Unit = {
 for (i <- 1 to 5 if i != 3) {
 println(i + "宋宋")
 }
 }
}

4.4.4 循环步长

1)基本语法

for (i <- 1 to 10 by 2) {
 println("i=" + i)
}

说明:by 表示步长

2)案例实操

需求:输出 1 到 10 以内的所有奇数

for (i <- 1 to 10 by 2) {
println("i=" + i)
}

输出结果

i=1
i=3
i=5
i=7
i=9

4.4.5 嵌套循环

1)基本语法

for(i <- 1 to 3; j <- 1 to 3) {
 println(" i =" + i + " j = " + j)
}

说明:没有关键字,所以范围后一定要加;来隔断逻辑

2)基本语法

上面的代码等价

for (i <- 1 to 3) {
 for (j <- 1 to 3) {
 println("i =" + i + " j=" + j)
 }
}

4.4.6 引入变量

1)基本语法

for(i <- 1 to 3; j = 4 - i) {
 println("i=" + i + " j=" + j)
}

说明:

(1)for 推导式一行中有多个表达式时,所以要加 ; 来隔断逻辑

(2)for 推导式有一个不成文的约定:当 for 推导式仅包含单一表达式时使用圆括号,

当包含多个表达式时,一般每行一个表达式,并用花括号代替圆括号,如下

for{
 i <- 1 to 3
j = 4 - i
} {
 println("i=" + i + " j=" + j)
}

2)案例实操

上面的代码等价于

for (i <- 1 to 3) {
 var j = 4 - i
 println("i=" + i + " j=" + j)
}

4.4.7 循环返回值

1)基本语法

val res = for(i <- 1 to 10) yield i
println(res)

说明:将遍历过程中处理的结果返回到一个新 Vector 集合中,使用 yield 关键字。

注意:开发中很少使用。

2)案例实操

需求:将原数据中所有值乘以 2,并把数据返回到一个新的集合中。

object TestFor {
 def main(args: Array[String]): Unit = {
 var res = for(i <-1 to 10) yield {
 i * 2
 }
 println(res)
 }
}

输出结果:

Vector(2, 4, 6, 8, 10, 12, 14, 16, 18, 20)

4.4.8 倒序打印

1)说明:如果想倒序打印一组数据,可以用 reverse。

2)案例实操:

需求:倒序打印 10 到 1

for(i <- 1 to 10 reverse){
 println(i)
}

4.5 While do..While 循环控制

While 和 do..While 的使用和 Java 语言中用法相同。

4.5.1 While 循环控制

1)基本语法

循环变量初始化

while (循环条件) {

循环体(语句)

循环变量迭代

}

说明:

(1)循环条件是返回一个布尔值的表达式
(2)while 循环是先判断再执行语句
(3)与 for 语句不同,while 语句没有返回值,即整个 while 语句的结果是 Unit 类型()
(4)因为 while 中没有返回值,所以当要用该语句来计算并返回结果时,就不可避免
的使用变量,而变量需要声明在 while 循环的外部,那么就等同于循环的内部对外部的变量
造成了影响,所以不推荐使用,而是推荐使用 for 循环。

2)案例实操

需求:输出 10 句 "宋宋,喜欢海狗人参丸"

object TestWhile {
 
 def main(args: Array[String]): Unit = {
 var i = 0
 while (i < 10) {
 println("宋宋,喜欢海狗人参丸" + i)
 i += 1
 }
 }
}

4.5.2 do..while 循环控制

1)基本语法

循环变量初始化;

do{

循环体(语句)

循环变量迭代

} while(循环条件)

说明

(1)循环条件是返回一个布尔值的表达式
(2)do..while 循环是先执行,再判断

2)案例实操

需求:输出 10 句 "宋宋,喜欢海狗人参丸"

object TestWhile {
 def main(args: Array[String]): Unit = {
 var i = 0
 do {
 println("宋宋,喜欢海狗人参丸" + i)
 i += 1
 } while (i < 10)
 }
}

4.6 循环中断

1)基本说明

Scala 内置控制结构特地去掉了 break continue,是为了更好的适应函数式编程,推

荐使用函数式的风格解决break和continue的功能,而不是一个关键字。Scala中使用breakable

控制结构来实现 break 和 continue 功能。

2)案例实操

需求 1:采用异常的方式退出循环

def main(args: Array[String]): Unit = {
 try {
 for (elem <- 1 to 10) {
 println(elem)
 if (elem == 5) throw new RuntimeException
      }
 }catch {
 case e =>
 }
 println("正常结束循环")
}

需求 2:采用 Scala 自带的函数,退出循环

import scala.util.control.Breaks
def main(args: Array[String]): Unit = {
 Breaks.breakable(
 for (elem <- 1 to 10) {
 println(elem)
 if (elem == 5) Breaks.break()
 }
 )
 println("正常结束循环")
}

需求 3:对 break 进行省略

import scala.util.control.Breaks._
object TestBreak {
 def main(args: Array[String]): Unit = {
 
 breakable {
 for (elem <- 1 to 10) {
 println(elem)
 if (elem == 5) break
 }
 }
 
 println("正常结束循环")
 }
}

需求 4:循环遍历 10 以内的所有数据,奇数打印,偶数跳过(continue)

object TestBreak {
 def main(args: Array[String]): Unit = {
 for (elem <- 1 to 10) {
 if (elem % 2 == 1) {
 println(elem)
 } else {
 println("continue")
 }
 }
 }
}

4.7 多重循环

1)基本说明

(1)将一个循环放在另一个循环体内,就形成了嵌套循环。其中,for,while,do…while

均可以作为外层循环和内层循环。【建议一般使用两层,最多不要超过 3

(2)设外层循环次数为 m 次,内层为 n 次,则内层循环体实际上需要执行 m*n 次。

2)案例实操

需求:打印出九九乘法表

object TestWhile {
 def main(args: Array[String]): Unit = {
 for (i <- 1 to 9) {
 for (j <- 1 to i) {
 print(j + "*" + i + "=" + (i * j) + "\t")
 }
 println()
 }
 }
}

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

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

相关文章

Leetcode-每日一题1234. 替换子串得到平衡字符串(滑动窗口 + 哈希表)

题目链接&#xff1a;https://leetcode.cn/problems/replace-the-substring-for-balanced-string/description/ 思路 题目意思 这题意思是一个只含有[Q, W, E, R] 四个字符的字符串s且长度一定是 4的倍数&#xff0c; 需要你通过替换子串&#xff0c;使他变成一个「平衡字符…

【C++设计模式】学习笔记(6):Bridge 桥模式

目录 简介动机(Motivation)模式定义结构(Structure)要点总结笔记结语简介 Hello! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~ ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计算机专业,获得过国家奖学金…

【C++设计模式】学习笔记(2):模式分类与模版方法 Template Method

目录 简介模式分类GOF-23 模式分类从封装变化角度对模式分类重构获得模式 Refactoring to Patterns重构关键技法“组件协作”模式Template Method 模式动机(Motivation)结构化软件设计流程面向对象软件设计流程早绑定与晚绑定模式的定义结构(Structure)要点总结结语简介 He…

Unity(一)--通过简单例子了解属性、脚本等基础操作

目录新建工程保存视图创建游戏对象调整场景视图角度添加物理运动组件更换材质更改颜色添加脚本点击向上跳跃变色旋转UGUI的使用修改文字内容新建工程 ps:最好不使用中文文件路径及名称&#xff0c;可能会报错。 保存视图 进工程后&#xff0c;此时只有空文件夹&#xff0c;可…

《痞子衡嵌入式半月刊》 第 71 期

痞子衡嵌入式半月刊&#xff1a; 第 71 期 这里分享嵌入式领域有用有趣的项目/工具以及一些热点新闻&#xff0c;农历年分二十四节气&#xff0c;希望在每个交节之日准时发布一期。 本期刊是开源项目(GitHub: JayHeng/pzh-mcu-bi-weekly)&#xff0c;欢迎提交 issue&#xff0c…

新手做跨境电商,选对平台很重要

据数据统计&#xff0c;我国跨境电商早在2013年&#xff0c;发展态势就十分迅猛&#xff0c;交易规模达到2.7万亿元&#xff1b;而到2015年&#xff0c;仅仅两年时间&#xff0c;交易规模就突破到5万亿元&#xff1b;再过两年&#xff0c;2017年跨境电商交易规模增长到7.6万亿元…

okcc呼叫中心怎样搭建?

随着企业对服务逐渐重视&#xff0c;开始意识到呼叫中心作为客户服务水平和沟通效率的基本平台&#xff0c;并且有越来越多的企业开始利用呼叫中心外呼方式销售自己的产品。在此背景下&#xff0c;很多企业&#xff0c;无论规模大小&#xff0c;都有建立自己呼叫中心的想法。 …

docker的资源控制管理——Cgroups

引言&#xff1a;docker 使用cgrqup控制资源&#xff0c;K8S 里面也有limit&#xff08;使用上限&#xff09;docker通过cgroup来控制容器使用的资源配额&#xff0c;包括CPU、内存、磁盘三大方面&#xff0c;基本覆盖了常见的资源配额和使用量控制。Cgroup 是 Control group 的…

Jboss EAP 7.4.8配置jacoco 端口无法开启 启动报错

项目场景&#xff1a; servers: Jboss EAP 7.4.8 JDK: JDK17 jacoco: 测试jacoco-0.7.9 jacoco-0.8.5 jacoco-0.8.8 问题描述 问题1: Jboss 启动 VM arguments追加, 如下启动参数&#xff1a; -javaagent:F:\CoverageReport\jacoco-0.7.9\lib\jacocoagent.jarincludes*,o…

别具一格,原创唯美浪漫情人节表白专辑,(复制就可用)(html5,css3,svg)表白爱心代码(1)

别具一格&#xff0c;原创唯美浪漫情人节表白专辑&#xff0c; (复制就可用)&#xff08;html5,css3,svg)表白爱心代码(1) 一、 前言 回眸之间&#xff0c;丰盈了岁月&#xff0c;涟漪了思绪&#xff0c;轻轻落笔&#xff0c;不写伤痕&#xff0c;不写仇怨&#xff0c;只写岁月…

反光板导航SLAM(三)反光柱导航开发与实验

在上一章中简单了解了VEnus算法对于反光柱导航的基本思路。其主要分为了高反点提取、高反点聚类查找中心、高反点与已知反光柱位姿匹配以及调用ceres库进行位姿优化等步骤。然后在这个算法的基础上&#xff0c;再进行一定的开发达到一个比较稳定且可视化的版本。 使用&#xff…

json对象和formData相互转换

前言 大家都知道&#xff0c;前端在和后台进行交互联调时&#xff0c;肯定避免不了要传递参数&#xff0c;一般情况下&#xff0c;params 在 get 请求中使用&#xff0c;而 post 请求下&#xff0c;我们有两种常见的传参方式&#xff1a; JSON 对象格式和 formData 格式&#x…

《MySQL学习》 索引 下 覆盖索引,MRR,联合索引

一. 覆盖索引 有一张表T1&#xff0c;它的建表语句如下 mysql> create table T1 ( ID int primary key, k int NOT NULL DEFAULT 0, s varchar(16) NOT NULL DEFAULT , index k(k)) engineInnoDB;insert into T1 values(100,1, aa),(200,2,bb),(300,3,cc),(500,5,ee),(60…

为什么子进程要继承处理器亲缘性?

请先考虑一个典型的程序为什么需要启动一个子进程。(当然资源管理器不算一个典型的程序) 这是因为手头的任务被分解为子任务&#xff0c;无论出于何种原因&#xff0c;这些子任务都被放入子流程中。例如&#xff0c;在实现多次遍历型编译器/链接器时&#xff0c;其中每次遍历都…

虹科新品 | 万兆车载以太网媒体转换器-实现更加快捷、高效的连接

多千兆车载以太网 媒体转换器 —— Technica Engineering —— 2.5/5/10GBASE-T1多千兆 Media Converter Media Converter 是一种硬件设备&#xff0c;可在汽车以太网连接&#xff08;100BASE-T1 或 1000BASE-T1&#xff09;和任何具有带 RJ-45 连接器的标准以太网网络接口卡 …

canal同步mysql数据到kafka, kafka消费存入clickhouse

环境win mysql5.7 apache-zookeeper-3.5.9-bin kafka_2.11-1.1.1 canal.deployer-1.1.7-SNAPSHOT 如果不想看步骤可以直接下载我打包好的文件&#xff0c;修改相关数据库配置就行 https://download.csdn.net/download/weixin_38738049/87441074?spm1001.2014.3001.55031新增m…

pytorch 实现情感分类问题

1、词表映射无论是深度学习还是传统的统计机器学习方法处理自然语言&#xff0c;都需要先将输入的语言符号&#xff08;通常为标记Token&#xff09;&#xff0c;映射为大于等于0、小于词表大小的整数&#xff0c;该整数也被称作一个标记的索引值或下标。vocab类实现标记和索引…

C语言(按位运算符和位移运算符)

目录 ​编辑 一.按位运算符 1.二进制反码或按位取反&#xff1a;~ 2.按位与&#xff1a;& 3.按位或&#xff1a;| 4.按位异或&#xff1a;^ 二.位移运算符 1.左移&#xff1a; << 2.右移&#xff1a; >> 一.按位运算符 C有四个按位逻辑运算符都用于整…

[多线程进阶]CAS与Synchronized基本原理

专栏简介: JavaEE从入门到进阶 题目来源: leetcode,牛客,剑指offer. 创作目标: 记录学习JavaEE学习历程 希望在提升自己的同时,帮助他人,,与大家一起共同进步,互相成长. 学历代表过去,能力代表现在,学习能力代表未来! 目录: 1.CAS 1.1 什么是CAS? 1.2 CAS伪代码 1.3 CAS …

【C++初阶】vector的使用

大家好我是沐曦希&#x1f495; 文章目录一.vector介绍二、构造函数三、遍历1.[]2.迭代器3.范围for四、容量操作1.扩容机制五、增删查改六、迭代器失效问题一.vector介绍 vector是表示可变大小数组的序列容器。就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。…