快学scala第五章习题答案

6 类

6.1 改进5.1节的Counter类,让它不要在Int.MaxValue时变成负数

加个判断就OK了

Scala代码

1. class Count{

2. private var value = Int.MaxValue

3. def increment(){if(value < Int.MaxValue) value + 1 else value }

4. def current = value

5. }

6.2 编写一个BankAccount类,加入deposit和withdraw方法,和一个只读的balance属性

Scala代码

1. class BankAccount(val balance:Int = 0){

2. def deposit(){}

3. def withdraw(){}

4. }

6.3 编写一个Time类,加入只读属性hours和minutes,和一个检查某一时刻是否早于另一时刻的方法before(other:Time):Boolean。Time对象应该以new Time(hrs,min)方式构建。其中hrs以军用时间格式呈现(介于0和23之间)

Scala代码

1. class Time(val hours:Int,val minutes:Int){

2.

3. def before(other:Time):Boolean={

4. hours < other.hours || (hours == other.hours && minutes < other.minutes)

5. }

6.

7. override def toString():String={

8. hours + " : " + minutes

9. }

10. }

6.4 重新实现前一个类中的Time类,将内部呈现改成午夜起的分钟数(介于0到24*60-1之间)。不要改变公有接口。也就是说,客户端代码不应因你的修改而受影响

Scala代码

1. class Time(val hours:Int,val minutes:Int){

2.

3. def before(other:Time):Boolean={

4. hours < other.hours || (hours == other.hours && minutes < other.minutes) 5. }

6.

7. override def toString():String={

8. hours * 60 + minutes

9. }

10.

}

6.5 创建一个Student类,加入可读写的JavaBeans属性name(类型为String)和id(类型为Long)。有哪些方法被生产?(用javap查看。)你可以在Scala中调用JavaBeans的getter和setter方法吗?应该这样做吗?

生成了name(),name_=(),id(),id_=(),setName(),getName(),setId(),getId() 编写代码如下

Scala代码

1. import scala.reflect.BeanProperty

2.

3. class Student{

4.

5. @BeanProperty var name:String = _

6. @BeanProperty var id:Long = _

7. }

javap -c Student 后显示如下

Javap代码

1. Compiled from "Student.scala"

2. public class Student extends ng.Object implements scala.ScalaObject{

3. public ng.String name();

4. Code:

5. 0: aload_0

6. 1: getfield #13; //Field name:Ljava/lang/String;

7. 4: areturn

8.

9. public void name_$eq(ng.String);

10. Code:

11. 0: aload_0

12. 1: aload_1

13. 2: putfield #13; //Field name:Ljava/lang/String;

14. 5: return

15.

16. public void setName(ng.String);

17. Code:

18. 0: aload_0

19. 1: aload_1

20. 2: putfield #13; //Field name:Ljava/lang/String; 21. 5: return

22.

23. public long id();

24. Code:

25. 0: aload_0

26. 1: getfield #19; //Field id:J

27. 4: lreturn

28.

29. public void id_$eq(long);

30. Code:

31. 0: aload_0

32. 1: lload_1

33. 2: putfield #19; //Field id:J

34. 5: return

35.

36. public void setId(long);

37. Code:

38. 0: aload_0

39. 1: lload_1

40. 2: putfield #19; //Field id:J

41. 5: return

42.

43. public long getId();

44. Code:

45. 0: aload_0

46. 1: invokevirtual #25; //Method id:()J

47. 4: lreturn

48.

49. public ng.String getName();

50. Code:

51. 0: aload_0

52. 1: invokevirtual #28; //Method name:()Ljava/lang/String;

53. 4: areturn

54.

55. public Student();

56. Code:

57. 0: aload_0

58. 1: invokespecial #34; //Method java/lang/Object."":()V

59. 4: return

60.

61. }

6.6 在5.2节的Person类中提供一个主构造器,将负年龄转换为0 Scala代码

1. class Person(var age:Int){

2.

age = if(age < 0) 0 else age

3. }

6.7 编写一个Person类,其主构造器接受一个字符串,该字符串包含名字,空格和姓,如new Person("Fred Smith")。提供只读属性firstName和lastName。主构造器参数应该是var,val还是普通参数?为什么?

