03 流程控制

news2025/1/8 12:01:26
  • 3.1 条件判断
  • 3.2 循环控制
  • 3.3 中断循环

3.1 条件判断

  1. if 条件判断 :单分支(if)、双分支(if…else…)、多分支(if … else if … else)
  2. Switch(Scala并没有 switch,用的是 模式匹配(后面会详细讲解)

3.1.1 单分支(if)

格式:

if(条件表达式){
	代码块
}

执行流程:

案例:

//单分支
/**
 * 从控制台数据 年龄,判断是否是合法工龄
 * 输入语句:StdIn.readInt()
 */
print("请输入年龄:")
var age:Int=StdIn.readInt()//输入语句
//判断
if(age>18){
  println(s"年龄:$age 岁!是合法工龄!")
}

3.1.2 双分支(if…else…)

格式:

if(条件表达式){
	代码块
}else{
	不满足条件的代码
}

执行流程:

案例:

print("请输入年龄:")
var age:Int=StdIn.readInt()//输入语句
//判断
if(age>18){
  println(s"年龄:$age 岁!是合法工龄!")
}else{
  println(s"年龄:$age 岁!是童工!")
}

Scala 条件判断 其实是有返回值

// scala 条件判断 其实是有返回值
print("请输入年龄:")
var age:Int=StdIn.readInt()//输入语句
var res:String=if(age>18){
  s"年龄:$age 岁!是合法工龄!"
}else{
  s"年龄:$age 岁!是童工!"
}
println("有返回值案例:\n"+res)

3.1.3 多分支(if…else if … else)

格式:

if(条件表达式1){
	满足条件1 的代码块
}else if(条件表达式1){
    满足条件2 的代码块
}else{
    以上条件都不满足
}

执行流程:

案例:

//多分支
//判断
var res1:String =if(age>18 && age<=60){
  s"年龄:$age 岁!是合法工龄!"
}else if(age>0 && age<18){
  s"年龄:$age 岁!是童工!"
}else {
  "error:程序异常!"
}

Scala中返回值类型不一致,取它们共同的祖先类型

//当不确定所返回的数据类型,或者想接受多种返回类型 ===> 用 Any 作为接收类型
var res3:Any =if(age>18 && age<=60){
  s"年龄:$age 岁!是合法工龄!"
}else if(age>0 && age<18){
  s"年龄:$age 岁!是童工!"
}else {
  "error:程序异常!"
}

3.1.4 三元运算符

//三元运算符写法
var res3:String=if(age>18)s"年龄:$age 岁!是合法工龄!" else s"年龄:$age 岁!是童工!"

3.2 循环控制

  1. for循环
  2. while循环
  3. do…while循环

3.2.1 for循环

格式:

for(变量 <- range/(表达式/数组/集合)){
    循环语句
}

Range 可以是一个数字区间表示 i to j ,或者 i until j。左箭头 <- 用于为变量 赋值

执行流程:

案例:

    //for循环==> 遍历 0-9的是所有数字
    for(i <- 0 to 9){
      println(i)
    }
====================================
    //for循环==> 遍历 0-9的是所有数字(不包括9)
    for(i <- 0 until 9){
      println(i)
    }
=====================================
    //遍历 0-10 的所有偶数
    //写法1
    for(i <- 0 to 10 if i%2==0){
      //写法2
//      if(i%2==0){
//        println(i)
//      }
      println(i)
=======================================
  //可以使用分号 (;) 来设置多个区间,它将迭代给定区间所有的可能值
	var a = 0;  
	var b = 0;  
	// for 循环  
	for( a <- 1 to 3; b <- 1 to 3){  
	 println( "Value of a: " + a );  
	 println( "Value of b: " + b );
	}

for 使用 yield

格式:

var retVal = for{ var x <- List
     if xxx; if xxx...
}yield x

注意大括号中用于保存变量和条件,retVal 是变量, 循环中的 yield 会把当前的元素记下来,保存在集合中,循环结束后将返回该集合。

var a = 0;  
val numList = List(1,2,3,4,5,6,7,8,9,10);  

// for 循环  
var retVal = for{ a <- numList  
				if a != 3; if a < 8  
			  }yield a  

// 输出返回值  
for( a <- retVal){  
 println( "Value of a: " + a );  
}

3.2.2 while循环

while循环和 Java中的一样
格式:

while(布尔表达式){
  循环语句;
}

1.前面说的 for 有返回值,但是 while 没有返回值,所以整个 while 语句的 结果都是 Unit类型()

执行流程:

案例:

// 局部变量  
var a = 10;  

// while 循环执行  
while( a < 20 ){
	println( "a: " + a );  
	a = a + 1;  
}

3.2.3 do…while循环

do…while循环也和 Java 中的一样
格式:

do{
  循环语句;
}while(布尔表达式)

do…while 循环是无论怎样都先执行一次,再判断是否满足条件

执行流程:

案例:

// 局部变量  
var a = 10;  

// do 循环  
do{
	println( "Value of a: " + a );  
	a = a + 1;  
}while( a < 20 )  

3.3 中断循环

scala中 为了更好的适应 函数式编程 去掉了 break 和 continue
推荐 3 种 常见 中断循环的方式

  1. 使用Boolean型的控制变量(定义标志 用于结束循环)
//求 10 以内数字累加和

// while循环
var flag = true
var result = 0
var n = 0

while(flag) {
  res += n
  n += 1
  println("res = "+ res)
  println("n = "+ n)
  if (n == 10) {
    flag = false
  }
}

// for循环
var flag = true
var res = 0
for (i <- 0 to 10 if flag) {
  res += i
  println("res = " + res )
  if (i == 10) flag = false
}
  1. 使用嵌套函数以及return
/**
* 1 + 2 + 3 + 4
*
* @return
*/
  def addOuter() = {
    var res = 0
    def addInner() {
      for (i <- 0 until 10) {
        if (i == 5) {
          return
        }
        res += i
        println("res = " + res)
      }
    }
    addInner()
    res
  }
 
  def main(args: Array[String]): Unit = {
    addOuter()
  }
  1. 使用Breaks类的break方法
// 需要导入这个包
import scala.util.control.Breaks._
object Demo {
	def main(args: Array[String]): Unit = {
	    var res = 0
	    breakable {
	      for (i <- 0 until 10) {
	        if (i == 5) {
	          break
	        }
	        res += i
	      }
	    }
	    println("res = " + res)
	  }
}

3.4 案例

案例1

输入一个数判断是否是素数

案例2

判断一定范围内的素数,并按照每行八个打印输出

案例3

猴子摘桃问题
猴子第一天摘下 x 个桃子,当即吃了一半,还不瘾,  又多吃了一个。
第二天早上又将剩下的桃子吃掉一半,  又多吃了一个。
以后每天早上都吃了前一天剩下的一半 + 一个。  
到第 21 天早上想再吃时,发现只剩下一个桃子了。求 第一天共摘了多少个桃子。

案例4

随机从键盘输入十个数字,对它们进行排序(从大到小)

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

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

相关文章

2023年鞋服配饰行业如何玩转全域经营?

2023年&#xff0c;鞋服配饰行业私域已进入深水区&#xff0c;这就对私域运营提出了更高的挑战和目标&#xff0c;企业纷纷发力以私域为基石、以消费者为核心的全域经营。 不过&#xff0c;虽然鞋服配饰行业私域起步早&#xff0c;玩法多。但在迈向全域经营的过程中&#xff0…

全网详细介绍nginx的反向代理、正向代理配置,location的指令说明,反向代理的两个示例代码以及全局块,events块和http快的说明。

文章目录1. 文章引言2. 何谓反向代理3. 解析nginx的配置文件3.1 全局块(global block)3.2 events块(events block)3.3 http块(http block)4. 如何配置反向代理4.1 反向代理示例14.2 反向代理示例25. 补充说明5.1 location指令说明5.2 nginx完整配置文件1. 文章引言 如果你的服务…

聚合效度全流程

聚合效度分析流程如下&#xff1a; 一、聚合效度定义 聚合效度&#xff08;convergent validity&#xff09;&#xff0c;又称收敛效度&#xff0c;是指测量同一变量的测量项会落在同一因子上&#xff0c;强调本应该在同一因子下的测量项&#xff0c;确实在同一因子下。即一个…

基于nodejs+vue地方特色的风景文化宣传网站vscode

管理员可以根据系统给定的账号进行登录&#xff0c;登录后可以进入木里风景文化管理平台对木里风景文化所有模块进行管理。包括查看和修改自己的个人信息以及登录密码。 该系统为每一个用户都分配了一个用户账号&#xff0c;用户通过账号的登录可以在系统中查看木里风景文化信息…

怎么依靠网络赚钱,网上可以做什么副业

如今&#xff0c;网上赚钱已经成为许多人职业生涯的选择之一。网上有很多可靠的兼职&#xff0c;让你在家里轻松赚钱。今天给大家推荐五份可靠的网上兼职。一、怎样选择可靠的网络兼职可靠的网络兼职一般是指在家通过网络平台完成兼职任务&#xff0c;完成任务后即可获得报酬。…

JVM中TLAB(Thread Local Allocation Buffer)+逃逸分析

1、为什么有TLAB&#xff08;Thread Local Allocation Buffer&#xff09;堆区是线程共享区域&#xff0c;任何线程都可以访问到堆区中的共享数据 由于对象实例的创建在JVM中非常频繁&#xff0c;因此在并发环境下从堆区中划分内存空间是线程不安全的 为避免多个线程操作同一地…

java地图导出——添加经纬线

概述 前面的文章Node实现切片的拼接和地图的导出和Java实现地图的导出分别讲述可如何在node和java中实现切片的拼接以及地图的导出。本文&#xff0c;书接前文&#xff0c;实现java导出时经纬度的添加。 实现后效果 实现 完整的实现思路流程如下图&#xff1a; 1. 根据切片…

什么是Makefile?如何编写Makefile?

&#x1f947;今日学习目标&#xff1a;什么是Makefile&#xff1f;如何编写Makefile&#xff1f; &#x1f935;‍♂️ 创作者&#xff1a;JamesBin ⏰预计时间&#xff1a;10分钟 &#x1f389;个人主页&#xff1a;嵌入式悦翔园个人主页 &#x1f341;专栏介绍&#xff1a;L…

RabbitMQ实现死信队列

目录死信队列是什么怎样实现一个死信队列说明实现过程导入依赖添加配置编写mq配置类添加业务队列的消费者添加死信队列的消费者添加消息发送者添加消息测试类测试死信队列的应用场景总结死信队列是什么 “死信”是RabbitMQ中的一种消息机制&#xff0c;当你在消费消息时&#…

单调栈(C/C++)

目录 1. 单调栈的定义 2. 单调栈的常见用途 3. 案例分析 3.1 暴力解法 3.2 单调栈 4. 单调栈总结 1. 单调栈的定义 单调栈顾名思义&#xff0c;就是栈内的元素是单调的。根据栈内元素的单调性的不同&#xff0c;可以分为&#xff1a; 单调递增栈&#xff1a;栈内元素是单…

LeetCode 105. 从前序与中序遍历序列构造二叉树 106. 从中序与后序遍历序列构造二叉树

为什么前序和中序或者中序和后序&#xff0c;两两组合能构建一个二叉树&#xff1f; 因为前序和后序可以确定根&#xff0c;而中序可以划分出左右区间。 文章目录从前序与中序遍历序列构造二叉树从中序与后序遍历序列构造二叉树从前序与中序遍历序列构造二叉树 难度 中等 题目链…

基于java的进销库存管理系统(Vue+Springboot+Mysql)前后端分离项目,附万字课设论文

1.3 系统实现的功能 本次设计任务是要设计一个超市进销存系统&#xff0c;通过这个系统能够满足超市进销存系统的管理及员工的超市进销存管理功能。系统的主要功能包括&#xff1a;首页、个人中心、员工管理、客户管理、供应商管理、承运商管理、仓库信息管理、商品类别管理、 …

TS泛型,原来就这?

一、泛型是什么&#xff1f;有什么作用&#xff1f; 当我们定义一个变量不确定类型的时候有两种解决方式&#xff1a; 使用any 使用any定义时存在的问题&#xff1a;虽然知道传入值的类型但是无法获取函数返回值的类型&#xff1b;另外也失去了ts类型保护的优势 使用泛型 泛型…

记一次线上es慢查询导致的服务不可用

现象 某日线上业务同学反馈订单列表查询页面一直loding&#xff0c;然后提示请求超时&#xff0c;几分钟之后恢复正常 接到报障之后&#xff0c;马上根据接口URL&#xff0c;定位到了请求链路&#xff0c;发现是es查询超时&#xff0c;这里我们的业务订单表数据是由几百万的&a…

【数据结构】时间复杂度和空间复杂度以及相关OJ题的详解分析

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;数据结构 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录1.算法效率1.1 如何衡…

独家 | Gen-1——可以改变视频风格的AI模型

翻译&#xff1a;吴振东校对&#xff1a;张睿毅本文约1000字&#xff0c;建议阅读3分钟 本文简单介绍了Runway公司的发展史&#xff0c;以及他们新推出的生成式AI模型Gen-1&#xff0c;可用于通过应用文本提示或者参考图像所指定的任意风格&#xff0c;将现有视频转换为新视频。…

php mysql高校教材管理系统

我的目标就是在于开发一个功能实用、操作方便&#xff0c;简单明了的管理系统&#xff1b;其能够录入教师个人的信息&#xff0c;教导主任信息&#xff0c;在操作上能够完成诸如添加、修改、删除、按各种条件进行查询、等方面的工作&#xff0c;基本满足学校的日常业务的需求. …

System V|共享内存基本通信框架搭建|【超详细的代码解释和注释】

前言 那么这里博主先安利一下一些干货满满的专栏啦&#xff01; 手撕数据结构https://blog.csdn.net/yu_cblog/category_11490888.html?spm1001.2014.3001.5482这里包含了博主很多的数据结构学习上的总结&#xff0c;每一篇都是超级用心编写的&#xff0c;有兴趣的伙伴们都支…

string和自动推断类型

欢迎来观看温柔了岁月.c的博客目前设有C学习专栏C语言项目专栏数据结构与算法专栏目前主要更新C学习专栏&#xff0c;C语言项目专栏不定时更新待C专栏完毕&#xff0c;会陆续更新C项目专栏和数据结构与算法专栏一周主要三更&#xff0c;星期三&#xff0c;星期五&#xff0c;星…

【项目管理】项目进度管理中的逻辑关系

项目的进度管理是项目核心管理之一&#xff0c;通过合理的进度安排&#xff0c;制定出科学可行的分项工期表&#xff0c;并条理清晰的显示出项目进度之间的逻辑关系。 1、目标是计划的灵魂 进度计划必须按照确定的项目总进度要求进行编制&#xff0c;了解项目总目标和整体安…