一、条件表达式
(一)语法格式
if (条件) 值1 else 值2
(二)执行情况
当然也可以在一个表达式中进行多次判断

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

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

任务2、编写Scala程序,判断奇偶性
- 打开Scala项目ScalaDemo,创建net.zhj.day02包,在包里创建Example01对象
package net.zhj.day02
import scala.io.StdIn
object Example01 {
  def main(args: Array[String]): Unit = {
    print("n = ")
    val n = StdIn.readLine().toInt
    if (n % 2 == 0)
      println(n.toString + "是偶数")
    else
      println(n.toString + "是奇数")
  }
}
运行程序,查看结果


利用if结构具有返回值的特性,改写程序成为函数式风格
package net.zhj.day02
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 + "奇数"
    println(result)
  }
}
- 运行程序,查看结果

二、块表达式
(一)语法格式
{语句组}
- 块表达式为包含在符号“{}”中的语句块
(二)执行情况
- 需要注意的是,Scala中的返回值是最后一条语句的执行结果,而不需要像Java一样单独写return关键字。如果表达式中没有执行结果,就返回一个Unit对象,类似Java中的void。
(三)案例演示
-  语句块最后一句的值就是整个块表达式的结果 

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

三、for循环
(一)单重for循环
1、语法格式
for (变量 <- 集合或数组 (条件)) {
     语句组
}
2、执行情况
- 表示将集合或数组中的每一个值循环赋给一个变量
3、案例演示
-  两种方式实现,一种使用Range类,一种使用to运算符 

- Range(a, b): 从a到b,不包含b,跟Python里的range函数一样,含头不含尾
- 1 to 10表示将1到10的所有值组成一个集合,且包括10。若不想包括10,则可使用关键字until

- 打印字符直角三角形

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

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

任务2、遍历字符串,输出每个字符

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

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

任务4、输出列表内的偶数(过滤)
-  采用三种方法来实现 

任务5、输出全部两位素数

(二)嵌套for循环
案例演示
任务1、打印九九表
在net。zhj.day02包里创建Example02_1对象

package net.zhj.day02
object Example02_1 {
  def main(args: Array[String]): Unit = {
    for (i <- 1 to 9) {
      for (j <- 1 to i) {
        print(i.toString + "×" + j + "=" + (i * j) + "\t")
      }
      println()
    }
  }
}
运行程序,查看结果

方法二、采用单重循环来实现
- 在net.zhj.day02包里创建Example03对象

package net.zhj.day02
object Example03 {
  def main(args: Array[String]): Unit = {
    for (i <- 1 to 9; j <- 1 to i) {
      print(i.toString + "×" + j + "=" + (i * j) + "\t")
      if (j == i) println()
    }
  }
}
运行程序,查看结果

方法三、采用单重循环与流间变量绑定来实现
- 在net.zhj.day02包里创建Example04对象
- 在for循环头里sep = if (i == j) "\n" else "\t"就是流间变量绑定

package net.zhj.day02
object Example04 {
  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 + "×" + j + "=" + (i * j) + sep)
    }
  }
}
运行程序,查看结果

方法四、采用单重循环、流间变量与yield来实现
- for循环语句本身的返回值是Unit类型,无论在循环体中返回什么都是无效的,最终得到的都是Unit的值,但是可以在循环中的循环条件和循环体之间加上yield关键字,那么就可以将循环体产生的返回值组成数组进行返回。
- 在net.zhj.day02包里创建Example05对象

package net.zhj.day02
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)
  }
}
运行c程序,查看结果

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

方法二、特有双重循环

package net.zhj.day02
object Example07 {
  def main(args: Array[String]): Unit = {
    for (i <- 1 to 3;j <- 1 to 3;sep = if(i == j) "\t" else (i*j).toString + "\t"){
      print(sep)
      if(j == 3)println()
    }
  }
}
运行程序,查看结果

方法三:采用两个流间变量和yield
package net.zhj.day02
object Example08 {
  def main(args: Array[String]): Unit = {
    val list = for (i <- 1 to 3;j <- 1 to 3;sep = if(j == 3) "\n" else "\t";
                    str = if(i != j) (i*j).toString + sep else " " + sep) yield str
    list.foreach(print)
  }
}
运行程序,查看结果

课堂练习:编程求解百钱买百鸡问题
- 我国古代数学家张丘建在《算经》一书中曾提出过著名的“百钱买百鸡”问题,该问题叙述如下:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,则翁、母、雏各几何?
- 翻译过来,意思是公鸡一个五块钱,母鸡一个三块钱,小鸡三个一块钱,现在要用一百块钱买一百只鸡,问公鸡、母鸡、小鸡各多少只?
 { c o c k + h e n + c h i c k = 100 ( 1 )
- c o c k × 5 + h e n × 3 + c h i c k 3 = 100 ( 2 )
package net.zhj.day02
object Example09 {
  def main(args: Array[String]): Unit = {
    for (a <- 0 to 20;b <- 0 to 33;c = 100 -a -b){
      if (a * 5 + b * 3 + c / 3.0 == 100){
        println("公鸡:"+a+"\t母鸡:"+b+"\t小鸡"+c)
      }
    }
    }
  }

四、条件循环
(一)while循环
1、语法格式
- Scala的while循环与Java类似
while(条件) {   
   循环体
}
2、案例演示
-  在 net.zhj.day02包里创建Example10对象

package net.zhj.day02
object Example10 {
  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+4+....+100 ="+sum)
  }
}

- 采用函数式风格来写代码,递归函数来实现求和,注意:此处sum是常量
- 在net.zhj.day02包里创建Example10_对象

