Scala文件读写——成绩分析

海哥  金牌会员 | 2024-11-27 05:05:14 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 826|帖子 826|积分 2478

根据文件办理下例问题





1.读入txt文件:按行读入
  1. import scala.io.Source
  2. object Test文件读写_成绩分析 {
  3.   def main(args: Array[String]): Unit = {
  4.     //1.按行读入
  5.     val source = Source.fromFile("score.txt")
  6.     val it = source.getLines()
  7.     it.next()//跳过第一行
  8.     while (it.hasNext){
  9.       println(it.next())
  10.     }
  11.     source.close()
  12.   }
  13. }
复制代码
2.处理数据:
        (1)盘算每个同学的总分和平均分
  1. import scala.collection.mutable.ListBuffer
  2. import scala.io.Source
  3. case class Student(name: String, yuwen: Double, shuxue: Double, yingyu: Double, total: Double, avg: Double)
  4. //案例分析:统计成绩
  5. object Test文件读写_成绩分析 {
  6.   def main(args: Array[String]): Unit = {
  7.     //可变List,保存索引的学生数据
  8.     val studentList = ListBuffer[Student]()
  9.     //1.按行读入
  10.     val source = Source.fromFile("score.txt")
  11.     val it = source.getLines()//迭代器
  12.     it.next()//跳过第一行
  13.     while (it.hasNext){
  14.       val arr = it.next().split(",")//中文的逗号
  15.       val name = arr(0)
  16.       val yuwen = arr(1).toDouble
  17.       val shuxue = arr(2).toDouble
  18.       val yingyu = arr(3).toDouble
  19.       val total = yuwen + shuxue +yingyu //计算总分
  20.       val avg = total / 3  //计算平均分
  21.       //println(name,yuwen,shuxue,yingyu,total,avg)
  22.       val s = Student(name,yuwen,shuxue,yingyu,total,avg)
  23.       studentList +=s
  24.     }
  25.     source.close()
  26.     studentList.foreach(println)
  27.   }
  28. }
复制代码
        (2)每个科目的平均分
  1. import scala.collection.mutable.ListBuffer
  2. import scala.io.Source
  3. case class Student(name: String, yuwen: Double, shuxue: Double, yingyu: Double, total: Double, avg: Double)
  4. //案例分析:统计成绩
  5. object Test文件读写_成绩分析 {
  6.   def main(args: Array[String]): Unit = {
  7.     //可变List,保存索引的学生数据
  8.     val studentList = ListBuffer[Student]()
  9.     //1.按行读入
  10.     val source = Source.fromFile("score.txt")
  11.     val it = source.getLines()//迭代器
  12.     it.next()//跳过第一行
  13.     while (it.hasNext){
  14.       val arr = it.next().split(",")//中文的逗号
  15.       val name = arr(0)
  16.       val yuwen = arr(1).toDouble
  17.       val shuxue = arr(2).toDouble
  18.       val yingyu = arr(3).toDouble
  19.       val total = yuwen + shuxue +yingyu //计算总分
  20.       val avg = total / 3  //计算平均分
  21.       //println(name,yuwen,shuxue,yingyu,total,avg)
  22.       val s = Student(name,yuwen,shuxue,yingyu,total,avg)
  23.       studentList +=s
  24.     }
  25.     source.close()
  26.     //计算单科总分
  27.     var avgYuwen:Double = 0
  28.     var avgShuxue:Double = 0
  29.     var avgYingyu:Double = 0
  30.     studentList.foreach(s=>{
  31.       avgYuwen += s.yuwen
  32.       avgShuxue += s.shuxue
  33.       avgYingyu +=s.yingyu
  34.     })
  35.     println("语文平均分",avgYuwen/studentList.length)
  36.     println("数学平均分",avgShuxue/studentList.length)
  37.     println("英语平均分",avgYingyu/studentList.length)
  38.   }
  39. }
