Scala03 流程控制


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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值