《数据结构与抽象:Java语言描述(原书第4版)》一练习
本节书摘来华章计算机《数据结构与抽象:Java语言描述(原书第4版)》一书中的第1章 ,[美]弗兰克M.卡拉诺(Frank M. Carrano) 蒂莫西M.亨利(Timothy M. Henry) 着 罗得岛大学 新英格兰理工学院 辛运帏 饶一梅 译 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
练习
1.考虑接口NameInterface。我们只为两个方法写了注释。为其他每个方法写出符合javadoc风格的注释。
2.考虑接口Circular和类Circle。
a.是客户还是方法setRadius负责保证圆的半径是正数?
b.为方法setRadius写一个前置条件和一个后置条件。
c.为方法setRadius写适合于javadoc风格的注释。
d.修改方法setRadius及它的前置条件和后置条件,改变问题a.中提到的职责。
3.为称为Counter的类写一个CRC卡及类图。这个类的对象用于统计,所以它将记录次数,这是一个非负整数。包括的方法有:为给定整数设置计数器;计数器加1;计数器减1。另外,还包括将当前计数器作为整数返回的方法;将当前计数器作为可显示在屏幕上的字符串返回的方法toString;测试当前计数器是否为0的方法。
4.假定想为餐馆设计软件。给出下单及结账的用例。列出可能类的列表。挑选其中的两个类,为它们写CRC。
项目
1.为练习3设计的类Counter创建一个接口。包括适用于javadoc的说明类中方法的注释。所有的方法都不允许计数器的值为负数。
2. a.为附录D中程序清单D-3给出的类CollegeStudent写一个Java接口。
b.类CollegeStudent要实现问题a.中所定义的接口,需要做哪些修改?
3.假定你想设计一个类,每次给它一个数。类计算到目前为止所给数的最小值、次小值及平均值。为这个类创建一个接口。包括说明类中方法的符合javadoc风格的注释。
4.考虑分数类Fraction。每个分数都有符号,且有整数的分子和分母。你的类应该能对两个分数进行加法、减法、乘法和除法运算。这些方法应该有一个分数作为参数,且应该将操作结果作为分数返回。类还应该能查找分数的倒数、比较两个分数、确定两个分数是否相等,以及将分数转换为字符串等。
这个类应该能处理分母为0的情况。分数总应该表示为最简的形式,且类应该负责检查这个条件。例如,如果用户试图创建一个如4/8这样的分数,则类应该将分数设置为1/2。同样,所有算术运算的结果也应该是最简的形式。注意,一个分数可能是不正确的,即,分子大于分母。这样的分数应该表示为最简的形式。
设计但不实现类Fraction。从为这个类写CRC卡入手。然后写一个Java接口,它声明每个公有方法。包括说明每个方法的javadoc风格的注释。
5.写一个Java类Fraction,它实现前一个项目中设计的接口。从写合理的构造方法入手。设计并实现有用的私有方法,包括说明它们的注释。
为将像4/8这样的分数化为最简形式,需要将分子和分母都除以它们的最大公约数。4和8的最大公约数是4,所以当将4/8的分子和分母都除以4时,得到分数1/2。下列递归算法找到两个正整数的最大公约数:
如果强制让分数的分母为正数,则很容易确定分数的正确符号。但是你的实现必须处理客户可能提供负数分母的情况。
写一个充分展示你的类的程序。
6.混合数包含整数部分和分数部分。使用前一个项目中设计的类Fraction,为混合数设计类MixedNumber。为MixedNumber提供类似于Fraction的操作。即,为混合数提供设置、获取、加法、减法、乘法及除法操作。混合数的分数部分应该是最简形式,分子应严格小于分母。
为这个类写一个Java接口,包括javadoc注释。
7.实现前一个项目设计的类MixedNumber。尽可能使用Fraction中的操作。例如,为了让两个混合数相加,将它们转换为分数,使用Fraction类的加法操作进行相加,然后将结果分数转换为混合数。其他的算术操作使用类似的技术实现。
如果不仔细,混合数的符号可能是一个难处理的问题。数学上,整数部分的符号与分数部分的符号相一致是有意义的。例如,如果有一个负数分数,混合数的toString方法将得到字符串“-5 -1/2”,而不是“-5 1/2”,这是通常所期望的。下面的解决方案可能大大简化计算。
混合数的符号表示为字符数据域。一旦设置了这个符号,则让整数和分数部分都为正。当创建混合数时,如果给定的整数部分为非零,则让整数部分的符号与混合数的符号一样,而忽略分数的分子和分母的符号。但是,如果给定的整数部分为零,则让所给分数的符号与混合数的符号一致。
8.考虑两个相同的桶。一个桶挂在天花板的钩子上,装有液体。另一个桶是空的,放在地板上,正对在第一个桶的下面。突然在第一只桶的底部有一个小洞。液体从满桶流向地板上的空桶,如右图所示。液体不断地流出,直到上面的桶为空时为止。
为说明这个动作的程序设计一个类。当程序开始执行时,它应该显示泄漏发生前两个桶的原始条件。判断泄漏是否是自然发生还是当用户给出信号时,例如按下回车键或按下鼠标。如果是后者,应该让用户将光标放在桶底,用来指出泄漏发生的位置。
写CRC卡及Java接口,包括javadoc风格的注释。
9.实现前一个项目中泄漏桶程序的设计。
10.里程表记录汽车的行驶里程。机械式里程表包含多个转盘,当汽车行驶时它们会转动。每个转盘显示0~9的一位数字。最右侧的转盘转得最快,每行驶1英里其数加1。一旦转盘转到9后,下一英里时它又转回0,而它左侧转盘的值增1。可以推广这种转盘的行为,赋给它们的符号不仅仅是0~9。这种转盘计数器的示例包括:
- 一个二进制里程表,其每个转盘显示0或1。
- 有3个转盘的桌面日期显示表,分别用于显示年、月和日。
- 掷骰子显示器,每个转盘显示一个骰子上的点数。
写一个用于通用转盘计数器的Java接口,最多有4个转盘。另外,写一个Java接口,用于表示转盘的类。包括javadoc风格的注释。
11.实现前一个项目中描述的通用转盘计数器的设计。写程序计算4个骰子所显示的值的和大于12的概率。(和大于12的骰子数,除以可能的骰子总数。)使用转盘计数器实例得到所有可能的4个六面骰子。例如,如果转盘从[1, 1, 1, 1]开始,则转盘计数器将如下增加:[1, 1, 1, 2]、[1, 1, 1, 3]、[1, 1, 1, 4]、[1, 1, 1, 5]、[1, 1, 1, 6]、[1, 1, 2, 1],等等。
12.使用前两个项目描述的通用转盘计数器的设计和实现,写一个类来表示有4个转盘的桌面日期显示器,每个转盘分别表示星期、月、日和年。注意,一天的星期名和日期数的变化速度是一样的,但它们的基点数是不一样的。它们不属于同一个转盘计数器。
自测题答案
1.客户接口描述如何使用类。它含有类中公有方法的头;告诉你如何使用这些方法的注释;以及类的公有定义常量。其实现由所有的数据域和所有方法的定义组成,包括公有的、私有的及保护的。
2.电视是一个例子。遥控器和电视上的控制键形成客户接口。电视的内部就是实现。
3.可能有3种:
7.在接口和类中,在setStudent、setName和getName中用NameInterface替换Name。另外在类中,在数据域fullName的声明和带参数的构造方法中,用NameInterface替换Name。
8.不能。类Pet必须在implements子句中声明它实现了Nameable。
9.
11.增加一个从AllCourses到Course的无向关联(箭头),尾部的基数是1,头部的基数是*。
最后更新:2017-06-26 15:32:49