目录
一、设计题
1.scala数据库编程
2.编写应用程序实现数据去重
3.编写应用程序实现求平均值问题
二、测试数据
1.data.txt
2. A.txt、B.txt
A.txt:
B.txt:
3.Algorithm.txt,Database.txt,Python.txt
Algorithm.txt:
Database.txt:
Python.txt
三、题目代码:
1.第一题:
2.第二题:
3.第三题
一、设计题
1.scala数据库编程
本作业提供分析数据data.txt,该数据集包含了某大学计算机系的成绩,数据格式如下所示:
Tom,Database,80
Tom,Algorithm,50
Tom,DataStructure,60
Jim,Database,90
Jim,Algorithm,60
Jim,DataStructure,80
……
请根据给定的实验数据,在scala中通过编程来计算以下内容:
(1)该系总共有多少学生;
(2)该系共开设了多少门课程;
(3)Tom同学的总成绩平均分是多少;
(4)求每名同学的选修的课程门数;
(5)该系Database课程共有多少人选修;
(6)各门课程的平均分是多少;
(7)使用累加器计算共有多少人选了Database这门课。
对于两个输入文件A和B,编写Scala应用程序,对两个文件进行合并,并剔除其中重复的内容,得到一个新文件C。本文给出三门课的成绩(A.txt、B.txt)下面是输入文件和输出文件的一个样例,供参考。
输入文件A的样例如下:
20200101 x
20200102 y
20200103 x
20200104 y
20200105 z
20200106 z
输入文件B的样例如下:
20200101 y
20200102 y
20200103 x
20200104 z
20200105 y
根据输入的文件A和B合并得到的输出文件C的样例如下:
20200101 x
20200101 y
20200102 y
20200103 x
20200104 y
20200104 z
20200105 y
20200105 z
20200106 z
每个输入文件表示班级学生某个学科的成绩,每行内容由两个字段组成,第一个是学生名字,第二个是学生的成绩;编写Scala应用程序求出所有学生的平均成绩,并输出到一个新文件中。本文给出三门课的成绩(Algorithm.txt、Database.txt、Python.txt),下面是输入文件和输出文件的一个样例,供参考。
Algorithm成绩:
小明 92
小红 87
小新 82
小丽 90
Database成绩:
小明 95
小红 81
小新 89
小丽 85
Python成绩:
小明 82
小红 83
小新 94
小丽 91
平均成绩如下:
(小红,83.67)
(小新,88.33)
(小明,89.67)
(小丽,88.67)
二、测试数据测试数据可以自己定义
1.data.txtTom,Database,80
Tom,Algorithm,50
Tom,DataStructure,60
Jim,Database,90
Jim,Algorithm,60
Jim,DataStructure,80
Su,Database,82
Su,Algorithm,70
Su,DataStructure,90
Su,Python,70
Jack,Database,92
Jack,Algorithm,68
Jack,DataStructure,82
Lily,Database,88
Lily,Algorithm,52
Lily,DataStructure,66
Lily,Python,68
Lucy,Database,92
Lucy,Algorithm,60
Lucy,DataStructure,80
Lucy,Python,72
Mark,Database,88
Mark,Algorithm,56
Mark,DataStructure,68
Mark,Python,68
Bill,Database,90
Bill,Algorithm,60
Bill,DataStructure,82
Henry,Database,86
Henry,Algorithm,78
Henry,DataStructure,88
Gary,Database,92
Gary,Algorithm,68
Gary,DataStructure,86
Charles,Database,82
Charles,Algorithm,78
Charles,DataStructure,70
Linda,Database,90
Linda,Algorithm,88
Linda,DataStructure,88
20200101 x
20200102 y
20200103 x
20200104 y
20200105 z
20200106 z
20200107 x
20200107 z
20200101 y
20200102 y
20200103 x
20200104 z
20200105 y
20200107 x
20200107 y
小明 92
小红 87
小新 82
小丽 90
小明 95
小红 81
小新 89
小丽 85
小明 82
小红 83
小新 94
小丽 91
package answer //引用mutable函数用于调用Map import scala.collection.mutable import scala.io.{Source, StdIn} //引用可变数组 import scala.collection.mutable.ArrayBuffer object Answer1 { def main(args: Array[String]): Unit = { val filePath = "C:\Users\17591\Desktop\scala\data.txt" val info = readFromTxtByLine(filePath) var flag = true var key = ' ' do { println("请选择要展示的答案:") println("1. Q1,该系有多少名学生?") println("2. Q2,该系开设几门课程?") println("3. Q3,求TOM同学平均分?") println("4. Q4:求每位同学选课门数?") println("5. Q5&7:求database选修人数?") println("6. Q6:求各科平均分?") println("按其他键退出") println("请输入:") //获取编号 key = StdIn.readChar() key match { case '1' => numberOfStudents(info) case '2' => numberOfCourses(info) case '3' => val name = "Tom" tomAverageScore(info,name) case '4' => courseCount(info) case '5' => val course = "Database" databaseCourse(info, course) case '6' => averageScore(info) case _ => flag = false } } while (flag) } //定义read方法读取txt文档数据 def readFromTxtByLine(filePath: String): Array[String] = { // 指定编码格式 val source = Source.fromFile(filePath, "UTF-8") //将所有行存放到数组中 val lines = source.getLines().toArray source.close() lines } // Q1,该系有多少名学生?:遍历信息数组info,然后将名字存入到名字数组中,数组长度即为学生人数 def numberOfStudents(info: Array[String]): Unit = { // 定义可变数组用于存储名字信息 val name = ArrayBuffer[String]() var s = "" // 遍历info数组 for (i <- info.indices) { // 对每条信息进行处理,以","分割,第一个元素即为名称 s = info(i).split(",")(0) // 仅当名字第一次出现才存入到名字数组,保证姓名唯一 if (!name.contains(s)) { name += s } } // 解答 println("1. 该系总共有多少学生? 答: " + name.length) println("分别有:") // 遍历打印名字信息 for (i <- name) { println(i) } } // Q2,该系开设几门课程?:遍历信息数组info,然后将课程存入到课程数组中,数组长度即为课程数 def numberOfCourses(info: Array[String]): Unit = { // 定义可变数组用于存储课程信息 var courses = ArrayBuffer[String]() var s = "" // 遍历info数组 for (i <- info.indices) { // 对每条信息进行处理,以","分割,第二个元素即为课程名 s = info(i).split(",")(1) // 仅当课程第一次出现才存入到课程数组,保证课程名唯一 if (!courses.contains(s)) { courses += s } } // 解答 println("2. 该系开设几门课程? 答: " + courses.length) println("分别有:") // 遍历打印课程信息 for (i <- courses) { println(i) } } // Q3,求TOM同学平均分:遍历信息数组info,找出名字为Tom的一行信息将其分数存入到分数数组中,然后求平均分 def tomAverageScore(info: Array[String], name: String): Unit = { // 定义可变数组用于存储分数信息 var score = ArrayBuffer[String]() var s = "" for (i <- info.indices) { //遍历名字信息 s = info(i).split(",")(0) // 若名字为Tom,则将分数存入到分数数组中 if (s == name) { // 信息分割后的第三个元素就是分数 score += info(i).split(",")(2) } } // 得到Tom各科分数后遍历数组求平均分 var sum: Float = 0 for (i <- score) { //因为获取的分数是字符型,所以要将其转化为整型再求和 sum += i.toFloat } // 求平均分并保留两位小数 val avg = (sum / score.length).formatted("%.2f") //解答 println("3. TOM同学平均分是? 答: " + avg) println("分数有:") for (i <- score) { println(i) } } // Q4:求每位同学选课门数:遍历信息数组info,将名字,课程数信息存入到map中。然后遍历输出 def courseCount(info: Array[String]): Unit = { // 定义map var map = mutable.Map[String, Int]() var name = "" for (i <- info.indices) { // 获取info第一个分割后的信息,即名字 name = info(i).split(",")(0) // 若名字在map中则课程数+1,否则将信息添加到map中 if (map.contains(name)) { map(name) += 1 } else { map += (name -> 1) } } // 解答 println("4. 每位同学的选课门数是? 答: ") for ((key, value) <- map) { println(s"$key 同学共有 $value 门课程。") } println() } // Q5&7:求database选修人数:遍历信息数组info,如果发现了选修了该课程的同学则选修总数+1即可 def databaseCourse(info: Array[String], course: String): Unit = { var sum = 0 var cos = "" for (i <- info) { // 遍历info信息的名字,若名字为Database则累加器加一 cos = i.split(",")(1) if (cos == course) { sum += 1 } } // 解答 println("5,7.选修了database的人数是? 答: " + sum) println("分别有:") for (i <- info) { cos = i.split(",")(1) if (cos == course) { // 如果成功匹配则输出他们的名字 println(i.split(",")(0)) } } } // Q6:求各科平均分:遍历信息数组info,将相同课程的分数相加,同时记录课程出现次数,然后进行求平均分 def averageScore(info: Array[String]) { // 定义score用于存放分数,用浮点型是为了能够更精确的表示分数 var score = mutable.Map[String, Float]() var count = mutable.Map[String, Int]() var course = "" // 定义浮点型sco,它是存储分数的中间变量 var sco:Float = 0 for (i <- info.indices) { course = info(i).split(",")(1) // 记录每一行的分数,并将它转换成浮点型数据 sco = info(i).split(",")(2).toFloat if (score.contains(course)) { score(course) += sco count(course) += 1 } else { score += (course -> sco) count += (course -> 1) } } // 解答 var avg:Float = 0 println("6. 求各科平均分, 答:") for(i <- score.keys){ avg = score(i) / count(i) // 格式化输出,保留两位小数 println(s"$i 课程的平均分是 ${avg.formatted("%.2f")}") } } }2.第二题:
package answer import scala.collection.mutable.ArrayBuffer import scala.io.Source object Answer2 { def main(args: Array[String]): Unit = { val filepath1 = "C:\Users591\Desktop\scala\A.txt" val filepath2 = "C:\Users591\Desktop\scala\B.txt" val infoA = readFromTxtByLine(filepath1) val infoB = readFromTxtByLine(filepath2) println("A.txt 信息打印如下:") printInformation(infoA) println("B.txt 信息打印如下:") printInformation(infoB) println("A.txt B.txt 合并后信息打印如下:") unionAndPrint(infoA,infoB) } //定义read方法读取txt文档数据 def readFromTxtByLine(filePath: String): Array[String] = { // 指定编码格式 val source = Source.fromFile(filePath, "UTF-8") //将所有行存放到数组中 val lines = source.getLines().toArray source.close() lines } //遍历打印数据信息 def printInformation(info: Array[String]): Unit ={ println("______________________________") for(i <- info){ println(i) } println("______________________________") } //取两数组的并集进行输出 def unionAndPrint(info1: Array[String],info2: Array[String]): Unit ={ // 定义可变数组 var info = ArrayBuffer[String]() // 先存放数组一的信息 for (i <- info1) { info += i } // 再存放与数组一信息不相同的数组二信息 for (i <- info2){ // 若这条信息第一次出现,则存放入info数组中 if (! info.contains(i)) { info += i } } // 遍历输出结果 println("______________________________") for(i <- info){ println(i) } } }3.第三题
package answer import scala.collection.mutable import scala.collection.mutable.ArrayBuffer import scala.io.Source object Answer3 { def main(args: Array[String]): Unit = { val filepath1 = "C:\Users\17591\Desktop\scala\Python.txt" val filepath2 = "C:\Users\17591\Desktop\scala\Database.txt" val filepath3 = "C:\Users\17591\Desktop\scala\Algorithm.txt" println("python 学科的信息如下:") // readFromTxtByLine(filepath)返回的是一个课程里面的信息,将这个信息传给printInformation方法进行打印 printInformation(readFromTxtByLine(filepath1)) println("Database 学科的信息如下:") printInformation(readFromTxtByLine(filepath2)) println("Algorithm 学科的信息如下:") printInformation(readFromTxtByLine(filepath3)) // 定义info变量接收合并所有信息后的可变数组 val info = union(readFromTxtByLine(filepath1),readFromTxtByLine(filepath2),readFromTxtByLine(filepath3)) // 将包含所有学科信息的可变数组交给processInformation方法处理 processInformation(info) } //定义read方法读取txt文档数据 def readFromTxtByLine(filePath: String): Array[String] = { // 指定编码格式 val source = Source.fromFile(filePath, "UTF-8") //将所有行存放到数组中 val lines = source.getLines().toArray source.close() lines } //定义union方法,用于合并各科信息,返回的是一个可变数组。 def union(info1: Array[String],info2: Array[String],info3: Array[String]): ArrayBuffer[String] ={ var info = ArrayBuffer[String]() // 遍历传递进来的各个学科信息,将其合并存放起来 for(i <- info1){ // 遍历后发现资料给出的一组数据包含一行空值,要将其过滤掉 if(i != ""){ info += i } } for(i <- info2){ if(i != ""){ info += i } } for(i <- info3){ if(i != ""){ info += i } } // 最后返回该数组 info } def printInformation(info: Array[String]): Unit ={ //遍历打印每个学科信息 println("______________________________") for(i <- info){ println(i) } println("______________________________") } def processInformation(info:ArrayBuffer[String]): Unit ={ // 定义两个map,分别记录学生的总成绩和学科数 var score = mutable.Map[String, Float]() var count = mutable.Map[String, Int]() var name = "" // 定义浮点型sco,它是存储分数的中间变量 var sco:Float = 0 for (i <- info) { // 对信息分割,第一个元素是姓名,第二个元素是分数 name = i.split(" ")(0) sco = i.split(" ")(1).toFloat // 姓名不是第一次出现说明map里面有数据所以要总分加上该分数,学科数加一 if (score.contains(name)) { score(name) += sco count(name) += 1 } // 姓名第一次出现则对数据初始化,总分等于该分数,学科数等于一 else { score += (name -> sco) count += (name -> 1) } } // 将两个map传递给averageScore方法求平均分 averageScore(score,count) } def averageScore(score:mutable.Map[String, Float],count:mutable.Map[String, Int]): Unit ={ var avg:Float = 0 println("以下同学的平均成绩如下:") // 遍历学生姓名,另其总分除以学科数,得出结果 for(i <- score.keys){ avg = score(i) / count(i) // 格式化输出,取小数点后两位 println(i +"的平均成绩为: " + avg.formatted("%.2f")) } } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)