2020寒假學習記錄(5)——Scala實驗2-3統計學生成績


一、統計學生成績

學生的成績清單格式如下所示,第一行為表頭,各字段意思分別為學號、性別、課程名 1、課程名 2 等,后面每一行代表一個學生的信息,各字段之間用空白符隔開

Id  gender  Math    English   Physics    

301610    male   80      64        78 

301611  female   65      87        58 

...

給定任何一個如上格式的清單(不同清單里課程數量可能不一樣),要求盡可能采用函 數式編程,統計出各門課程的平均成績,最低成績,和最高成績;另外還需按男女同學分開, 分別統計各門課程的平均成績,最低成績,和最高成績。

測試樣例一:

test.txt文件

Id  gender  Math    English   Physics    
301610    male   80      64        78 
301611  female   65      87        58 
301612  female   44      71        77 
301613  female   66      71        91 
301614  female   70      71       100 
301615    male   72      77        72 
301616  female   73      81        75 
301617  female   69      77        75 
301618    male   73      61        65 
301619    male   74      69        68 
301620    male   76      62        76 
301621    male   73      69        91 
301622    male   55      69        61 
301623    male   50      58        75 
301624  female   63      83        93 
301625    male   72      54       100 
301626    male   76      66        73 
301627    male   82      87        79 
301628  female   62      80        54 
301629    male   89      77        72

 

程序源代碼:

object scoreReport{
 def main(args: Array[String]) {
  val inputFile = scala.io.Source.fromFile("test.txt")
  //”\\s+“是字符串正則表達式,將每行按空白字符(包括空格/制表符)分開
  // 由於可能涉及多次遍歷,同 toList 將 Iterator 裝為 List
  // originalData 的類型為 List[Array[String]]
  val originalData = inputFile.getLines.map{_.split("\\s+")} .toList 
  val courseNames = originalData.head.drop(2) //獲取第一行中的課程名
  val allStudents = originalData.tail // 去除第一行剩下的數據
  val courseNum = courseNames.length
  // 統計函數,參數為需要常用統計的行
  //用到了外部變量 courseNum,屬於閉包函數
  def statistc(lines:List[Array[String]])= {
   // for 推導式,對每門課程生成一個三元組,分別表示總分,最低分和最高分
   (for(i<- 2 to courseNum+1) yield { 
     // 取出需要統計的列
     val temp = lines map {elem=>elem(i).toDouble} 
     (temp.sum,temp.min,temp.max)
    }) map {case (total,min,max) => (total/lines.length,min,max)
   } // 最后一個 map 對 for 的結果進行修改,將總分轉為平均分
  }
  // 輸出結果函數
  def printResult(theresult:Seq[(Double,Double,Double)]){
  // 遍歷前調用 zip 方法將課程名容器和結果容器合並,合並結果為二元組容器
  (courseNames zip theresult) foreach {
   case (course,result)=>
    println(f"${course+":"}%-10s${result._1}%5.2f${result._2}%8.2f${result._3}%8.2f")
   } 
  }
  // 分別調用兩個函數統計全體學生並輸出結果
  val allResult = statistc(allStudents)
  println("course average min max")
  printResult(allResult)
 
  //按性別划分為兩個容器
  val (maleLines,femaleLines) = allStudents partition 
  {_(1)=="male"} 
  // 分別調用兩個函數統計男學生並輸出結果
  val maleResult = statistc(maleLines)
  println("course average min max")
  printResult(maleResult)
  // 分別調用兩個函數統計男學生並輸出結果
  val femaleResult = statistc(femaleLines)
  println("course average min max")
  printResult(femaleResult)
 } 
}

 

運行結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM