大数据学习笔记1.5 Scala内建控制结构

目录

一、条件表达式

1、语法格式

2、执行情况

3、案例演示

1、根据输入值的不同进行判断

2、 编写Scala程序,判断奇偶性

二、块表达式

1、语法格式

 2、执行情况

3、案例演示

三、for循环

1、单重for循环

1.1、语法格式 

1.2、执行情况

1.3、案例演示

2、嵌套for循环 

1、语法格式

 四、条件循环

1、while循环

 2、do while循环

1、语法格式

 2、案例演示

五、异常处理

1、异常处理概述

2、演示

任务:演示try-catch-finally

 六、match结构

1、语法格式

 七、变量作用域

1、内部不能访问外部

 2、外部不能访问内部

 八、课后复习


一、条件表达式

1、语法格式

if (条件) 值1 else 值2

2、执行情况

  • 条件为真,结果是值1;条件为假,结果是值2。如果if和else的返回结果同为某种类型,那么条件表达式结果也是那种类型,否则就是Any类型
  • Scala的条件表达式有点类似于Java的条件运算符

3、案例演示

1、根据输入值的不同进行判断

  • 也可以在一个表达式中进行多次判断

  •  可以将上述条件表达式改造成嵌套的选择结构,提高了可读性,但是简洁性降低了

  •  小练习:利用选择表达式评定学生成绩等级

2、 编写Scala程序,判断奇偶性

  • 打开Scala项目ScalaDemo,创建net.rzh.day02包,在包里创建Example01对象

import scala.io.StdIn

object Example01 {
  def main(args: Array[String]): Unit = {
    print("n= ")
    val n=StdIn.readLine().toInt
    if (n%2==0)
      print(n.toString+"是偶数")
    else
      print(n.toString+"是基数")
  }

}
  • 利用if结构具有返回值的特性,改写程序成为函数式风格

import scala.io.StdIn

object Example02 {
  def main(args: Array[String]): Unit = {
    print("n=")
    val n=StdIn.readLine().toInt
    val result=if (n%2==0) n.toString+"是偶数"else n.toString+"是基数"
    print(result)
  }
}
  •  运行程序,查看结果

二、块表达式

1、语法格式

{语句组}
  • 块表达式为包含在符号“{}”中的语句块

 2、执行情况

  • 需要注意的是,Scala中的返回值是最后一条语句的执行结果,而不需要像Java一样单独写return关键字。如果表达式中没有执行结果,就返回一个Unit对象,类似Java中的void

3、案例演示

  • 语句块最后一句的值就是整个块表达式的结果 

  •  语句块最后一句没有执行结果,那么块表达式结果就是Unit

三、for循环

1、单重for循环

1.1、语法格式 

for (变量 <- 集合或数组 (条件)) {
     语句组
}

1.2、执行情况

  • 表示将集合或数组中的每一个值循环赋给一个变量

1.3、案例演示

  • 输出1到10
  • 两种方式实现,一种使用Range类,一种使用to运算符

  • Range(a, b): 从a到b,不包含b,跟Python里的range函数一样,含头不含尾

  • 1 to 10表示将1到10的所有值组成一个集合,且包括10。若不想包括10,则可使用关键字until

  •  打印字符直角三角形

  • 利用map函数产生每行星号构成的向量,然后利用foreach函数循环输出

  • 利用双重循环与流间变量,这个是Scala语言特有的东西 

 

  •  遍历字符串,输出每个字符
  • 方法一、按索引取字符串的每个字符(传统for循环)

  • 方法二:将字符串看作一个由多个字符组成的集合(增强for循环)

  • 计算 1 + 2 + 3 + … + 100
  • 注意sum必须定义为var型变量

 

  • 利用集合的归并方法来求和最简单

 

  •  输出列表内的偶数(过滤)
  • 采用三种方法来实现

  • 输出全部两位素数

 

for (n <- 10 to 100; if !(n % 2 == 0 || n % 3 == 0 || n % 5 == 0 || n % 7 == 0))  print(n.toString + " ")

 

(10 to 100).filter(n => !(n % 2 == 0 || n % 3 == 0 || n % 5 == 0 || n % 7 == 0))

2、嵌套for循环 

1、语法格式

  • 传统格式
for (变量1 <- 集合或数组(条件))
    for (变量2 <- 集合或数组(条件)) {
       语句组
    }
}

 

  • 特有格式
for (变量1 <- 集合或数组; 变量2 <- 集合或数组 (条件)) {
   语句组
}
  •  演示:打印九九表
  • 方法一、采用双重循环来实现
object Example03 {
  def main(args: Array[String]): Unit = {
    for(i <- 1 to 9){
      for(j <- 1 to i){
        print(i.toString+"x"+j+"="+(j*i)+"\t")
      }
      println()
    }
  }

}
  • 运行程序,查看结果

  • 方法二、采用单重循环来实现
object Example04 {
  def main(args: Array[String]): Unit = {
    for (i <- 1 to 9; j <- 1 to i){
      print(i.toString+"x"+j+"="+(i*j)+"\t")
      if(j==i)println()
    }
  }

}

  • 运行程序,查看结果

 

  •  方法三、采用单重循环与流间变量绑定来实现