必须为val。如果为var,则对应的此字符串有get和set方法,而Person中的firstName和lastName为只读的,所以不能重复赋值。如果为var则会重复赋值而报错

6.8 创建一个Car类,以只读属性对应制造商,型号名称,型号年份以及一个可读写的属性用于车牌。提供四组构造器。每个构造器fc都要求制造商和型号为必填。型号年份和车牌可选,如果未填,则型号年份为-1,车牌为空串。你会选择哪一个作为你的主构造器?为什么?

这个没太明白题意。。。

Scala代码

1. class Car(val maker:String,val typeName:String,val year:Int = -1,var carLice:String = ""){

2. }

6.9 在Java,C#或C++重做前一个练习。Scala相比之下精简多少?

这个就不写了。

6.10 考虑如下的类

class Employ(val name:String,var salary:Double){

def this(){this("John Q. Public",0.0)}

}

重写该类,使用显示的字段定义,和一个缺省主构造器。你更倾向于使用哪种形式?为什么?

Scala代码

1. class Employ{

2. val name:String = "John Q. Public"

3. var salary:Double = 0.0

4. }

个人更喜欢第二种方式,简单明了。

合集下载

快学scala第一章习题答案

快学scala第一章习题答案

1 1 简介

近期对Scala比较感兴趣,买了本《快学Scala》,感觉不错。比《Programming Scala:Tackle Multi-Core Complexity on

the Java Virtual Machine》好很多。 是本不错的入门书。而且每个章节都设置了难度级别,每章有习题,可以巩固Scala语法。

本文的目的就是针对这些习题进行解答

2 基础

2.1 在Scala REPL中键入3,然后按Tab键。有哪些方法可以被应用?

这个。。。。直接操作一遍就有结果了.此题不知是翻译的问题,还是原题的问题,在Scala REPL中需要按3. 然后按Tab才会提示。 直接按3加Tab是没有提示的。下面是结果

Scala代码

1. != ## % & * +

2. - / < << <= ==

3. > >= >> >>> ^ asInstanceOf

4. equals getClass hashCode isInstanceOf toByte toChar

5. toDouble toFloat toInt toLong toShort toString

6. unary_+ unary_- unary_~ |

快学Scala课后习题答案

快学Scala课后习题答案

快学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)

scala课后习题答案

scala课后习题答案

scala课后习题答案

Scala课后习题答案

Scala是一种多范式编程语言,它结合了面向对象编程和函数式编程的特性。在学习Scala的过程中,做课后习题是非常重要的,它可以帮助我们巩固所学的知识,提高编程能力。下面我们来看一些常见的Scala课后习题及其答案。

1. 编写一个函数,计算给定数组的平均值。

```scala

def average(arr: Array[Int]): Double = {

if (arr.isEmpty) 0

else arr.sum.toDouble / arr.length

}

```

2. 编写一个函数,将给定的字符串列表连接成一个字符串。

```scala

def concatStrings(strings: List[String]): String = {

strings.mkString

}

```

3. 编写一个函数,找出给定数组中的最大值和最小值。

```scala

def findMaxAndMin(arr: Array[Int]): (Int, Int) = {

(arr.max, arr.min) }

```

4. 编写一个函数,将给定的整数列表按照奇偶分成两个列表。

```scala

def splitOddEven(nums: List[Int]): (List[Int], List[Int]) = {

nums.partition(_ % 2 == 0)

}

```

5. 编写一个递归函数,计算给定数字的阶乘。

```scala

def factorial(n: Int): Int = {

if (n <= 1) 1

else n * factorial(n - 1)

}

```

以上是一些常见的Scala课后习题及其答案,通过做这些习题可以帮助我们更好地理解和掌握Scala编程语言。希望大家在学习Scala的过程中能够多加练习,不断提升自己的编程能力。

快学scala第五章习题答案

快学scala第五章习题答案

6 类

6.1 改进5.1节的Counter类,让它不要在Int.MaxValue时变成负数

加个判断就OK了

Scala代码

