(Spark)Scala語言基礎


林子雨 實驗2 中的三道題(包含答案)

目錄:

一、計算級數

二、模擬圖形繪制

三、統計學生成績

環境:已經配置完成的Scala開發環境。Scala版本2.11.8  安裝教程

 

一、計算級數

問題:

請用腳本的方式編程計算並輸出下列級數的前 n 項之和 Sn,直到 Sn 剛好大於或等於 q

為止,其中 q 為大於 0 的整數,其值通過鍵盤輸入。

 

 

例 如 , 若 q 的 值 為 50.0 , 則 輸 出 應 為 : Sn=50.416695 。 請 將 源 文 件 保 存 為
exercise2-1.scala,在REPL模式下測試運行,測試樣例:q=1時,Sn=2;q=30時,Sn=30.891459;q=50 時,Sn=50.416695。
解答:
1、首先在scala目錄下新建mycode目錄 (即文件夾,如果按照文章頂部教程進行的scala安裝,則可以不執行此步),創建好后轉到該目錄下,操作命令如下:

 cd /usr/local/scala              #轉到scala目錄下(以將scala裝到了 /usr/local 目錄下為例)

sudo mkdir mycode             #新建mycode目錄

 cd mycode                          #轉到新建目錄下

 

2、賦予權限(方便后邊對該文件的操作)

 

 

 sudo chmod -R 777 /usr/local/scala/mycode       #777權限是用戶對相對應的文件進行寫入讀取和其他操作的權限,7就是表示所有的權限

 

3、新建文件並寫入代碼(vim基本使用

 

 

 

 vim test2.scala

寫入如下代碼后,保存並退出vim編輯器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import scala.io.StdIn
object  test2
{
     def main(args: Array[String])
     {
         var  Sum=0.0
         println( "請輸入n" )
         var  n:Long=StdIn.readLine().toLong
         var  i=1.0
         while (Sum<n)
         {
             var  mid=(i+i)/i
             Sum=Sum+(i+1)/i
             i=i+1
         }
         println( "**************************" )
         println( "計算級數為:" ,Sum)
     }
}

4、最后編譯運行,即可得出結果:

 

 

scalac test2.scala                          #編譯

scala -classpath . test2                  # 其中  "." 后面的test2是代碼中 object 后面的類名

 

二、模擬圖形繪制

問題:

對於一個圖形繪制程序,用下面的層次對各種實體進行抽象。定義一個 Drawable 的特質,其包括一個 draw 方法,默認實現為輸出對象的字符串表示。定義一個 Point 類表示點,其混入了 Drawable 特質,並包含一個 shift 方法,用於移動點。所有圖形實體的抽象類為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 類的定義。

解答:

1、新建文件,寫入代碼,編譯運行即可:

 

 

 vim test3.scala                      #新建文件

2、寫入如下代碼,保存並退出vim編輯器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
case  class  Point( var  x:Double , var  y:Double) extends Drawable{
     def shift(X:Double ,Y:Double){
         x += X
         y += Y
     }
}
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})" )
     }
     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()
     {
         println(s "Circle center:(${location.x},${location.y}),R=$radius" )
     }
     override  def zoom(scale :Double)
     {
         radius = radius*scale
     }
}
object  test3
{
     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 circle =  new  Circle(Point(10,10),5)
         circle.draw
         circle.moveTo(Point(30,20))
         circle.draw
         circle.zoom(0.5)
         circle.draw
     }
}

3、編譯並運行:

 

 

 4、結果如下:

 

 

 

三、統計學生成績

問題:

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

 

 

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

  測試樣例 1 如下:

 

 

 樣例1的統計結果輸出為:

 

 

 解答:

1、新建文件,寫入代碼,編譯運行即可:

 

 

 vim test4.scala                      #新建文件

2、寫入如下代碼,保存並退出vim編輯器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
import scala.collection.mutable.ArrayBuffer
   
