-
实验目的
- 在Linux操作系统中安装Scala
- 输入“scala”命令,熟悉地运行Scala解释器
- scala语言运行超级素数和猴子大王
- 实验仪器
Virtualbox管理器
-
实验框图(电路图/流程图)
- 在Windows中使用VirtualBox安装Ubuntu,安装好scala后,使用scala解释器,
可以使用命令“:quit”退出Scala解释器,如下所示:
- 打开命令行终端(可以使用Ctr+Alt+T组合键来打开终端)。在Scala安装目录/usr/local/scala下面新建一个mycode文件夹,用于存放自己的练习代码文件(后面我们都会把练习代码文件放在/usr/local/scala/mycode这个目录下),创建目录的命令如下:
vim后,分别在XTest1.scala,XTest2.scala文件中输入代码,并获得结果:
使用以下命令,对文件进行共享:
-
实验基本原理(原理/源程序)(源程序来自老师和同学)
实验代码:
- XTest1.scala:
object XTest1{
def powerOf2(x:Int):Int = {if(x==0) 1 else 2*powerOf2(x-1)}
def sum(f: Int => Int, a:Int, b:Int):Int = {if(a > b) 0 else f(a) + sum(f, a+1, b)}
def ave(a:Array[Int], n:Int):Double = {if (n == 0) a(n) else (ave(a, n-1) * (n-1)+a(n-1)) / n}
}
-
- XTest2.scala:
object XTest2{
def main(args:Array[String]){
var a = Array(1,2,3,4,5,6,7,8,9,10)
println(XTest1.sum(x=>x*x, 1, 5))
println(XTest1.sum(XTest1.powerOf2, 1, 5))
println(XTest1.ave(a, 6))
}
}
3.超级素数:
object SpPrime{
def IsPrime(i:Int):Boolean = {//判断是否为素数
var flag:Boolean = true
for (j <- 2 until i) {
if ((i%j)==0)
flag = false
}
flag
}
def powerOf10(x:Int):Int = {//求10的幂
if(x==0) 1 else 10 * powerOf10(x-1)
}
def main(args:Array[String]){
for(i <- 2 to 10000){
var flag:Boolean = true
var digit = (i+"").length//位数
//printf("i有%d位\t",digit)
for(j <- 1 to digit)
if(!IsPrime(i/powerOf10(j-1)))//根据位数循环,除法取整依次求出i,去掉个位,十位, 百位...的值
flag = false
if(flag)
printf("\t%d",i)
}
}
}
4.猴子选大王:
object MonkeyK{
def main(args:Array[String]){
var (num,n,point,result) = (100,100,-1,0)
val arr = new Array[Int](num)
for(i <- 0 to 99)
arr(i) = 1
while(num > 0) {
for(i <- 0 to 2) { // 报数
point = (point + 1) % n
while(arr(point) == 0) { //如果已经出列就让下一个未出列的猴子报数
point = (point + 1) % n
}
if(i == 2 && arr(point) == 1) {// 出列
arr(point) = 0
result = point + 1
num-=1
}
}
if(num == 0) {
printf("%d",result)
}
}
}
}
-
实验数据、分析与实验结果
超级素数描述:依次从个位去掉后还为素数的素数即超级素数。求10000以内所有超级素数。
猴子选大王描述:n个猴子绕成一圈报数1,2,3,...每次报到3的猴子淘汰。直到最后只剩1个猴子时,它成为大王。若有100个猴子,那第几个猴子会赢?
-
总结、心得体会
Scala是大小写敏感的,所以,不要输入错误,比如把小写开头的object输成大写开头的Object。文件名XTest.scala和xtest.scala也是两个不同的文件。