复制代码
        (3)总分前三名
  1. import scala.collection.mutable.ListBuffer
  2. import scala.io.Source
  3. case class Student(name: String, yuwen: Double, shuxue: Double, yingyu: Double, total: Double, avg: Double)
  4. //案例分析:统计成绩
  5. object Test文件读写_成绩分析 {
  6.   def main(args: Array[String]): Unit = {
  7.     //可变List,保存索引的学生数据
  8.     val studentList = ListBuffer[Student]()
  9.     //1.按行读入
  10.     val source = Source.fromFile("score.txt")
  11.     val it = source.getLines()//迭代器
  12.     it.next()//跳过第一行
  13.     while (it.hasNext){
  14.       val arr = it.next().split(",")//中文的逗号
  15.       val name = arr(0)
  16.       val yuwen = arr(1).toDouble
  17.       val shuxue = arr(2).toDouble
  18.       val yingyu = arr(3).toDouble
  19.       val total = yuwen + shuxue +yingyu //计算总分
  20.       val avg = total / 3  //计算平均分
  21.       //println(name,yuwen,shuxue,yingyu,total,avg)
  22.       val s = Student(name,yuwen,shuxue,yingyu,total,avg)
  23.       studentList +=s
  24.     }
  25.     source.close()
  26.     //计算单科总分
  27.     var avgYuwen:Double = 0
  28.     var avgShuxue:Double = 0
  29.     var avgYingyu:Double = 0
  30.     studentList.foreach(s=>{
  31.       avgYuwen += s.yuwen
  32.       avgShuxue += s.shuxue
  33.       avgYingyu +=s.yingyu
  34.     })
  35.     println("语文平均分",avgYuwen/studentList.length)
  36.     println("数学平均分",avgShuxue/studentList.length)
  37.     println("英语平均分",avgYingyu/studentList.length)
  38.     //总分前三名
  39.     //思路:1.对所有的同学按总分从高到低排名
  40.     val list1 =studentList.sortWith((a,b)=>a.total > b.total).slice(0,3)
  41.     println("总分从高到低排名前三:")
  42.     list1.foreach(println)
  43.    
  44.    
  45.   }
  46. }
复制代码
        (4)单科的前三名
  1. package scala_mianx
  2. import scala.collection.mutable.ListBuffer
  3. import scala.io.Source
  4. case class Student(name: String, yuwen: Double, shuxue: Double, yingyu: Double, total: Double, avg: Double)
  5. //案例分析:统计成绩
  6. object Test文件读写_成绩分析 {
  7.   def main(args: Array[String]): Unit = {
  8.     //可变List,保存索引的学生数据
  9.     val studentList = ListBuffer[Student]()
  10.     //1.按行读入
  11.     val source = Source.fromFile("score.txt")
  12.     val it = source.getLines()//迭代器
  13.     it.next()//跳过第一行
  14.     while (it.hasNext){
  15.       val arr = it.next().split(",")//中文的逗号
  16.       val name = arr(0)
  17.       val yuwen = arr(1).toDouble
  18.       val shuxue = arr(2).toDouble
  19.       val yingyu = arr(3).toDouble
  20.       val total = yuwen + shuxue +yingyu //计算总分
  21.       val avg = total / 3  //计算平均分
  22.       //println(name,yuwen,shuxue,yingyu,total,avg)
  23.       val s = Student(name,yuwen,shuxue,yingyu,total,avg)
  24.       studentList +=s
  25.     }
  26.     source.close()
  27.     //计算单科总分
  28.     var avgYuwen:Double = 0
  29.     var avgShuxue:Double = 0
  30.     var avgYingyu:Double = 0
  31.     studentList.foreach(s=>{
  32.       avgYuwen += s.yuwen
  33.       avgShuxue += s.shuxue
  34.       avgYingyu +=s.yingyu
  35.     })
  36.     println("语文平均分",avgYuwen/studentList.length)
  37.     println("数学平均分",avgShuxue/studentList.length)
  38.     println("英语平均分",avgYingyu/studentList.length)
  39.     //总分前三名
  40.     //思路:1.对所有的同学按总分从高到低排名
  41.     val list1 =studentList.sortWith((a,b)=>a.total > b.total).slice(0,3)
  42.     println("总分从高到低排名前三:")
  43.     list1.foreach(println)
  44.     //单科成绩前三名
  45.     //语文成绩前三名
  46.     val list2 = studentList.sortWith((a,b)=> a.yuwen>b.yuwen).slice(0,3)
  47.     println("语文总分从高到低排名前三:")
  48.     list2.foreach(println)
  49.     //数学成绩前三名
  50.     val list3 = studentList.sortWith((a,b)=> a.shuxue>b.shuxue).slice(0,3)
  51.     println("数学总分从高到低排名前三:")
  52.     list3.foreach(println)
  53.     //英语成绩前三名
  54.     val list4 = studentList.sortWith((a,b)=> a.yingyu>b.yingyu).slice(0,3)
  55.     println("英语总分从高到低排名前三:")
  56.     list4.foreach(println)
  57.   }
  58. }
