寒假学习2
厦门大学林子雨,赖永炫,陶继平 编著
《Spark 编程基础(Scala 版)》
教材配套
机房上机实验指南
实验 2 Scala 编程初级实践
(版本号:2018 年 7 月 19 日版本)
(题目)
主讲教师:林子雨
厦门大学数据库实验室
二零一八年七月
目录
一、实验目的 ..................................................................................................................................1
二、实验平台 ..................................................................................................................................1
三、实验内容和要求 ......................................................................................................................1
1. 计算级数.............................................................................................................................1
2. 模拟图形绘制.....................................................................................................................1
3. 统计学生成绩.....................................................................................................................3
四、实验报告 ..................................................................................................................................4
附录 1:任课教师介绍 ......................................................................................................................5
附录 2:课程教材介绍....................................................................................................................5
附录 3:高校大数据课程公共服务平台介绍................................................................................6
主讲教师:林子雨
http://www.cs.xmu.edu.cn/linziyu
第 1 页
厦门大学林子雨,赖永炫,陶继平 编著《Spark 编程基础(Scala 版)》 教材配套机房上机实验指南
实验 2 Scala 编程初级实践
厦门大学林子雨,赖永炫,陶继平 编著
《Spark 编程基础(Scala 版)》
第 2 章 Scala 语言基础
教材配套机房上机实验指南
实验 2 Scala 编程初级实践
(题目)
E-mail: ziyulin@xmu.edu.cn 个人主页:http://www.cs.xmu.edu.cn/linziyu
一、实验目的
1.掌握 Scala语言的基本语法、数据结构和控制结构;
2.掌握面向对象编程的基础知识,能够编写自定义类和特质;
3.掌握函数式编程的基础知识,能够熟练定义匿名函数。熟悉 Scala的容器类库的基本
层次结构,熟练使用常用的容器类进行数据;
4.熟练掌握 Scala的 REPL运行模式和编译运行方法。
二、实验平台
已经配置完成的 Scala开发环境。Scala版本为 2.11.8.
三、实验内容和要求
1. 计算级数
请用脚本的方式编程计算并输出下列级数的前 n项之和 Sn,直到 Sn刚好大于或等于 q
为止,其中 q为大于 0的整数,其值通过键盘输入。
2 3 4
n +1
S = + + + +
n
1 2 3
n
例 如 , 若 q 的 值 为 50.0, 则 输 出 应 为 : Sn=50.416695。 请 将 源 文 件 保 存 为
exercise2-1.scala,在REPL模式下测试运行,测试样例:q=1时,Sn=2;q=30时,Sn=30.891459;
q=50时,Sn=50.416695。
2. 模拟图形绘制
对于一个图形绘制程序,用下面的层次对各种实体进行抽象。定义一个 Drawable的特
质,其包括一个 draw方法,默认实现为输出对象的字符串表示。定义一个 Point类表示点,
其混入了 Drawable特质,并包含一个 shift方法,用于移动点。所有图形实体的抽象类为
主讲教师:林子雨
http://www.cs.xmu.edu.cn/linziyu
第 1 页
厦门大学林子雨,赖永炫,陶继平 编著《Spark 编程基础(Scala 版)》 教材配套机房上机实验指南
实验 2 Scala 编程初级实践
Shape,其构造函数包括一个 Point类型,表示图形的具体位置(具体意义对不同的具体图
形不一样)。Shape类有一个具体方法 moveTo和一个抽象方法 zoom,其中 moveTo将图形从
当前位置移动到新的位置, 各种具体图形的 moveTo可能会有不一样的地方。zoom方法实
现对图形的放缩,接受一个浮点型的放缩倍数参数,不同具体图形放缩实现不一样。继承
Shape类的具体图形类型包括直线类 Line和圆类 Circle。Line类的第一个参数表示其位置,
第二个参数表示另一个端点,Line放缩的时候,其中点位置不变,长度按倍数放缩(注意,
缩放时,其两个端点信息也改变了),另外,Line的 move行为影响了另一个端点,需要对
move方法进行重载。Circle类第一个参数表示其圆心,也是其位置,另一个参数表示其半
径,Circle缩放的时候,位置参数不变,半径按倍数缩放。另外直线类 Line和圆类 Circle
都混入了 Drawable特质,要求对 draw进行重载实现,其中类 Line的 draw输出的信息样式
为“Line:第一个端点的坐标--第二个端点的坐标)”,类 Circle的 draw输出的信息样式为
“Circle center:圆心坐标,R=半径”。如下的代码已经给出了 Drawable和 Point的定义,
同时也给出了程序入口 main函数的实现,请完成 Shape类、Line类和 Circle类的定义。
case class Point(var x:Double,var y:Double) extends Drawable{
def shift(deltaX:Double,deltaY:Double){x+=deltaX;y+=deltaY}
}
trait Drawable{
def draw(){println(this.toString)}
}
// 请完成 Shape类、Line类和 Circle类的定义。
object MyDraw{
def main(args: Array[String]) {
val p=new Point(10,30)
p.draw;
val line1 = new Line(Point(0,0),Point(20,20))
line1.draw
line1.moveTo(Point(5,5)) //移动到一个新的点
line1.draw
line1.zoom(2) //放大两倍
line1.draw
val cir= new Circle(Point(10,10),5)
cir.draw
cir.moveTo(Point(30,20))
cir.draw
cir.zoom(0.5)
cir.draw
}
}
编译运行程序,期望的输出结果如下:
Point(10.0,30.0)
Line:(0.0,0.0)--(20.0,20.0)
Line:(5.0,5.0)--(25.0,25.0)
Line:(-5.0,-5.0)--(35.0,35.0)
Circle center:(10.0,10.0),R=5.0
主讲教师:林子雨
http://www.cs.xmu.edu.cn/linziyu
第 2 页
厦门大学林子雨,赖永炫,陶继平 编著《Spark 编程基础(Scala 版)》 教材配套机房上机实验指南
实验 2 Scala 编程初级实践
Circle center:(30.0,20.0),R=5.0
Circle center:(30.0,20.0),R=2.5
3. 统计学生成绩
学生的成绩清单格式如下所示,第一行为表头,各字段意思分别为学号、性别、课程名
1、课程名 2等,后面每一行代表一个学生的信息,各字段之间用空白符隔开
Id
gender Math
English
64
Physics
78
58
301610
male
80
65
301611 female
...
87
给定任何一个如上格式的清单(不同清单里课程数量可能不一样),要求尽可能采用函
数式编程,统计出各门课程的平均成绩,最低成绩,和最高成绩;另外还需按男女同学分开,
分别统计各门课程的平均成绩,最低成绩,和最高成绩。
测试样例 1如下:
Id
gender Math
male
English
64
Physics
78
301610
80
65
44
66
70
72
73
69
73
74
76
73
55
50
63
72
76
82
62
89
301611 female
301612 female
301613 female
301614 female
87
58
77
91
100
72
75
75
65
68
76
91
61
75
93
100
73
79
54
72
71
71
71
301615
male
77
301616 female
301617 female
81
77
301618
301619
301620
301621
301622
301623
male
male
male
male
male
male
61
69
62
69
69
58
301624 female
83
301625
301626
301627
male
male
male
54
66
87
301628 female
301629 male
样例 1的统计结果输出为:
80
77
course
Math:
average
69.20
min
44.00
54.00
max
89.00
87.00
English: 71.70
Physics: 76.65
54.00 100.00
course
Math:
average
72.67
min
50.00
54.00
max (males)
89.00
English: 67.75
87.00
主讲教师:林子雨
http://www.cs.xmu.edu.cn/linziyu
第 3 页
厦门大学林子雨,赖永炫,陶继平 编著《Spark 编程基础(Scala 版)》 教材配套机房上机实验指南
实验 2 Scala 编程初级实践
Physics: 75.83
61.00 100.00
course
Math:
average
64.00
min
44.00
71.00
max (females)
73.00
87.00
English: 77.63
Physics: 77.88
54.00 100.00
测试样例 2
Id
gender Math
English Physics Science
301610
301611
male 72
male 75
39
85
79
89
63
82
81
100
72
39
88
88
49
80
80
69
59
76
89
74
74
93
91
61
58
70
63
81
63
59
48
92
66
83
56
86
93
79
78
78
93
26
57
62
64
31
72
59
100
87
48
46
78
88
69
49
51
100
57
80
301612 female 85
301613 female 63
301614
301615
male 72
male 99
301616 female 100
301617 male 74
301618 female 68
301619 male 63
301620 female 84
301621
301622
301623
male 71
male 82
male 63
301624 female 86
301625
301626
male 76
male 91
301627 female 92
301628
301629
male 79
male 85
样例 2的统计结果为:
course
Math:
average min max
79.00 63.00 100.00
English: 74.05 39.00 100.00
Physics: 73.60 48.00 93.00
Science: 65.85 26.00 100.00
course
Math:
average min max
77.08 63.00 99.00
English: 70.46 39.00 100.00
Physics: 77.77 58.00 93.00
Science: 62.23 26.00 93.00
course
Math:
average min max
82.57 63.00 100.00
English: 80.71 72.00 89.00
Physics: 65.86 48.00 91.00
Science: 72.57 48.00 100.00
四、实验报告
《Spark编程基础》实验报告
主讲教师:林子雨
http://www.cs.xmu.edu.cn/linziyu
第 4 页
厦门大学林子雨,赖永炫,陶继平 编著《Spark 编程基础(Scala 版)》 教材配套机房上机实验指南
实验 2 Scala 编程初级实践
题目:
姓名:
日期:
实验环境:
解决问题的思路:
实验内容与完成情况:
出现的问题:
解决方案(列出遇到的问题和解决办法,列出没有解决的问题):
附录 1:任课教师介绍
林子雨(1978-),男,博士,厦门大学计算机科学系助理教授,主要研究领域为
数据库,数据仓库,数据挖掘,大数据
主讲课程:《大数据处理技术》
办公地点:厦门大学海韵园科研 2 号楼
E-mail: ziyulin@xmu.edu.cn
个人主页:http://www.cs.xmu.edu.cn/linziyu
数据库实验室网站:http://dblab.xmu.edu.cn
附录 2:课程教材介绍
林子雨、赖永炫、陶继平编著《Spark 编程基础(Scala 版)》
人民邮电出版社 ISBN:978-7-115-48816-9 定价:49.80 元
厦门大学林子雨、赖永炫和陶继平老师编著《Spark 编程基础》,以 Scala 作为开发 Spark
应用程序的编程语言,系统介绍了 Spark 编程的基础知识。全书共 8 章,内容包括大数据技
术概述、Scala 语言基础、Spark 的设计与运行原理、Spark 环境搭建和使用方法、RDD 编程、
Spark SQL、Spark Streaming、Spark MLlib 等。本书每个章节都安排了入门级的编程实践操
主讲教师:林子雨
http://www.cs.xmu.edu.cn/linziyu
第 5 页
厦门大学林子雨,赖永炫,陶继平 编著《Spark 编程基础(Scala 版)》 教材配套机房上机实验指南
实验 2 Scala 编程初级实践
作,以便读者更好地学习和掌握 Spark 编程方法。本书官网免费提供了全套的在线教学资源,
包括讲义 PPT、习题、源代码、软件、数据集、授课视频、上机实验指南等。
本书可以作为高等院校计算机、软件工程、数据科学与大数据技术等专业的进阶级大数
据课程教材,用于指导 Spark 编程实践,也可供相关技术人员参考。
欢迎访问《Spark 编程基础》教材官方网站:http://dblab.xmu.edu.cn/post/spark/
扫一扫访问教材官网
附录 3:高校大数据课程公共服务平台介绍
高校大数据课程公共服务平台,由中国高校首个“数字教师”的提出者和建设者——林
子雨老师发起,由厦门大学数据库实验室全力打造,由厦门大学云计算与大数据研究中心、
海峡云计算与大数据应用研究中心携手共建。这是国内第一个服务于高校大数据课程建设的
公共服务平台,旨在促进国内高校大数据课程体系建设,提高大数据课程教学水平,降低大
数据课程学习门槛,提升学生课程学习效果。平台服务对象涵盖高校、教师和学生。平台为
高校开设大数据课程提供全流程辅助,为教师开展教学工作提供一站式服务,为学生学习大
数据课程提供全方位辅导。平台重点打造“11 个 1 工程”,即 1 本教材(含官网)、1 个教师
服务站、1 个学生服务站、1 个公益项目、1 堂巡讲公开课、1 个示范班级、1 门在线课程、
1 个交流群(QQ 群、微信群)、1 个保障团队、1 个培训基地和 1 个实验平台。目前平台每
年访问量已经超过 100 万次,成为国内高校大数据教学知名品牌。
平台主页:http://dblab.xmu.edu.cn/post/bigdata-teaching-platform/
主讲教师:林子雨
http://www.cs.xmu.edu.cn/linziyu
第 6 页
厦门大学林子雨,赖永炫,陶继平 编著《Spark 编程基础(Scala 版)》 教材配套机房上机实验指南
实验 2 Scala 编程初级实践
扫一扫访问平台主页
主讲教师:林子雨
http://www.cs.xmu.edu.cn/linziyu



