- 3.1 条件判断
- 3.2 循环控制
- 3.3 中断循环
3.1 条件判断
- if 条件判断 :单分支(if)、双分支(if…else…)、多分支(if … else if … else)
- 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 循环控制
- for循环
- while循环
- 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 种 常见 中断循环的方式
- 使用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
}
- 使用嵌套函数以及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()
}
- 使用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
随机从键盘输入十个数字,对它们进行排序(从大到小)