目录
一、条件表达式
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、外部不能访问内部
八、课后复习
- 课后熟悉上述所讲内容,并独自练习一遍。