代码如下:
case class Point(var x:Double,var y:Double) extends Drawable{
	def shift(deltaX:Double,deltaY:Double){
		x+=deltaX;y+=deltaY
	}
}
trait Drawable{
	def draw(){
		println(this.toString)
	}
}
abstract class Shape(var location:Point){
//location是Shape的一个可变字段
	def moveTo(newLocation:Point){ 
		//默认实现,只是修改位置
		location = newLocation
	}
	def zoom(scale:Double)
}
class Line(beginPoint:Point,var endPoint:Point) extends
Shape(beginPoint) with Drawable{
	override def draw(){
		println(s"Line:(${location.x},${location.y})--(${endPoint.x},${endPoint.y})")
	} 
	//按指定格式重载click
	override def moveTo(newLocation:Point){
		endPoint.shift(newLocation.x - location.x,newLocation.y -location.y) 
		//直线移动时,先移动另外一个端点
		location = newLocation //移动位置
	}
	override def zoom(scale:Double){
		val midPoint = Point((endPoint.x + location.x)/2,(endPoint.y +location.y)/2) 
		//求出中点,并按中点进行缩放
		location.x = midPoint.x + scale * (location.x - midPoint.x)
		location.y = midPoint.y + scale * (location.y -midPoint.y)
		endPoint.x = midPoint.x + scale * (endPoint.x - midPoint.x)
		endPoint.y = midPoint.y + scale * (endPoint.y -midPoint.y)
	}
}
class Circle(center:Point,var radius:Double) extends Shape(center) with Drawable{
	override def draw(){
		//按指定格式重载click
		println(s"Circlecenter:(${location.x},${location.y}),R=$radius")
	}
	override def zoom(scale:Double){
		radius = radius*scale //对圆的缩放只用修改半径
	}
}
object MyDraw{
	def main(args: Array[String]) {
		val p=new Point(10,30)
		p.draw;
		val line1 = new Line(Point(0,0),Point(20,20))
		line1.draw
		line1.moveTo(Point(5,5)) //移动到一个新的点
		line1.draw
		line1.zoom(2) //放大两倍
		line1.draw
		val cir= new Circle(Point(10,10),5)
		cir.draw
		cir.moveTo(Point(30,20))
		cir.draw
		cir.zoom(0.5)
		cir.draw
	}
}
 
                    
                 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号