object  test4 {
   def main(args: Array[String]): Unit = {
     var  students:ArrayBuffer[Student] =  new  ArrayBuffer[Student]()
     students.append( new  Student(301610,  "male" , 80, 64, 78))
     students.append( new  Student(301611,  "female" , 65, 87, 58))
     students.append( new  Student(301612,  "female" , 44, 71, 77))
     students.append( new  Student(301613,  "female" , 66, 71, 91))
     students.append( new  Student(301614,  "female" , 70, 71, 100))
     students.append( new  Student(301615,  "male" , 72, 77, 72))
     students.append( new  Student(301616,  "female" , 73, 81, 75))
     students.append( new  Student(301617,  "female" , 69, 77, 75))
     students.append( new  Student(301618,  "male" , 73, 61, 65))
     students.append( new  Student(301619,  "male" , 74, 69, 68))
     students.append( new  Student(301620,  "male" , 76, 62, 76))
     students.append( new  Student(301621,  "male" , 73, 69, 91))
     students.append( new  Student(301622,  "male" , 55, 69, 61))
     students.append( new  Student(301623,  "male" , 50, 58, 75))
     students.append( new  Student(301624,  "female" , 63, 83, 93))
     students.append( new  Student(301625,  "male" , 72, 54, 100))
     students.append( new  Student(301626,  "male" , 76, 66, 73))
     students.append( new  Student(301627,  "male" , 82, 87, 79))
     students.append( new  Student(301628,  "female" , 62, 80, 54))
     students.append( new  Student(301629,  "male" , 89, 77, 72))
     println(students.length)
     println(students(1).toString)
   
     getData(students)
     getDataMale(students)
     getDataFeMale(students)
   }
   def getData(value: ArrayBuffer[Student]): Unit ={
     var  Mathaverage:Double=0;
     var  MathSum:Double = 0;
     var  MathMin:Double = value(0).Math;
     var  MathMax:Double = 0;
   
     var  Englishaverage:Double=0;
     var  EnglishSum:Double = 0;
     var  EnglishMin:Double = value(0).English;
     var  EnglishMax:Double = 0;
   
     var  Physicsaverage:Double=0;
     var  PhysicsSum:Double = 0;
     var  PhysicsMin:Double = value(0).Physics;
     var  PhysicsMax:Double = 0;
   
     var  number = value.length;
     for  (i <- 0 until value.length){
       //三科總數
       MathSum = value(i).Math+MathSum
       EnglishSum = value(i).English+EnglishSum
       PhysicsSum = value(i).Physics+PhysicsSum
       //最大和最小
       if (value(i).Math>MathMax){
         MathMax=value(i).Math;
       }
       if (value(i).English>EnglishMax){
         EnglishMax=value(i).English;
       }
       if (value(i).Physics>PhysicsMax){
         PhysicsMax=value(i).Physics;
       }
       if (value(i).Math<MathMin){
         MathMin=value(i).Math;
       }
       if (value(i).English<EnglishMin){
         EnglishMin=value(i).English;
       }
       if (value(i).Physics<PhysicsMin){
         PhysicsMin=value(i).Physics;
       }
     }
     //平均值
     Mathaverage=MathSum/number
     Englishaverage=EnglishSum/number
     Physicsaverage=PhysicsSum/number
     println( "course\t average\t min\t max \t" )
     println( "Math:\t   " +Mathaverage+ "\t\t" +MathMin+ "\t " +MathMax)
     println( "English:\t" +Englishaverage+ "\t" +EnglishMin+ "\t " +EnglishMax)
     println( "Physics:\t" +Physicsaverage+ "\t" +PhysicsMin+ "\t " +PhysicsMax)
   }
   