package net.zhj.day02
object Example10_ {
  def mx(n:Int,sum: Int): Int ={
    if (n > 0)mx(n - 1,sum + n ) else sum
  }
  def main(args: Array[String]): Unit = {
    println("1+2+3+...+100 = "+ mx(100,sum = 0))
  }
}
运行程序,查看结果

任务2、打印全部水仙花数
- 所谓水仙花数,是指等于其各位数字立方和的三位数。
153 = 1^3 + 5^3 + 3^3
370 = 3^3 + 7^3 + 0 ^3
371 = 3^3 + 7^3 + 1^3
package net.zhj.day02
object Example11 {
  def main(args: Array[String]): Unit = {
    for (n <- 100 to 999){
      val a = n % 10  //个位数
      val b = n / 10 % 10  //十位数
      val c = n / 100 //百位数
      if(n == a*a*a + b*b*b + c*c*c)
        println(n.toString + "=" + c + "^3 +" + b + "^3 +" + a + "^3")
    }
  }
}

课堂练习:利用字符串来截取来处理,打印水仙花数
package net.zhj.day02
object Example11_ {
  def main(args: Array[String]): Unit = {
    for (n <- 100 to 999){
      val strN = n.toString
      val a = strN(0).toInt - 48 //百位数
      val b = strN(1).toInt - 48 //十位数
      val c = strN(2).toInt - 48 //个位数
      if(n == a*a*a + b*b*b + c*c*c)
        println(n.toString + "=" + a + "^3 +" + b + "^3 +" + c + "^3")
    }
  }
}


 字符转换成整数其实是ASCII码,'0'的ASCII码是48,因此要减48才可以。

课堂练习:整数或字符串拆分
 
(二)do while循环
- 与Java语言一样,do while循环与while循环类似,但是do while循环会确保至少执行一次循环。
1、语法格式
do {
循环体
} while(条件)
2、案例演示
- 在net.zhj.day02包里创建Example12对象

package net.zhj.day02
object Example12 {
  def main(args: Array[String]): Unit = {
    var sum = 0
    var i = 1
    do {
      sum = sum + i
      i = i + 1
    }while (i <= 100)
    println("1+2+3+...+100 = "+sum)
    }
}
运行查看结果

五、异常处理
(一)异常处理概述
- Scala中继承了Java的异常机制,提供了程序中产生意外情况时处理的机制,抛出异常的过程和Java中基本一致,通过throw关键字进行:throw XxxException(),一旦抛出可以当场捕获处理或接着向上抛,捕获异常是通过try-catch-finally来实现的。
(二)案例演示
任务:演示try-catch-finally
- try-catch是有返回值的:如果没有异常就是try语句的返回值,如果有异常就是catch语句的返回值。注意不会是finally的返回值,finally即使有返回值,也会被抛弃,这点和Java是不同的。
- 在net.zhj.day02包里创建Example13对象

package net.zhj.day02
import java.io.IOException
object Example13 {
  def main(args: Array[String]): Unit = {
    var message = ""
    val result = try{
      mx() //调用方法,会抛出异常
      "正常"
    }catch {
      case e :NullPointerException => "空指针异常"
      case e :IOException => "I/O异常"
      case e :RuntimeException => "运行时异常"
      case e :Exception => "母鸡"
    }finally {
      message = "到此为止"
      "无论是否有异常,都会执行finally里语句"
    }
    println(result)
    println(message)
  }
  def mx():Unit = {
    throw new RuntimeException("故意抛出一个运行时异常")
  }
}
- 执行程序,查看结果(此时有异常result取的是catch里的返回值:运行时异常
finally语句块执行了的,因此message可以打印出来:到此为止

注释掉mx()方法里的语句

六、match结构
(一)语法格式
变量 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的值。
(二)案例演示
任务:给城市下评语
- 在net.zhj.day02包里创建Example14对象
package net.zhj.day02
import scala.io.StdIn
object Example14 {
  def main(args: Array[String]): Unit = {
    print("输入一个城市:")
    val city = StdIn.readLine()
    val comment = city match {
      case "北京" => "首都"
      case "上海" => "魔都"
      case "广州" => "妖都"
      case "泸州" => "酒城"
      case _ => "普通城市"
    }
    println(city + comment)
  }
}

七、变量作用域
(一)Java变量作用域
- Java中根据不同大括号区分变量作用范围,不允许有叠加,外部看不到内部,内部能看到外部。
1、内部能访问外部
- 代码块里能访问代码块之前定义的变量

2、外部不能访问内部
- 在net.zhj.day02包创建Example16对象

 
                   
                   
                   
                   
                             本文介绍了Scala编程中的条件表达式,包括if-else结构及其返回值特性,以及块表达式的执行情况。同时讲解了for循环的单重和双重循环用法,展示了如何遍历、计算和输出。此外,还提到了异常处理机制和match结构的应用。
本文介绍了Scala编程中的条件表达式,包括if-else结构及其返回值特性,以及块表达式的执行情况。同时讲解了for循环的单重和双重循环用法,展示了如何遍历、计算和输出。此外,还提到了异常处理机制和match结构的应用。
          
 
       
           
                 
                 
                 
                 
                 
                
               
                 
                 
                 
                 
                
               
                 
                 扫一扫
扫一扫
                     
              
             
                   1364
					1364
					
 被折叠的  条评论
		 为什么被折叠?
被折叠的  条评论
		 为什么被折叠?
		 
		  到【灌水乐园】发言
到【灌水乐园】发言                                
		 
		 
    
   
    
   
             
            


 
            