scala编程--计算级数&统计学生成绩


案例1:计算级数

1.1 案例要求

级数计算函数实现较为简单,这里不再赘述,注意返回值直接用变量名返回,无需调用return;
在输入时,使用readInt函数从控制台输入要求的级数,调用函数打印计算结果。

1.2 实现代码

object demo2 {
    
    
  //计算级数函数
  def Series(n:Int) = {
    
    
    var sum = 0.0
    var i = 1.0
    while (sum < n) {
    
    
      sum += (i+1)/i
      i += 1
    }
    //返回值:无需使用return,直接返回
    sum
  }

  def main(args: Array[String]): Unit = {
    
    
    //读取用户输入
    var n = readInt()
    var sum = Series(n)
    //打印输出:保留6位小数
    printf("%.6f",sum)
  }
}

案例2:统计学生成绩

1.1 案例要求

1)读取学生成绩:将学生成绩写入TXT文件,通过读取TXT文件将学生成绩放入到数组中;
注意:读取编码格式;

2)求成绩平均值:定义aver函数,实现求平均值;
注意:有现成的最值求值函数,无需自己编写实现;

3)统计学生成绩:将数组当中的各科成绩读取到缓冲数组中,对缓冲数组进行求最值平均的操作;
注意:使用缓冲数组进行操作,因为其为可变数组,便于操作;

1.2 实现代码

object demo3 {
    
    
  def main(args: Array[String]): Unit = {
    
    
    var file = readTxt("C:\\score.txt")
    static(file)

    //对男生和女生成绩做分别统计
    var file_males = file.toBuffer
    var file_females = file.toBuffer
    for(i <- 1 until file.length){
    
    
      var row = file(i)
      if (row.split('\t')(1) != "male"){
    
    
        file_males -= row
      }
      if (row.split('\t')(1) != "female"){
    
    
        file_females -= row
      }
    }

    println("males")
    static(file_males.toArray)

    println("females")
    static(file_females.toArray)
  }

  def static(file:Array[String])={
    
    
    //缓冲数组
    var course1 = ArrayBuffer[String]()
    var row = file(0).split('\t')
    for(i <- 2 until row.length){
    
    
      course1 += row(i)
    }
    val course = course1.toArray
    var data = dim2B(course.length)
    for(i <- 1 until file.length){
    
    
      row = file(i).split('\t')
      for(j <- 2 until row.length){
    
    
        data(j-2) += row(j).toDouble
      }
    }

    //在输出时,使用prinf的%-8s来给每个元素设置固定大小位置,实现数据打印上下对齐
    printf("%-8s\t%-8s\t%-8s\t%-8s\n","course","average","min","max")
    for(i <- 0 until course.length){
    
    
      printf("%-8s\t%-8s\t%-8s\t%-8s\n",course(i),aver(data(i).toArray),data(i).toArray.min,data(i).toArray.max)
    }
  }

  //二维数组
  def dim2B(rows : Int)={
    
    
    val d2  = new Array[ArrayBuffer[Double]](rows)
    for (k <-0 until rows ) {
    
    
      d2(k) = new ArrayBuffer[Double]()
    }
    d2
  }

  //读取文件
  def readTxt(filePath: String) ={
    
    
    //以指定的UTF-8字符集读取文件,第一个参数可以是字符串或者是java.io.File
    val source = Source.fromFile(filePath, "UTF-8")
    //将所有行放到数组中
    val lines = source.getLines().toArray
    source.close()
    lines
  }

  //数组求最大值最小值有现成函数调用,无需编写
  def max(a:Array[Double]):Double={
    
    
    var res = 0.0
    for(i <- a){
    
    
      if (i>res){
    
    
        res = i
      }
    }
    res.formatted("%.2f").toDouble
  }

  def min(a:Array[Double]):Double={
    
    
    var res = 100.0
    for(i <- a){
    
    
      if (i < res){
    
    
        res = i
      }
    }
    res.formatted("%.2f").toDouble
  }

  def aver(a:Array[Double]):Double={
    
    
    var res = 0.0
    for(i <- a){
    
    
      res = res + i
    }
    (res/a.length).formatted("%.2f").toDouble
  }

}


总结

在输出时,使用c语言风格的printf来统一小数位数;以及使用prinf的%-8s来给每个元素设置固定大小位置,实现数据打印上下对齐!使打印结果更加美观!

猜你喜欢

转载自blog.csdn.net/weixin_49588575/article/details/130614827