复制代码
3.把效果写入文件
  1. package scala_mianx
  2. import java.io.PrintWriter
  3. import scala.collection.mutable.ListBuffer
  4. import scala.io.Source
  5. case class Student(name: String, yuwen: Double, shuxue: Double, yingyu: Double, total: Double, avg: Double)
  6. //案例分析:统计成绩
  7. object Test文件读写_成绩分析 {
  8.   def main(args: Array[String]): Unit = {
  9.     //可变List,保存索引的学生数据
  10.     val studentList = ListBuffer[Student]()
  11.     //1.按行读入
  12.     val source = Source.fromFile("score.txt")
  13.     val it = source.getLines()//迭代器
  14.     it.next()//跳过第一行
  15.     while (it.hasNext){
  16.       val arr = it.next().split(",")//中文的逗号
  17.       val name = arr(0)
  18.       val yuwen = arr(1).toDouble
  19.       val shuxue = arr(2).toDouble
  20.       val yingyu = arr(3).toDouble
  21.       val total = yuwen + shuxue +yingyu //计算总分
  22.       val avg = total / 3  //计算平均分
  23.       //println(name,yuwen,shuxue,yingyu,total,avg)
  24.       val s = Student(name,yuwen,shuxue,yingyu,total,avg)
  25.       studentList +=s
  26.     }
  27.     source.close()
  28.     //计算单科总分
  29.     var avgYuwen:Double = 0
  30.     var avgShuxue:Double = 0
  31.     var avgYingyu:Double = 0
  32.     studentList.foreach(s=>{
  33.       avgYuwen += s.yuwen
  34.       avgShuxue += s.shuxue
  35.       avgYingyu +=s.yingyu
  36.     })
  37.     println("语文平均分",avgYuwen/studentList.length)
  38.     println("数学平均分",avgShuxue/studentList.length)
  39.     println("英语平均分",avgYingyu/studentList.length)
  40.     //总分前三名
  41.     //思路:1.对所有的同学按总分从高到低排名
  42.     val list1 =studentList.sortWith((a,b)=>a.total > b.total).slice(0,3)
  43.     println("总分从高到低排名前三:")
  44.     list1.foreach(println)
  45.     //单科成绩前三名
  46.     //语文成绩前三名
  47.     val list2 = studentList.sortWith((a,b)=> a.yuwen>b.yuwen).slice(0,3)
  48.     println("语文总分从高到低排名前三:")
  49.     list2.foreach(println)
  50.     //数学成绩前三名
  51.     val list3 = studentList.sortWith((a,b)=> a.shuxue>b.shuxue).slice(0,3)
  52.     println("数学总分从高到低排名前三:")
  53.     list3.foreach(println)
  54.     //英语成绩前三名
  55.     val list4 = studentList.sortWith((a,b)=> a.yingyu>b.yingyu).slice(0,3)
  56.     println("英语总分从高到低排名前三:")
  57.     list4.foreach(println)
  58.     //写入文件
  59.     val writer=new PrintWriter("统计成绩的结果")
  60.     writer.println("姓名,语文,数学,英语,总分,平均分")
  61.     studentList.foreach(s =>{
  62.       val avg =String.format("%.1f",s.avg)  //只保留一位有效数字
  63.       writer.println(s"${s.name},${s.yuwen},${s.shuxue},${s.yingyu},${s.total},${avg}")
  64.     })
  65.     writer.println("-"*40)
  66.     writer.close()  //关闭文件
  67.   }
  68. }