object Example05 {
    def main(args: Array[String]): Unit = {
    for (i <- 1 to 9; j <- 1 to i; sep = if (j == i) "\n" else "\t") {
      print(i.toString + "x" + j + "=" + (i * j) + sep)
    }
  }
}
  • 运行程序,查看结果

  •  方法四、采用单重循环、流间变量与yield来实现
  • for循环语句本身的返回值是Unit类型,无论在循环体中返回什么都是无效的,最终得到的都是Unit的值,但是可以在循环中的循环条件和循环体之间加上yield关键字,那么就可以将循环体产生的返回值组成数组进行返回。
object Example05 {
    def main(args: Array[String]): Unit = {
      val list = for (i <- 1 to 9; j <- 1 to i; sep = if (j == i) "\n" else "\t")
        yield i.toString + "x" + j + "=" + (i * j) + sep
      list.foreach(print)
    }
  }
  • 查看结果

  •  去掉对角线
  • 一个三阶方阵,单元格的值是行号与列号的乘积,去掉对角线,输出剩余元素
  • 方法一:特有双重循环
object Example06 {
  def main(args: Array[String]): Unit = {
    for (i <- 1 to 3; j <- 1 to 3; sep = if (i != j) (i * j).toString + "\t" else "\t") {
      print(sep)
      if (j == 3) println()
    }
  }
}
  • 查看结果

  •  采用两个流间变量和yield

  •  查看运行结果

  • 编程求解百钱买百鸡问题
  • 我国古代数学家张丘建在《算经》一书中曾提出过著名的“百钱买百鸡”问题,该问题叙述如下:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,则翁、母、雏各几何?
  • 翻译过来,意思是公鸡一个五块钱,母鸡一个三块钱,小鸡三个一块钱,现在要用一百块钱买一百只鸡,问公鸡、母鸡、小鸡各多少只?
//scala 百钱买百鸡
object Example07 {
  def main(args: Array[String]): Unit = {
  for(g<- 0 to 20; m<- 0 to 33; x=100-g-m){
    if(g*5 +m*3 + x/3.0==100)
      println("公鸡:"+ g + "母鸡:"+ m +"小鸡:"+x)
  }

  }

}
  • 查看运行结果

 四、条件循环

1、while循环

  • 语法格式
  • Scala的while循环与Java类似
while(条件) {   
   循环体
}
  •  演示
  • 任务1、计算1+ 2 + 3 + … + 100
object Example08 {
  def main(args: Array[String]): Unit = {
    var sum = 0
    var i = 1
    while (i <= 100) {
      sum = sum + i
      i = i + 1
    }
    println("1+2+3+...+100=" + sum)
  }
}
  • 运行程序,查看结果

  • 采用函数式风格来写代码,递归函数来实现求和,注意:此处sum是常量

 

  • 查看结果

 

  • 任务2、打印全部水仙花数
object Example09 {
  def main(args: Array[String]): Unit = {
    for (n <- 100 to 999) {
      val p1 = n % 10
      val p2 = n / 10 % 10
      val p3 = n / 100
      if (p1 * p1 * p1 + p2 * p2 * p2 + p3 * p3 * p3 == n)
        println("水仙花数为:" + n)
    }
  }
}
  •  查看结果

  • 练习:字符串拆分(整数是可以转换成字符串来处理的)

 

 2、do while循环

1、语法格式

do {
   循环体
} while(条件)

 2、案例演示

  • 计算1+ 2 + 3 + … + 100

五、异常处理

1、异常处理概述

  • Scala中继承了Java的异常机制,提供了程序中产生意外情况时处理的机制,抛出异常的过程和Java中基本一致,通过throw关键字进行:throw XxxException(),一旦抛出可以当场捕获处理或接着向上抛,捕获异常是通过 try-catch-finally来实现的。

2、演示

任务:演示try-catch-finally

  • try-catch-finally是有返回值的:如果没有异常就是try语句的返回值,如果有异常就是catch语句的返回值。注意不会是finally的返回值,finally即使有返回值,也会被抛弃,这点和Java是不同的。
import java.io.IOException

object Example11 {
  def main(args: Array[String]): Unit = {
    var message=""
    val result=try {
      mx()
      "正常运行"
    }catch {
      case e:NullPointerException=>"空指针异常"
      case e:IOException=>"IO异常"
      case e:RuntimeException=>"运行异常"
      case e:Exception=>"其他异常"
    }finally {
      message="运行结束"
    }
    println(result)
    println(message)
  }

  def mx():Unit={
//    throw new RuntimeException("一个运行异常")
  }

}
  • 查看结果

 六、match结构

1、语法格式

变量 match {
      case 值1 => 表达式1或语句1
      case 值2 => 表达式2或语句2
      case 值3 => 表达式3或语句3
      ……
      case _ => 表达式n或语句n
    }
  • Scala中的match(匹配)类似于其他语言的switch(开关)。与Java不同的是,match语句可以应用在任何类型量或表达式上,另外不需要调用break语句,match默认执行完一个case后直接跳出match结构。注意,match是具有返回值的,就是被选到的case的值。
  • 任务2:给城市下评语

 七、变量作用域

1、内部不能访问外部

 2、外部不能访问内部

 八、课后复习

  • 课后熟悉上述所讲内容,并独自练习一遍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值