快学scala第六章习题答案
- 格式:doc
- 大小:72.50 KB
- 文档页数:3
快学Scala课后习题答案分享⼀个之前做快学Scala的课后习题(2-21章节,19⽆)的Github链接,我把习题的⽂字写在了每个回答的注释上⾯,这样⽅便⼤家对照着看,省的回过头去对照着pdf看了,如果有做的不对的地⽅希望⼤家给予指正。
举⼀个第⼆章节的例⼦,抛砖引⽟:object charpter02 {/** 2.1* ⼀个数字如果为正数,则它的signum为1;* 如果是负数,则signum为-1;* 如果为0,则signum为0.编写⼀个函数来计算这个值* */def signum(x: Int): Int = {if (x > 0) { 1 }else if (x < 0) { -1 }else { 0 }}def signum(x: Int): Int = if (x > 0) 1 else if (x < 0) -1 else 0;def signum(x: Int) = { if (x > 0) 1 else if (x < 0) -1 else 0 }def signum(x: Int) = if (x > 0) 1 else if (x < 0) -1 else 0/** 2.2* ⼀个空的块表达式{}的值是什么?类型是什么?* */// def checkEmptyBlockType() = {// println({});// println({}.getClass())// }def checkEmptyBlockType { println({}); println({}.getClass()) }/** 2.3* 指出在Scala中何种情况下赋值语句x=y=1是合法的。
* (提⽰:给x找个合适的类型定义)*/def checkAssignLegal { var x: Unit = () println("x's type is: " + x.getClass) var y = 1 x = y = 1}/** 2.4* 针对下列Java循环编写⼀个Scala版本:* for(int i=10;i>=0;i–) System.out.println(i);*/def ScalaForeach { // 1.to(10).reverse.foreach { (i: Int) => Predef.println(i) } // 1.to(10).reverse.foreach { i => Predef println i } // 1.to(10).reverse.foreach { i => println(i) } // 1.to(10).reverse foreach { println _ } (1 to 10 reverse) foreach println}/** 2.5* 编写⼀个过程countdown(n:Int),打印从n到0的数字*/def countdown(n: Int) { n match { case n if n >= 0 => { (0 to n reverse) foreach println } case n if n < 0 => { n to 0 foreach println } }}/** 2.6* 编写⼀个for循环,计算字符串中所有字母的Unicode代码的乘积。
scala练习题库Scala是一种多范式编程语言,它结合了面向对象编程和函数式编程的特性。
通过练习,我们可以更好地理解和掌握Scala的各种语法和用法。
本篇文章将为大家提供一个Scala练习题库,帮助大家进行实战练习,加深对Scala的理解。
1. 变量和数据类型1.1 请编写一个程序,声明两个整型变量并计算它们的和,并打印结果。
1.2 请编写一个程序,声明一个字符串变量并将其内容逆序输出。
2. 函数2.1 请编写一个函数,接收一个整数作为参数,并判断该整数是否为偶数。
如果是偶数,返回true,否则返回false。
2.2 请编写一个函数,接收一个字符串作为参数,并返回该字符串的长度。
3. 条件语句和循环3.1 请编写一个程序,接收一个整数作为参数,判断它是否为正数、负数还是零,并打印相应的提示信息。
3.2 请编写一个程序,打印1到100之间所有的偶数。
4. 集合4.1 请使用列表(List)存储10个整数,并编写程序打印出列表中所有的偶数。
4.2 请使用集合(Set)存储10个不重复的整数,并编写程序打印出集合中的最大值和最小值。
5. 类和对象5.1 请定义一个Person类,包含姓名和年龄两个属性,以及一个打印信息的方法。
5.2 请定义一个Circle类,包含半径属性和计算面积的方法。
6. 模式匹配6.1 请编写一个程序,接收一个整数作为参数,判断该整数是奇数、偶数还是0,并打印相应的提示信息。
6.2 请编写一个程序,接收两个整数和一个操作符作为参数,实现加、减、乘、除四则运算,并打印结果。
通过完成以上练习题,可以加深对Scala编程语言的理解和掌握。
通过实际操作,我们可以更加熟悉Scala的语法和常用功能,并提升自己在Scala编程方面的能力。
希望本篇Scala练习题库能够为大家提供有效的学习工具,帮助大家在不断练习和实践中掌握Scala编程的技巧和规范。
祝愿大家在Scala编程的学习和实践中取得丰硕的成果!。
16 注解16.1 编写四个JUnit测试用例,分别使用带或不带某个参数的@Test注解。
用JUnit执行这些测试import org.junit.Testclass ScalaTest {@Testdef test1(){print("test1")}@Test(timeout = 1L)def test2(){print("test2")}}16.2 创建一个类的示例,展示注解可以出现的所有位置。
用@deprecated作为你的示例注解。
@deprecatedclass Test{@deprecatedval t = _;@deprecated(message = "unuse")def hello(){println("hello")}}@deprecatedobject Test extends App{val t = new Test()t.hello()t.t}16.3 Scala类库中的哪些注解用到了元注解@param,@field,@getter,@setter,@beanGetter 或@beanSetter?看Scala注解的源码就OK了16.4 编写一个Scala方法sum,带有可变长度的整型参数,返回所有参数之和。
从Java调用该方法。
import annotation.varargsclass Test{@varargsdef sum(n:Int*)={n.sum}}public class Hello {public static void main(String[] args){Test t = new Test();System.out.println(t.sum(1,2,3));}}16.5 编写一个返回包含某文件所有行的字符串的方法。
从Java调用该方法。
import io.Sourceclass Test{def read()={Source.fromFile("test.txt").mkString}}public class Hello {public static void main(String[] args){Test t = new Test();System.out.println(t.read());}}16.6 编写一个Scala对象,该对象带有一个易失(volatile)的Boolean字段。
快速入门Scala编程语言Scala编程语言是一种多范式编程语言,结合了面向对象编程和函数式编程的特点。
它的语法简洁优雅,适合用于大规模的软件开发项目。
本文将带你快速了解Scala编程语言。
一、Scala的基本语法1. 变量和常量:在Scala中,使用关键字`var`来声明一个可变的变量,使用关键字`val`来声明一个不可变的常量。
例如,`var x = 10`声明一个可变变量x,`val y = 5`声明一个不可变常量y。
2. 数据类型:Scala拥有丰富的数据类型,包括整数类型、浮点数类型、布尔类型、字符类型等。
例如,`Int`表示整数类型,`Double`表示浮点数类型,`Boolean`表示布尔类型,`Char`表示字符类型。
3. 控制流语句:Scala支持常见的控制流语句,如条件判断和循环。
例如,`if-else`语句用于条件判断,`for`循环用于迭代执行操作。
4. 函数:在Scala中,函数是一等公民,可以作为值进行传递和操作。
函数的定义使用关键字`def`,例如`def add(x: Int, y: Int): Int = x + y`定义了一个接受两个整数参数并返回它们的和的函数。
5. 类和对象:Scala是一种面向对象的语言,每个值都是一个对象。
类用于定义对象的蓝图,对象是类的实例。
通过使用`class`关键字定义类,使用`new`关键字来创建对象。
二、函数式编程特性Scala内置了许多函数式编程特性,使得函数的组合和操作更加简洁和灵活。
1. 高阶函数:Scala中的函数可以作为值进行传递和操作,因此可以使用函数作为参数或返回值。
这种函数接受其他函数作为参数或将函数作为返回值的函数称为高阶函数。
高阶函数可以极大地简化代码的编写和理解。
2. 不可变性:Scala鼓励使用不可变的数据结构和变量,在处理数据时避免副作用和数据竞争的发生。
不可变性使得代码更加安全和易于调试。
3. 模式匹配:模式匹配是一种强大的功能,用于根据数据的结构和属性进行分支处理。
9 继承扩展如下的BankAccount类,新类CheckingAccount对每次存款和取款都收取1美元的手续费class BankAccount(initialBalance:Double){ private var balance = initialBalance def deposit(amount:Double) = { balance += amount; balance} def withdraw(amount:Double) = {balance -= amount; balance} }继承语法的利用。
代码如下Scala代码 1.classCheckingAccount(initialBalance:Double) extends BankAccount(initialBalance){ 2. override def deposit(amount: Double): Double = (amount - 1) 3. 4. override def withdraw(amount: Double): Double = (amount + 1) 5.} 扩展前一个练习的BankAccount类,新类SavingsAccount每一个月都有利息产生(earnMonthlyInterest方式被挪用),而且有每一个月三次免手续费的存款或取款。
在earnMonthlyInterest方式中重置交易计数。
Scala代码 1.class SavingsAccount(initialBalance:Double) extends BankAccount(initialBalance){ 2. private var num:Int = _ 3. 4. def earnMonthlyInterest()={ 5. num = 3 6. (1) 7. } 8.9. override def deposit(amount: Double): Double = { 10. num -= 111. if(num < 0) (amount - 1) else (amount) 12. } 13.14. override def withdraw(amount: Double): Double = { 15. num -= 116. if (num < 0) (amount + 1) else (amount) 17. } 18.} 掀开你喜爱的Java或C++教科书,必然会找到用来讲解继承层级的实例,可能是员工,宠物,图形或类似的东西。
快学Scala习题解答—第三章数组相关操作3 数组相关操作3.1 编写⼀段代码。
将a设置为⼀个n个随机整数的数组,要求随机数介于0(包括)和n(不包括)之间random和yield的使⽤Scala代码1. import scala.math.random2.3. def randomArray(n:Int)={4. for(i <- 0 until n) yield (random * n).toInt5. }6.7. println(randomArray(10).mkString(","))3.2 编写⼀个循环,将整数数组中相邻的元素置换。
⽐如,Array(1,2,3,4,5)经过置换后变为Array(2,1,4,3,5)对数组⽅法的使⽤Scala代码1. def reorderArray(arr:Array[Int]):Array[Int]={2. val t = arr.toBuffer3. for(i <- 1 until (t.length,2);tmp = t(i);j <- i - 1 until i){4. t(i) = t(j)5. t(j) = tmp6. }7. t.toArray8. }9.10. println(reorderArray(Array(1,2,3,4,5)).mkString(","))3.3 反复前⼀个练习,只是这⼀次⽣成⼀个新的值交换过的数组。
⽤for/yieldScala代码1. def reorderArray(arr:Array[Int]):Array[Int]={2. (for(i <- 0 until (arr.length,2)) yield if (i + 1 < arr.length) Array(arr(i + 1),arr(i)) else Array(arr(i))).flatten.toArray3. }4.5. println(reorderArray(Array(1,2,3,4,5)).mkString(","))3.4 给定⼀个整数数组,产⽣⼀个新的数组,包括元数组中的全部正值,以原有顺序排列,之后的元素是全部零或负值。
scala课后习题答案Scala课后习题答案Scala是一种多范式编程语言,它结合了面向对象编程和函数式编程的特性。
在学习Scala的过程中,做课后习题是非常重要的,它可以帮助我们巩固所学的知识,提高编程能力。
下面我们来看一些常见的Scala课后习题及其答案。
1. 编写一个函数,计算给定数组的平均值。
```scaladef average(arr: Array[Int]): Double = {if (arr.isEmpty) 0else arr.sum.toDouble / arr.length}```2. 编写一个函数,将给定的字符串列表连接成一个字符串。
```scaladef concatStrings(strings: List[String]): String = {strings.mkString}```3. 编写一个函数,找出给定数组中的最大值和最小值。
```scaladef findMaxAndMin(arr: Array[Int]): (Int, Int) = {(arr.max, arr.min)}```4. 编写一个函数,将给定的整数列表按照奇偶分成两个列表。
```scaladef splitOddEven(nums: List[Int]): (List[Int], List[Int]) = {nums.partition(_ % 2 == 0)}```5. 编写一个递归函数,计算给定数字的阶乘。
```scaladef factorial(n: Int): Int = {if (n <= 1) 1else n * factorial(n - 1)}```以上是一些常见的Scala课后习题及其答案,通过做这些习题可以帮助我们更好地理解和掌握Scala编程语言。
希望大家在学习Scala的过程中能够多加练习,不断提升自己的编程能力。
中国大学慕课spoc第六章C++数组答案1最大值(100分)问题描述先输入一个正整数n(1到20之间),再输入n个整数,计算其中的最大值和相应下标。
输入描述先输入要处理的整数的个数n(1<=n<=20),再输入n个整数,并用空格分开。
输出描述依次输出n个整数中的最大值和相应下标(若多个整数与最大值相同,则从小到大输出相应下标),之间用空格分隔。
输入样例154 6 7 2 5输出样例17 2输入样例254 6 7 2 7输出样例27 2 4#include <bits/stdc++.h>using namespace std;int main(){int n,i,j,a[20],max;cin>>n;for(i=0;i<n;i++){cin>>a[i];}max=a[0];for(i=0;i<n;i++){if(max<a[i])max=a[i];}cout<<max;for(i=0;i<n;i++){if(a[i]==max){cout<<" "<<i;}}}2峰值个数(100分)问题描述先输入一个正整数n(3到20之间),再输入n个整数,计算其中的峰值个数。
峰值是满足大于或小于左右两个元素的元素,例如12,45,32,0,14,25,62,48,51序列中,峰值有45,0,62,48,峰值个数为4。
输入描述先输入要处理的整数的个数n(3<=n<=20),再输入n个整数,并用空格分开。
输出描述一个整数,表示n个整数中有多少个峰值。
输入样例54 6 7 2 5输出样例2#include <bits/stdc++.h>using namespace std;int main(){int n,i,a[20],j=0;cin>>n;for(i=0;i<n;i++){cin>>a[i];}for(i=1;i<n-1;i++){if((a[i]>a[i-1]&&a[i]>a[i+1])||(a[i]<a[i-1]&&a[i]<a[i+1]))j++;}cout<<j;}3互为相反数(100分)问题描述先输入一个正整数n(2到20之间),再输入n个数(可重复,可为浮点数),计算其中有多少对互为相反数(仅有符号不同的两数互为相反数)。
11 特质11.1 java.awt.Rectangle类有两个很有用的方法translate和grow,但可惜的是像java.awt.geom.Ellipse2D这样的类没有。
在Scala中,你可以解决掉这个问题。
定义一个RenctangleLike特质,加入具体的translate和grow方法。
提供任何你需要用来实现的抽象方法,以便你可以像如下代码这样混入该特质:val egg = new java.awt.geom.Ellipse2D.Double(5,10,20,30) with RectangleLikeegg.translate(10,-10)egg.grow(10,20)使用自身类型使得trait可以操作x,yimport java.awt.geom.Ellipse2Dtrait RectangleLike{this:Ellipse2D.Double=>def translate(x:Double,y:Double){this.x = xthis.y = y}def grow(x:Double,y:Double){this.x += xthis.y += y}}object Test extends App{val egg = new Ellipse2D.Double(5,10,20,30) with RectangleLikeprintln("x = " + egg.getX + " y = " + egg.getY)egg.translate(10,-10)println("x = " + egg.getX + " y = " + egg.getY)egg.grow(10,20)println("x = " + egg.getX + " y = " + egg.getY)}11.2 通过把scala.math.Ordered[Point]混入java.awt.Point的方式,定义OrderedPoint类。
6 类6.1 改进5.1节的Counter类,让它不要在Int.MaxValue时变成负数6.2 编写一个BankAccount类,加入deposit和withdraw方法,和一个只读的balance属性6.3 编写一个Time类,加入只读属性hours和minutes,和一个检查某一时刻是否早于另一时刻的方法before(other:Time):Boolean。
Time对象应该以new Time(hrs,min)方式构建。
其中hrs以军用时间格式呈现(介于0和23之间)6.4 重新实现前一个类中的Time类,将内部呈现改成午夜起的分钟数(介于0到24*60-1之间)。
不要改变公有接口。
也就是说,客户端代码不应因你的修改而受影响6.5 创建一个Student类,加入可读写的JavaBeans属性name(类型为String)和id(类型为Long)。
有哪些方法被生产?(用javap查看。
)你可以在Scala中调用JavaBeans的getter和setter方法吗?应该这样做吗?javap -c Student 后显示如下6.6 在5.2节的Person类中提供一个主构造器,将负年龄转换为06.7 编写一个Person类,其主构造器接受一个字符串,该字符串包含名字,空格和姓,如new Person("Fred Smith")。
提供只读属性firstName和lastName。
主构造器参数应该是var,val还是普通参数?为什么?必须为val。
如果为var,则对应的此字符串有get和set方法,而Person中的firstName和lastName为只读的,所以不能重复赋值。
如果为var则会重复赋值而报错6.8 创建一个Car类,以只读属性对应制造商,型号名称,型号年份以及一个可读写的属性用于车牌。
提供四组构造器。
每个构造器fc都要求制造商和型号为必填。
型号年份和车牌可选,如果未填,则型号年份为-1,车牌为空串。
7 对象
7.1 编写一个Conversions对象,加入inchesToCentimeters,gallonsToLiters和milesToKilometers方法
7.2 前一个练习不是很面向对象。
提供一个通用的超类UnitConversion并定义扩展该超类的InchesToCentimeters,GallonsToLiters和MilesToKilometers对象
7.3 定义一个扩展自java.awt.Point的Origin对象。
为什么说这实际上不是个好主意?(仔细看P oint类的方法)
7.4 定义一个P oint类和一个伴生对象,使得我们可以不用new而直接用Point(3,4)来构造P oint实例
7.5 编写一个Scala应用程序,使用App特质,以反序打印命令行参数,用空格隔开。
举例来说,scala Reverse Hello World应该打印W orld H ello
7.6 编写一个扑克牌4种花色的枚举,让其toString方法分别返回♣,♦,♥,♠
7.7 实现一个函数,检查某张牌的花色是否为红色
7.8 编写一个枚举,描述RGB立方体的8个角。
ID使用颜色值(例如:红色是0xff0000)。