复制代码
代码整合

  1. import java.io.PrintWriter
  2. import scala.collection.mutable.ListBuffer
  3. import scala.io.Source
  4. case class Student(name: String, yuwen: Double, shuxue: Double, yingyu: Double, total: Double, avg: Double)
  5. //案例分析:统计成绩
  6. object Test文件读写_成绩分析 {
  7.   def main(args: Array[String]): Unit = {
  8.     //可变List,保存索引的学生数据
  9.     val studentList = ListBuffer[Student]()
  10.     //1.按行读入
  11.     val source = Source.fromFile("score.txt")
  12.     val it = source.getLines()//迭代器
  13.     it.next()//跳过第一行
  14.     while (it.hasNext){
  15.       val arr = it.next().split(",")//中文的逗号
  16.       val name = arr(0)
  17.       val yuwen = arr(1).toDouble
  18.       val shuxue = arr(2).toDouble
  19.       val yingyu = arr(3).toDouble
  20.       val total = yuwen + shuxue +yingyu //计算总分
  21.       val avg = total / 3  //计算平均分
  22.       //println(name,yuwen,shuxue,yingyu,total,avg)
  23.       val s = Student(name,yuwen,shuxue,yingyu,total,avg)
  24.       studentList +=s
  25.     }
  26.     source.close()
  27.     //计算单科总分
  28.     var avgYuwen:Double = 0
  29.     var avgShuxue:Double = 0
  30.     var avgYingyu:Double = 0
  31.     studentList.foreach(s=>{
  32.       avgYuwen += s.yuwen
  33.       avgShuxue += s.shuxue
  34.       avgYingyu +=s.yingyu
  35.     })
  36.     println("语文平均分",avgYuwen/studentList.length)
  37.     println("数学平均分",avgShuxue/studentList.length)
  38.     println("英语平均分",avgYingyu/studentList.length)
  39.     //总分前三名
  40.     //思路:1.对所有的同学按总分从高到低排名
  41.     val list1 =studentList.sortWith((a,b)=>a.total > b.total).slice(0,3)
  42.     println("总分从高到低排名前三:")
  43.     list1.foreach(println)
  44.     //单科成绩前三名
  45.     //语文成绩前三名
  46.     val list2 = studentList.sortWith((a,b)=> a.yuwen>b.yuwen).slice(0,3)
  47.     println("语文总分从高到低排名前三:")
  48.     list2.foreach(println)
  49.     //数学成绩前三名
  50.     val list3 = studentList.sortWith((a,b)=> a.shuxue>b.shuxue).slice(0,3)
  51.     println("数学总分从高到低排名前三:")
  52.     list3.foreach(println)
  53.     //英语成绩前三名
  54.     val list4 = studentList.sortWith((a,b)=> a.yingyu>b.yingyu).slice(0,3)
  55.     println("英语总分从高到低排名前三:")
  56.     list4.foreach(println)
  57.     //写入文件
  58.     val writer=new PrintWriter("统计成绩的结果")
  59.     writer.println("姓名,语文,数学,英语,总分,平均分")
  60.     studentList.foreach(s =>{
  61.       val avg =String.format("%.1f",s.avg)  //只保留一位有效数字
  62.       writer.println(s"${s.name},${s.yuwen},${s.shuxue},${s.yingyu},${s.total},${avg}")
  63.     })
  64.     writer.println("-"*40)
  65.     //总分前三名
  66.     list1.foreach(s=>{
  67.     val avg =String.format("%.1f",s.avg)  //只保留一位有效数字
  68.     writer.println(s"${s.name},${s.yuwen},${s.shuxue},${s.yingyu},${s.total},${avg}")
  69.     })
  70.     writer.println("-"*40)
  71.     //语文前三名
  72.     list2.foreach(s=>{
  73.     val avg =String.format("%.1f",s.avg)  //只保留一位有效数字
  74.     writer.println(s"${s.name},${s.yuwen},${s.shuxue},${s.yingyu},${s.total},${avg}")
  75.     })
  76.     writer.println("-"*40)
  77.     //数学前三名
  78.     list3.foreach(s=>{
  79.     val avg =String.format("%.1f",s.avg)  //只保留一位有效数字
  80.     writer.println(s"${s.name},${s.yuwen},${s.shuxue},${s.yingyu},${s.total},${avg}")
  81.     })
  82.     writer.println("-"*40)
  83.     //英语前三名
  84.     list4.foreach(s=>{
  85.       val avg =String.format("%.1f",s.avg)  //只保留一位有效数字
  86.       writer.println(s"${s.name},${s.yuwen},${s.shuxue},${s.yingyu},${s.total},${avg}")
  87.     })
  88.     writer.println("-"*40)
  89.     writer.close()  //关闭文件
  90.   }
  91. }
