文件读写-成绩分析

54 阅读2分钟

案例:现在需要对班级学生的成绩(姓名,语文,数学,英语)做统一的规范化处理,内容保存。任务如下:

  1. 计算每个同学的总分和平均分
  2. 统计每个科目的平均分
  3. 列出总分前3名和单科前3名,并保存结果到文件中

学生的成绩示例:

姓名,语文,数学,英语
张伟,87,92,88
李娜,90,85,95
王强,78,90,82

步骤

分成三步来完成按行读入,并拆分。

(1)组装对象数组

(2)对对象数组做数据处理

(3)保存结果到文件

一.按行读取文本文件

我们可以一次读入一行,以下是读取文件并打印每一行的示例:

import scala.io.Source
object SourceReadExample {
  def main(args: Array[String]) {
    val source = Source.fromFile("input.txt")
    for (line <- source.getLines()) {
      println(line)
    }
    source.close()
  }}

二.组装数据对象

思路:定义case class 分别去new 对象,并赋值

case class Student(name:String, yuwen:Double, shuxue: Double, yingyu:Double) 
    val source = Source.fromFile("input.txt")
    for (line <- source.getLines()) {
      val(name, yuwen, shuxue, yingyu) = line.split(",")
      stuList += Student(name, yuwen, shuxue, yingyu)
  }
}

分析数据

任务1:计算每个人的总分和平均分

for(s <-studentList) {
 total = s.yuwen + s.shuxue + s.yingyu
 avg = total / 3
}

任务2:统计每个科目的平均分

思路: (1)对List中的每个学生,使用foreach计算每门课程的成绩 (2)除以总数

任务3:列出总分前3名和单科前3名

思路:对数组进行三次不同的排序,对应得到三个不同的排序数组。 操作:使用sortBy函数进行排序

package Luwenzhen
import java.io.FileWriter
object wenjian16 {
  case class Stu(name:String,yuwen:Double,shuxue:Double,yingyu:Double,zongfen:Double)
  def main(args: Array[String]): Unit = {
    //1.读出项目根目录下的score.txt文件
    val lines=scala.io.Source.fromFile("score.txt").getLines()

    //跳过第一行,它表示表头
    lines.next()
    //按行读取
    val stuList=scala.collection.mutable.ListBuffer[Stu]()
    while(lines.hasNext){
      val line=lines.next()
      val list=line.split(",")
      val total=list(1).toDouble+list(2).toDouble+list(3).toDouble
//      println(s"姓名:${list(0)}")
//      println(s"语文:${list(1)}")
//      println(s"数学:${list(2)}")
//      println(s"英语:${list(3)}")
      stuList+=Stu(list(0),list(1).toDouble,list(2).toDouble,list(3).toDouble,total)
    }
    //3.写入结果到新的文件
    val fileWriter=new FileWriter("score_result.txt")

    //总分降序排序输出
    fileWriter.write(s"xxxxx班级成绩分析表\n\n")
    stuList.sortBy(_.zongfen).reverse.foreach(stu=>{
      val avg=stu.zongfen/3
      fileWriter.write((s"${stu.name},语文:${stu.yuwen}分 英语:${stu.yingyu}分 总分:${stu.zongfen} 平均分:${avg}\n"))
    })

    stuList.foreach(stu=>{
      val total=stu.yingyu+stu.shuxue+stu.yuwen
      val avg=total/3
      fileWriter.write((s"${stu.name},语文:${stu.yuwen}分 数学:${stu.yingyu}分 总分:${total} 平均分:${avg}\n"))
    })
    //输出各学科平均分
    fileWriter.write(s"英语平均分:${stuList.map(_.yingyu).sum/stuList.length} 数学平均分:${stuList.map(_.shuxue).sum/stuList.length} 语文平均分:${stuList.map(_.yuwen).sum/stuList.length} \n")
    //输出英语最高分
    fileWriter.write(s"英语最高分:${stuList.map(_.yingyu).max} 数学平均分:${stuList.map(_.shuxue).max} 语文平均分:${stuList.map(_.yuwen).max} \n")
    fileWriter.close()
  }
}