1. class Count{

2. private var value = Int.MaxValue

3. def increment(){if(value < Int.MaxValue) value + 1 else value }

4. def current = value

5. }

6.2 编写一个BankAccount类,加入deposit和withdraw方法,和一个只读的balance属性

Scala代码

1. class BankAccount(val balance:Int = 0){

2. def deposit(){}

3. def withdraw(){}

4. }

6.3 编写一个Time类,加入只读属性hours和minutes,和一个检查某一时刻是否早于另一时刻的方法before(other:Time):Boolean。Time对象应该以new Time(hrs,min)方式构建。其中hrs以军用时间格式呈现(介于0和23之间)

Scala代码

1. class Time(val hours:Int,val minutes:Int){

2.

3. def before(other:Time):Boolean={

4. hours < other.hours || (hours == other.hours && minutes < other.minutes)

5. }

6.

7. override def toString():String={

8. hours + " : " + minutes

快学scala第六章习题答案

快学scala第六章习题答案

7 对象

编写一个Conversions对象,加入inchesToCentimeters,gallonsToLiters和milesToKilometers方法

Scala代码

1. objectConversions{

2. definchesToCentimeters(){}

3. defgallonsToLiters(){}

4. defmilesToKilometers(){}

5. }

前一个练习不是很面向对象。提供一个通用的超类UnitConversion并定义扩展该超类的InchesToCentimeters,GallonsToLiters和MilesToKilometers对象

Scala代码

1. abstractclassUnitConversion{

2.

3. definchesToCentimeters(){}

4. defgallonsToLiters(){}

5. defmilesToKilometers(){}

6.

7. }

8.

9. objectInchesToCentimetersextendsUnitConversion{

10. overridedefinchesToCentimeters(){}

11. }

12.

13. objectGallonsToLitersextendsUnitConversion{

14. overridedefgallonsToLiters(){}

15. }

16.

17. objectMilesToKilometersextendsUnitConversion{

18. overridedefmilesToKilometers(){}

19. }

定义一个扩展自的Origin对象。为什么说这实际上不是个好主意(仔细看Point类的方法)

Point中的getLocation方法返回的是Point对象,如果想返回Origin对象,需要Origin类才行

快学scala第四章习题答案

快学scala第四章习题答案

5 映射和元组

5.1 设置一个映射,其中包含你想要的一些装备,以及它们的价格。然后构建另一个映射,采用同一组键,但是价格上打9折

映射的简单操作

scala> val map = Map("book"->10,"gun"->18,"ipad"->1000)

map:

scala.collection.immutable.Map[ng.String,Int] =

Map(book -> 10, gun -> 18, ipad -> 1000)

scala> for((k,v) <- map) yield (k,v * 0.9)

res3:

scala.collection.immutable.Map[ng.String,Double]

= Map(book -> 9.0, gun -> 16.2, ipad -> 900.0)

5.2 编写一段程序,从文件中读取单词。用一个可变映射来清点每个单词出现的频率。读取这些单词的操作可以使用java.util.Scanner:

val in = new java.util.Scanner(new java.io.File("myfile.txt")) while(in.hasNext()) 处理 in.next() 或者翻到第9章看看更Scala的做法。 最后,打印出所有单词和它们出现的次数。

当然使用Scala的方法啦。参考第9章

首先,创建一个文件myfile.txt。输入如下内容

test test ttt test ttt t test sss s

Scala代码如下

import scala.io.Source

import scala.collection.mutable.HashMap

//val source = Source.fromFile("myfile.txt")

//val tokens = source.mkString.split("\\s+") //此写法tokens为空,不知为何

快学scala第十章习题答案

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 RectangleLike

egg.translate(10,-10)

egg.grow(10,20)

使用自身类型使得trait可以操作x,y

import java.awt.geom.Ellipse2D

trait RectangleLike{

this:Ellipse2D.Double=>

def translate(x:Double,y:Double){

this.x = x

this.y = y

}

def grow(x:Double,y:Double){

this.x += x

this.y += y

} }

object Test extends App{

val egg = new Ellipse2D.Double(5,10,20,30) with RectangleLike

println("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)

c语言第五章 选择结构程序设计(习题册答案)

第五章 选择结构程序设计

基础练习(A)

一、填空题

1、关系表达式的运算结果是 逻辑 值。C语言没有逻辑型数据,以 1 代表“真”,以 0代表“假”。

2、逻辑运算符!是 单目 运算符,其结合性是由 右结合性 。

3、C语言提供的三种逻辑运算符是 && 、 || 、 ! 。其中优先级最高的为 ! ,优先级最低的为 | | 。

4、逻辑运算符两侧的运算对象不但可以是0和1,或者是0和非0的整数,也可以是任何类型的数据。系统最终以 0 和 非0 来判定它们属于“真”或“假”。

5、设y为int型变量,请写出描述“y是偶数”的表达式 (y%2==0) 。

6、设x,y,z均为int型变量,请写出描述“x或y中有一个小于z”的表达式 x

7、条件“22&&x<3 。

8、判断char型变量ch是否为大写字母的正确表达式是 (ch>=‘A’)&&(ch<=‘Z’) 。

9、当a=3,b=2,c=1时,表达式f=a>b>c的值是 0 。

10、当a=5,b=4,c=2时,表达式a>b!=c的值是 1 。

11、已知A=7.5,B=2,C=3.6,表达式A>B&&C>A||AB的值是 0 。

12、若a=6,b=4,c=2,则表达式!(a-b)+c-1&&b+c/2的值是 1 。

13、有int x,y,z;且x=3,y=-4,z=5,则表达式(x&&y)==(x||z)的值为 1 。

14、有int x,y,z;且x=3,y=-4,z=5,则以下表达式的值为 1 。

!(x>y)+(y!=z)||(x+y)&&(y-z)

15、有int a=3,b=4,c=5,x,y;,则以下表达式的值为 0 。

!(x=a)&&(y=b)&&0

快学scala第八章习题答案

9 继承

9.1 扩展如下的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. class CheckingAccount(initialBalance:Double) extends BankAccount(initialBalance){

2. override def deposit(amount: Double): Double = super.deposit(amount - 1)

3.

4. override def withdraw(amount: Double): Double = super.withdraw(amount + 1)

5. }

9.2 扩展前一个练习的BankAccount类,新类SavingsAccount每个月都有利息产生(earnMonthlyInterest方法被调用),并且有每月三次免手续费的存款或取款。在earnMonthlyInterest方法中重置交易计数。

Scala代码

1. class SavingsAccount(initialBalance:Double) extends BankAccount(initialBalance){

2. private var num:Int = _

快学scala第二章习题答案

2 控制结构和函数

2.1 一个数字如果为正数,则它的signum为1;如果是负数,则signum为-1;如果为0,则signum为0.编写一个函数来计算这个值

简单的逻辑判断

def signum(num:Int){if(num>0)print(1)else

if(num<0)print(-1)else print(0)}

Scala中已经有此方法了,刚才查找API的时候,应该能看到

BigInt(10).signum

2.2 一个空的快表达式{}的值是什么?类型是什么?

在REPL中就能看出来了

scala> val t = {}

t: Unit = ()

可以看出,它的值是()类型是Unit

2.2 指出在Scala中何种情况下赋值语句x=y=1是合法的。(提示:给x找个合适的类型定义)

题目已经给了明确的提示了。本章节中已经说过了,在scala中的赋值语句是Unit类型。所以只要x为Unit类型就可以了。

scala> var y=4;

y: Int = 4

scala> var x={}

x: Unit = ()

scala> x=y=7

x: Unit = () 这也再次证明了{}是Unit类型

2.4 针对下列Java循环编写一个Scala版本:for(int

i=10;i>=0;i–)System.out.println(i);

使用Scala版本改写就OK了

for(i <- 0 to 10 reverse)print(i)

2.5

编写一个过程countdown(n:Int),打印从n到0的数字

这个就是将上面的循环包装到过程中而已。还是换个写法吧。

def countdown(n:Int){

0 to n reverse foreach print

}

2.6 编写一个for循环,计算字符串中所有字母的Unicode代码的乘积。举例来说,"Hello"中所有字符串的乘积为9415087488L

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档