复制代码
运行效果:


任务分析

在本课内容的底子上,增补两门新课(Java,scala)的成绩,并完成
1.总分和平均分的盘算
2.单科成绩的前5名排名
3.每个学生的在班级的团体排名
  1. import java.io.PrintWriter
  2. import scala.collection.mutable.ListBuffer
  3. import scala.io.Source
  4. case class Student(name: String, yuwen: Double, shuxue: Double, yingyu: Double,java:Double,scala:Double, total: Double, avg: Double)
  5. //案例分析:统计成绩
  6. object Test文件读写_成绩分析 {
  7.   def main(args: Array[String]): Unit = {
  8.     //可变List,保存索引的学生数据
  9.     val studentList = ListBuffer[Student]()
  10.     //1.按行读入
  11.     val source = Source.fromFile("score.txt")
  12.     val it = source.getLines()//迭代器
  13.     it.next()//跳过第一行
  14.     while (it.hasNext){
  15.       val arr = it.next().split(",")//中文的逗号
  16.       val name = arr(0)
  17.       val yuwen = arr(1).toDouble
  18.       val shuxue = arr(2).toDouble
  19.       val yingyu = arr(3).toDouble
  20.       val java = arr(4).toDouble
  21.       val scala = arr(5).toDouble
  22.       val total = yuwen + shuxue +yingyu //计算总分
  23.       val avg = total / 5  //计算平均分
  24.       //println(name,yuwen,shuxue,yingyu,total,avg)
  25.       val s = Student(name,yuwen,shuxue,yingyu,java,scala,total,avg)
  26.       studentList +=s
  27.     }
  28.     source.close()
  29.     //计算单科总分
  30.     var avgYuwen:Double = 0
  31.     var avgShuxue:Double = 0
  32.     var avgYingyu:Double = 0
  33.     var avgJava:Double = 0
  34.     var avgScala:Double = 0
  35.     studentList.foreach(s=>{
  36.       avgYuwen += s.yuwen
  37.       avgShuxue += s.shuxue
  38.       avgYingyu +=s.yingyu
  39.       avgJava +=s.java
  40.       avgScala +=s.scala
  41.     })
  42.     println("语文平均分",avgYuwen/studentList.length)
  43.     println("数学平均分",avgShuxue/studentList.length)
  44.     println("英语平均分",avgYingyu/studentList.length)
  45.     println("java平均分",avgJava/studentList.length)
  46.     println("scala平均分",avgScala/studentList.length)
  47.     //总分前三名
  48.     //思路:1.对所有的同学按总分从高到低排名
  49.     val list1 =studentList.sortWith((a,b)=>a.total > b.total).slice(0,3)
  50.     println("总分从高到低排名前三:")
  51.     list1.foreach(println)
  52.     //单科成绩前三名
  53.     //语文成绩前三名
  54.     val list2 = studentList.sortWith((a,b)=> a.yuwen>b.yuwen).slice(0,3)
  55.     println("语文总分从高到低排名前3:")
  56.     list2.foreach(println)
  57.     //数学成绩前三名
  58.     val list3 = studentList.sortWith((a,b)=> a.shuxue>b.shuxue).slice(0,3)
  59.     println("数学总分从高到低排名前三:")
  60.     list3.foreach(println)
  61.     //英语成绩前三名
  62.     val list4 = studentList.sortWith((a,b)=> a.yingyu>b.yingyu).slice(0,3)
  63.     println("英语总分从高到低排名前三:")
  64.     list4.foreach(println)
  65.     //java成绩前5名
  66.     val list5 = studentList.sortWith((a,b)=> a.java>b.java).slice(0,5)
  67.     println("英语总分从高到低排名前三:")
  68.     list4.foreach(println)
  69.     //scala成绩前5名
  70.     val list6 = studentList.sortWith((a,b)=> a.scala>b.scala).slice(0,5)
  71.     println("英语总分从高到低排名前三:")
  72.     list4.foreach(println)
  73.     //写入文件
  74.     val writer=new PrintWriter("统计成绩的结果")
  75.     writer.println("姓名,语文,数学,英语,java,scala总分,平均分")
  76.     studentList.foreach(s =>{
  77.       val avg =String.format("%.1f",s.avg)  //只保留一位有效数字
  78.       writer.println(s"${s.name},${s.yuwen},${s.shuxue},${s.yingyu},${s.java},${s.scala},${s.total},${avg}")
  79.     })
  80.     writer.println("-"*40)
  81.     //总分前三名
  82.     list1.foreach(s=>{
  83.     val avg =String.format("%.1f",s.avg)  //只保留一位有效数字
  84.     writer.println(s"${s.name},${s.yuwen},${s.shuxue},${s.yingyu},${s.java},${s.scala},${s.total},${avg}")
  85.     })
  86.     writer.println("-"*40)
  87.     //语文前三名
  88.     list2.foreach(s=>{
  89.     val avg =String.format("%.1f",s.avg)  //只保留一位有效数字
  90.     writer.println(s"${s.name},${s.yuwen},${s.shuxue},${s.yingyu},${s.java},${s.scala},${s.total},${avg}")
  91.     })
  92.     writer.println("-"*40)
  93.     //数学前三名
  94.     list3.foreach(s=>{
  95.     val avg =String.format("%.1f",s.avg)  //只保留一位有效数字
  96.     writer.println(s"${s.name},${s.yuwen},${s.shuxue},${s.yingyu},${s.java},${s.scala},${s.total},${avg}")
  97.     })
  98.     writer.println("-"*40)
  99.     //英语前三名
  100.     list4.foreach(s=>{
  101.       val avg =String.format("%.1f",s.avg)  //只保留一位有效数字
  102.       writer.println(s"${s.name},${s.yuwen},${s.shuxue},${s.yingyu},${s.java},${s.scala},${s.total},${avg}")
  103.     })
  104.     writer.println("-"*40)
  105.     //java前三名
  106.     list5.foreach(s=>{
  107.       val avg =String.format("%.1f",s.avg)  //只保留一位有效数字
  108.       writer.println(s"${s.name},${s.yuwen},${s.shuxue},${s.yingyu},${s.java},${s.scala},${s.total},${avg}")
  109.     })
  110.     writer.println("-"*40)
  111.     //scala前三名
  112.     list6.foreach(s=>{
  113.       val avg =String.format("%.1f",s.avg)  //只保留一位有效数字
  114.       writer.println(s"${s.name},${s.yuwen},${s.shuxue},${s.yingyu},${s.java},${s.scala},${s.total},${avg}")
  115.     })
  116.     writer.println("-"*40)
  117.     writer.close()  //关闭文件
  118.   }
  119. }
复制代码











免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

海哥

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表