Scala编程初级实践

举报
俺想吃蜂蜜 发表于 2022/04/10 22:09:15 2022/04/10
【摘要】 名称Scala编程初级实践 目的1.掌握Scala语言的基本语法、数据结构和控制结构;2.掌握面向对象编程的基础知识,能够编写自定义类和特质;3.掌握函数式编程的基础知识,能够熟练定义匿名函数。熟悉Scala的容器类库的基本层次结构,熟练使用常用的容器类进行数据;4.熟练掌握Scala的REPL运行模式和编译运行方法。 内容与结果分析计算级数请用脚本的方式编程计算并输出下列级数的前n项之和...

名称

Scala编程初级实践

目的

1.掌握Scala语言的基本语法、数据结构和控制结构;
2.掌握面向对象编程的基础知识,能够编写自定义类和特质;
3.掌握函数式编程的基础知识,能够熟练定义匿名函数。熟悉Scala的容器类库的基本层次结构,熟练使用常用的容器类进行数据;
4.熟练掌握Scala的REPL运行模式和编译运行方法。

内容与结果分析

  1. 计算级数
    请用脚本的方式编程计算并输出下列级数的前n项之和Sn,直到Sn刚好大于或等于q为止,其中q为大于0的整数,其值通过键盘输入。
    例如,若q的值为50.0,则输出应为:Sn=50.416695。请将源文件保存为sn.scala,在REPL模式下测试运行,测试样例:q=1时,Sn=2;q=30时,Sn=30.891459;q=50时,Sn=50.416695。
    要求:选取以下任意两种方式完成
    ①repl环境下一行一句运行
    q=1时

image.png

q=30时

image.png

q=50时

image.png

②脚本文件test1.scala存放不带有对象和main的所有代码,在REPL中:load运行

先编写sn.scala

image.png

当q=1时

image.png

当q=30时

image.png

当q=50时

image.png

2 使用scala语言编程输出九九乘法表

创建99.scala
输入代码
import scala.collection.mutable.ArrayBuffer

object NineNineForm {
def main(args: Array[String]): Unit = {
println("************ 九九乘法表 **********")
for(i<- 1 until 10){
val array=new ArrayBufferString
for(j<- 1 until i+1){
var a:String =j+"
"+i+"="+i
j+" "
array+=a
}
array.foreach(print)
println()
}
}
}
image.png

3 统计List列表中中单词出现的频率,例如:
创建lzlcipin.scala
输入代码
val list1=List(“I am a student”,” love database”,”Hadoop is good”,”spark is good”)
输出结果为:键值对形式输出
import collection.mutable.Map

val list1 = List(“I am lizhuolang” , “I love lizhuolang” , “Hadoop is good” , “Scala is good”)
var m = Map.empty[String , Int]
val list2 = list1 flatMap{a => a.split(" ")}

val f : String => Unit = {w =>
if (m.contains(w)) m(w) += 1
else m(w) = 1
}
list2.foreach(f)
m foreach {kv => println(kv._1,kv._2)}
image.png

4 统计学生成绩
创建grade1.txt
image.png

测试样例文件的路径
image.png

将每行按空白字符(包括空格/制表符)分开
由于后面涉及操作列表的函数,故用toList将Iterator改为List
originalData的类型为List[Array[String]]
image.png

originalData:List[Array[String]]类型
image.png

获取文件中第一行信息(表头)
获取第一行中的课程名
image.png

去除第一行剩下的数据

image.png

allStudents:List[Array[String]]类型
image.png

按性别划分为两个容器
image.png

男生人数和女生人数
image.png

for对每门课程生成一个三元组,分别表示平均分,最低分和最高分
image.png

for循环执行3次,1次对应一门课程,每次for循环会生成一个temp,该temp是一个List类型,用于存放某门课程的分数,语句val temp = allStudents map {elem=>elem(i).toDouble}表示对 allStudents进行映射操作,allStudents原来是List类型,故temp也是List类型。具体映射方法是:将allStudents的每一行映射成该行第i列的Double表示。下表是以第一次for循环为例,输出的temp结果表示:
image.png

for推导式,将for的结果放在result中,result是一个向量,向量中的元素个数等于课程门数,每一个元素是一个三元组tuple,对每门课程生成一个三元组,分别表示平均分,最低分和最高分
image.png

输出结果
image.png

输出男生的结果

image.png
image.png
image.png

输出女生的结果
image.png
image.png
image.png

出现的问题及解决方案

1.运行代码时出现编码错误
错误:
image.png

错误原因:
因为wps里的空格和linux里的空格编码方式不同,空格有如下分类
\u00A0:不间断空格,主要用在office中,让一个单词在结尾处不会换行显示
\u0020:半角空格(英文符号),代码中常用的
\u3000:全角空格(中文符号),中文文章中使用

解决办法:
我们无法看出空格的区别,但是编译器可以,所以只能手动更换代码里所有的空格
2.数组越界
错误:
数组越界
image.png

解决办法:
网上找的方法都没用,最后自己手动重输了一下grade1.txt才得以解决

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。