快学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第一章习题答案
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的课后习题(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课后习题及其答案。
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第五章习题答案
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第六章习题答案
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第四章习题答案
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
