Scala中的输入与输出

在Scala中经常会涉及到变量值的输入和输出,输入是指通过键盘将数据信息传送到Scala环境的内存中,输出则是指将内存中的数据返回到指定的地方(如电脑屏幕、本地文件或数据库等)。
两种输入方法

  • 通过等号赋值的方法,向变量中传递值
  • 调用scala.io.StdIn包中的read类函数,在屏幕中完成数据的输入

举例

import scala.io.StdIn._  // 下划线代表StdIn包内的所有函数object InPut {      def main(args: Array[String]): Unit = {        // 方法一:等号赋值法        val name : String = "刘顺祥"        // 方法二:函数输入法        println("请输入您的年龄:")        val age = readInt()  // 输入不同数据类型的值,所使用的函数不一样        println("亲爱的" + name + "先生,您的年龄为" + age + "岁")    }}

两种输出方法

  • 直接调用变量名的名称,但该方法只能在交互的REPL中执行
  • 借助于打印函数,该方法又可以衍生出三种用法,即:

a) println,结合加号(+),将多个内容进行连接并打印输出
b) println,传入表达式(表达式中所涉及的变量必须以美元符号作前缀),
其中表达式须用大括号框起来,同时需要在被打印对象的最前面加上字母s 
c) printf,格式化输出,类似于Python的用法

举例

object OutPut {    def main(args : Array[String]) : Unit = {        val name = "刘顺祥"        val balance = 6.52        // 加号(+)拼接法        println("亲爱的" + name + "先生,您的话费余额为" + balance + "元。")        // s表达式法        println(s"亲爱的${name}先生,您的话费余额为${balance}元")        // 格式化输出法         printf("亲爱的%s先生,您的话费余额为%.2f元\n", name, balance)    }}

需要注意的是,在Scala中,打印函数println和print的区别在于前者打印完会自动换行,而后者却不能换行,如需换行必须在打印内容的结尾添加\n。

Scala中的控制流

在Scala编程中,会经常使用到控制流技术,基于该技术,可以轻松地解决很多重复性的工作。本文主要分享有关控制流中的if分支、for循环和while循环。
if分支
if分支主要包含三种,分别是单分支、双分支和多分支,语法如下:

// 单分支if (condition) {  expression  }// 双分支if (condition) {expression1} else {expression2}// 多分支(以三支为例)if (condition1) {expression1} else if (condition2) {expression2} else {expression3}

举例

import scala.io.StdInobject IfBranch01 {  def main(args: Array[String]): Unit = {  // 判断用户是否登录成功    println("请输入用户名:")    val name = StdIn.readLine()    println("请输入密码:")    val passwd = StdIn.readLine()    if (name == "scala" && passwd == "12345678") {      println("登录成功!欢迎来到学习乐园")    }    // 判断学员是否通过科目二考试    println("请输入您的考试成绩:")    val score = StdIn.readInt()    if (score >= 90) {      println("恭喜您,考试合格!")    } else {      println("很遗憾,下次继续努力哦!")    }    // 根据用户的年龄,判断其所处的年龄段    println("请输入您的年龄:")    val age = StdIn.readInt()    if (age < 18){      println("未成年")    } else if (age <= 45) {      println("青壮年")    } else if (age <= 65) {      println("中老年")    } else {      println("老年")    }  }}

我们再举一个嵌套的例子,假设某旅游区在设置票价时,按照如下规则:如果游客在旺季(3~10月份)来此地旅游,并且他是学生,则票价为80元,否则为150元;如果在淡季,学生票价为50元,否则为100元。该如何利用嵌套的if分支来完成呢?代码如下:

object IfBranch02 {  def main(args: Array[String]): Unit = {    println("请输入月份:")    val month = StdIn.readInt()    println("请问是否为学生:")    val is_student = StdIn.readLine()    if (month >= 3 && month <= 10){      if (is_student == "否") {        println("您的票价是150元")      } else {        println("您的票价是80元")      }    } else {      if (is_student == "否") {        println("您的票价是100元")      } else {        println("您的票价是50元")      }    }  }}

for循环
for循环在某个迭代对象已知的情况下,执行的的重复性操作。语法如下:

for (i <- iterable) {      expression    }

举例

object ForLoop {    def main(args: Array[String]): Unit = {    // 统计1...100的所有偶数中,是3的倍数的个数,以及这些数的总和    var counts = 0    var sum = 0    for (i <- 2 to 100 by 2) {      if (i % 3 == 0) {        counts += 1        sum += i      }    }    printf("1...100的偶数中,是3的倍数的个数为%d个\n", counts)    printf("这些数值的总和为%d\n", sum)    // 打印99乘法口诀    for (i <- 1 to 9) {      for (j <- 1 to i) {        print(j + "*" + i + "=" + (i*j) + "\t")      }      println()    }    // 将列表中的每个元素做平方除以5的操作,并将运算结果保存到变量res中    val X = List(10,8,23,17,7)    val res = for (i <- X) yield {      (i * i)/5.0    }    println("res = " + res)   }}

while循环
在前文介绍了for循环的使用,除此while循环也可以实现重复性操作。所不同的是,for循环主要解决已知可迭代对象的循环问题,而while循环则主要针对未知迭代对象的循环问题,语法如下:

// while循环的语法初始化计数器  while (condition) {    expression    计数器叠加    }// do...while的语法初始化计数器  do {    expression    计数器叠加    }   while (condition)

举例

import scala.io.StdInimport scala.util.control.Breaks._object WhileLoop {    def main(args: Array[String]): Unit = {    // 计算1...100的和    var i = 1    var sum = 0    while (i <= 100) {      sum += i      i += 1    }    println("1...100的总和为:" + sum)    // 用户登录邮箱,一共5次机会,如果输错则继续等待输入,并返回剩余登录次数    breakable{      var counts = 0      while (true) {        println("请输入用户名:")        val user = StdIn.readLine()        println("请输入密码:")        val passwd = StdIn.readLine()        if (user == "scala" && passwd == "123abc") {          println("恭喜您,登录成功!")          break()        } else {          if (counts < 4) {            printf(s"输入的用户名或密码错误!您还剩${4 - counts}次输入机会!\n")          } else {            println("输入的用户名或密码错误!,请24小时之后再尝试!")            break()          }        }        counts += 1      }    }  }}

具有编程经验的你来说,通常在while循环中经常会用到break做强制退出,遗憾的是Scala中没有break关键词,只有break函数,该函数的目的是抛出异常,最终再由breakable函数处理。需要注意的是,break函数的调用需要导入import scala.util.control.Breaks._。

结语

本期的内容就介绍到这里,如果你有任何问题,欢迎在公众号的留言区域表达你的疑问。同时,也欢迎各位朋友继续转发与分享文中的内容,让更多的人学习和进步。

每天进步一点点:数据分析1480

大数据之脚踏实地学13--Scala控制流_while循环