import scala.io.StdIn
object spark2_1
{
def main(args: Array[String])
{
var Sum=0.0
println("请输入q的值")
var q:Int=StdIn.readInt()
var i=1.0
while(Sum<q)
{
Sum=Sum+(i+1)/i
i=i+1
}
println("--------------------------")
printf("级数的前n项和为:%f \n",Sum)
}
}

 

 

 

 

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"Circle center:(${location.x},${location.y}),R=$radius")
}

override def zoom(scale:Double)
{
radius=radius*scale //对圆的缩放只用修改半径
}
}

object spark2_2
{
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
}

}

 

 

 

 

object spark2_3
{
def main(args:Array[String])
{
//假设数据在当前目录下
val inputFile=scala.io.Source.fromFile("H:/scala/test2_3.txt")

//"\\s"是字符串正则表达式,将每行按空白字符(包括空格/制表符)分开
//由于可能涉及多次遍历,通toList将Itertor装为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


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)

}

}