   def getDataMale(value: ArrayBuffer[Student]): Unit = {
     var  Mathaverage: Double = 0;
     var  MathSum: Double = 0;
     var  MathMin: Double = value(0).Math;
     var  MathMax: Double = 0;
   
     var  Englishaverage: Double = 0;
     var  EnglishSum: Double = 0;
     var  EnglishMin: Double = value(0).English;
     var  EnglishMax: Double = 0;
   
     var  Physicsaverage: Double = 0;
     var  PhysicsSum: Double = 0;
     var  PhysicsMin: Double = value(0).Physics;
     var  PhysicsMax: Double = 0;
   
     var  number = 0;
   
     for  (i <- 0 until value.length) {
       if  (value(i).gender. equals ( "male" )) {
         number = number + 1
         //三科總數
         MathSum = value(i).Math + MathSum
         EnglishSum = value(i).English + EnglishSum
         PhysicsSum = value(i).Physics + PhysicsSum
         //最大和最小
         if  (value(i).Math > MathMax) {
           MathMax = value(i).Math;
         }
         if  (value(i).English > EnglishMax) {
           EnglishMax = value(i).English;
         }
         if  (value(i).Physics > PhysicsMax) {
           PhysicsMax = value(i).Physics;
         }
         if  (value(i).Math < MathMin) {
           MathMin = value(i).Math;
         }
         if  (value(i).English < EnglishMin) {
           EnglishMin = value(i).English;
         }
         if  (value(i).Physics < PhysicsMin) {
           PhysicsMin = value(i).Physics;
         }
       }
   
     }
     //平均值
     Mathaverage=MathSum/number
     Englishaverage=EnglishSum/number
     Physicsaverage=PhysicsSum/number
     println( "course\t average\t min\t max \t(Male)" )
     Mathaverage=Mathaverage.toInt
     Englishaverage=Englishaverage.toInt
     Physicsaverage=Physicsaverage.toInt
     println( "Math:\t   " +Mathaverage+ "\t\t" +MathMin+ "\t " +MathMax)
     println( "English:\t   " +Englishaverage+ "\t\t" +EnglishMin+ "\t " +EnglishMax)
     println( "Physics:\t   " +Physicsaverage+ "\t\t" +PhysicsMin+ "\t " +PhysicsMax)
   }
   
   def getDataFeMale(value: ArrayBuffer[Student]): Unit ={
     var  Mathaverage:Double=0;
     var  MathSum:Double = 0;
     var  MathMin:Double = value(1).Math;
     var  MathMax:Double = 0;
   
     var  Englishaverage:Double=0;
     var  EnglishSum:Double = 0;
     var  EnglishMin:Double = value(1).English;
     var  EnglishMax:Double = 0;
   
     var  Physicsaverage:Double=0;
     var  PhysicsSum:Double = 0;
     var  PhysicsMin:Double = value(1).Physics;
     var  PhysicsMax:Double = 0;
   
     var  number = 0;
   
     for  (i <- 0 until value.length){
       if (value(i).gender. equals ( "female" )){
         number=number+1
         //三科總數
         MathSum = value(i).Math+MathSum
         EnglishSum = value(i).English+EnglishSum
         PhysicsSum = value(i).Physics+PhysicsSum
         //最大和最小
         if (value(i).Math>MathMax){
           MathMax=value(i).Math;
         }
         if (value(i).English>EnglishMax){
           EnglishMax=value(i).English;
         }
         if (value(i).Physics>PhysicsMax){
           PhysicsMax=value(i).Physics;
         }
         if (value(i).Math<MathMin){
           MathMin=value(i).Math;
         }
         if (value(i).English<EnglishMin){
           EnglishMin=value(i).English;
         }
         if (value(i).Physics<PhysicsMin){
           PhysicsMin=value(i).Physics;
         }
       }
     }
     //平均值
     Mathaverage=MathSum/number
     Englishaverage=EnglishSum/number
     Physicsaverage=PhysicsSum/number
     println( "course\t average\t min\t max \t(FeMale)" )
     Mathaverage=Mathaverage.toInt
     Englishaverage=Englishaverage.toInt
     Physicsaverage=Physicsaverage.toInt
     println( "Math:\t   " +Mathaverage+ "\t\t" +MathMin+ "\t " +MathMax)
     println( "English:\t   " +Englishaverage+ "\t\t" +EnglishMin+ "\t " +EnglishMax)
     println( "Physics:\t   " +Physicsaverage+ "\t\t" +PhysicsMin+ "\t " +PhysicsMax)
   }
}
class  Student(id1:Int,gender1:String,Math1:Double,English1:Double,Physics1:Double){
   var  id:Int = id1
   var  gender:String = gender1
   var  Math:Double = Math1
   var  English:Double = English1
   var  Physics:Double = Physics1
   
   override  def toString = s "Student($id, $gender, $Math, $English, $Physics)"
}

3、編譯並運行:

 

 

 4、結果如下:

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import scala.io.StdIn
object  test2
{
     def main(args: Array[String])
     {
         var  Sum=0.0
         println( "請輸入n" )
         var  n:Long=StdIn.readLine().toLong
         var  i=1.0
         while (Sum<n)
         {
             var  mid=(i+i)/i
             Sum=Sum+(i+1)/i
             i=i+1
         }
         println( "**************************" )
         println( "計算級數為:" ,Sum)
     }
}


免責聲明!

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



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