zoukankan      html  css  js  c++  java
  • spark实验(二)--scala实验(3)

    实验1,计算级数:

    首先打开安装完scala ide的eclipse,在eclipse 中新建一个scala project。

    然后新建一个scala的object对象

    导入scala.io.StdIn包,用以实现接受键盘输入

     在新建的object对象中,新建main函数,并添加以下代码实现:

    package sn
    import scala.io.StdIn
    
    object test {
      def main(args: Array[String]): Unit = {
          println("请输入Sn的n值用以计算Sn=2/1+3/2+4/3+...+(n+1)/n来计算Sn的值");
          var q:Int=StdIn.readInt();
          var i:Int=0;
          var sum:Float=0.0f;
          for(i <- 1 to q)
          {
            var id:Float =i;
            sum+=(id+1)/id;
          }
          println("当n="+q+"时,Sn的值为"+sum);
      }
    }

    运行结果:

    实验2,模拟图形绘制 

    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     
        } 
    } 

    其Shape,Line和Circle的定义如下:

    abstract class Shape(var startPoint:Point) extends Drawable
    {
      def moveTo(newPoint:Point)
      {
        startPoint =newPoint;
      }
      def zoom(num:Double);
    }
    class Line(x1:Point,var x2:Point) extends Shape(x1) 
    {
      override def zoom(num:Double)
      {
        val midPoint=Point((x2.x+startPoint.x)/2,(x2.y+startPoint.y)/2)
        startPoint.x=midPoint.x+num*(startPoint.x-midPoint.x)
        startPoint.y=midPoint.y+num*(startPoint.y-midPoint.y)
        x2.x=midPoint.x+num*(x2.x-midPoint.x)
        x2.y=midPoint.y+num*(x2.y-midPoint.y)
      }
      override def moveTo(newPoint:Point)
      {
        var x=(newPoint.x-startPoint.x);
        var y=(newPoint.y-startPoint.y);
        startPoint=newPoint;
        x2.shift(x, y)
      }
      override def draw()
      {
        println(s"Line:(${startPoint.x},${startPoint.y})--(${x2.x},${x2.y})") 
      }
        
    }
    
    class Circle(center:Point,var radius:Double) extends Shape(center)
    {
      override def draw()
      {
        println(s"Circle center:(${startPoint.x},${startPoint.y}),R=$radius") 
      }
      override def zoom(num:Double)
      {
        radius*=num;
      }
    }

    运行截图:

     实验3, 统计学生成绩 

    object Count {
        def main(args: Array[String]): Unit = {
    
                // 假设数据文件在当前目录下
                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${r
                                esult._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)
        }
    }
  • 相关阅读:
    [转]C#里 泛型Where和 new()的使用
    测试
    C#中的static、readonly与const的比较
    将字符串格式化变为两位
    在VS中对字段进行包装
    安装mysql的心得
    关于mysql数据库的乱码问题
    timestamp的两个属性:CURRENT_TIMESTAMP 和ON UPDATE CURRENT_TIMESTAMP
    解决向数据库mysql插入double数据小数点不显示问题
    JDBOOK
  • 原文地址:https://www.cnblogs.com/halone/p/12256164.html
Copyright © 2011-2022 走看看