《数据结构与抽象: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的说明类中方法的注释。所有的方法都不允许计数器的值为负数。

  1. 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。下列递归算法找到两个正整数的最大公约数:
image
image

如果强制让分数的分母为正数,则很容易确定分数的正确符号。但是你的实现必须处理客户可能提供负数分母的情况。
写一个充分展示你的类的程序。
6.混合数包含整数部分和分数部分。使用前一个项目中设计的类Fraction,为混合数设计类MixedNumber。为MixedNumber提供类似于Fraction的操作。即,为混合数提供设置、获取、加法、减法、乘法及除法操作。混合数的分数部分应该是最简形式,分子应严格小于分母。
  为这个类写一个Java接口,包括javadoc注释。
7.实现前一个项目设计的类MixedNumber。尽可能使用Fraction中的操作。例如,为了让两个混合数相加,将它们转换为分数,使用Fraction类的加法操作进行相加,然后将结果分数转换为混合数。其他的算术操作使用类似的技术实现。
如果不仔细,混合数的符号可能是一个难处理的问题。数学上,整数部分的符号与分数部分的符号相一致是有意义的。例如,如果有一个负数分数,混合数的toString方法将得到字符串“-5 -1/2”,而不是“-5 1/2”,这是通常所期望的。下面的解决方案可能大大简化计算。
混合数的符号表示为字符数据域。一旦设置了这个符号,则让整数和分数部分都为正。当创建混合数时,如果给定的整数部分为非零,则让整数部分的符号与混合数的符号一样,而忽略分数的分子和分母的符号。但是,如果给定的整数部分为零,则让所给分数的符号与混合数的符号一致。

image


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种:
image
image
image

7.在接口和类中,在setStudent、setName和getName中用NameInterface替换Name。另外在类中,在数据域fullName的声明和带参数的构造方法中,用NameInterface替换Name。
8.不能。类Pet必须在implements子句中声明它实现了Nameable。
9.
image

10.
image

11.增加一个从AllCourses到Course的无向关联(箭头),尾部的基数是1,头部的基数是*。

相关文章
|
4月前
|
JSON Java API
【干货满满】分享京东API接口到手价,用Java语言实现
本示例使用 Java 调用京东开放平台商品价格及优惠信息 API,通过商品详情和促销接口获取到手价(含优惠券、满减等),包含签名生成、HTTP 请求及响应解析逻辑,适用于比价工具、电商系统集成等场景。
|
2月前
|
Java
Java语言实现字母大小写转换的方法
Java提供了多种灵活的方法来处理字符串中的字母大小写转换。根据具体需求,可以选择适合的方法来实现。在大多数情况下,使用 String类或 Character类的方法已经足够。但是,在需要更复杂的逻辑或处理非常规字符集时,可以通过字符流或手动遍历字符串来实现更精细的控制。
282 18
|
2月前
|
存储 Java 索引
用Java语言实现一个自定义的ArrayList类
自定义MyArrayList类模拟Java ArrayList核心功能,支持泛型、动态扩容(1.5倍)、增删改查及越界检查,底层用Object数组实现,适合学习动态数组原理。
124 4
|
3月前
|
存储 Java Apache
Java语言操作INI配置文件策略
以上步骤展示了基本策略,在实际项目中可能需要根据具体需求进行调整优化。例如,在多线程环境中操作同一份配置时需要考虑线程安全问题;大型项目可能还需考虑性能问题等等。
198 15
|
5月前
|
监控 Java API
Java语言按文件创建日期排序及获取最新文件的技术
这段代码实现了文件创建时间的读取、文件列表的获取与排序以及获取最新文件的需求。它具备良好的效率和可读性,对于绝大多数处理文件属性相关的需求来说足够健壮。在实际应用中,根据具体情况,可能还需要进一步处理如访问权限不足、文件系统不支持某些属性等边界情况。
291 14
|
4月前
|
算法 Java
Java语言实现链表反转的方法
这种反转方法不需要使用额外的存储空间,因此空间复杂度为,它只需要遍历一次链表,所以时间复杂度为,其中为链表的长度。这使得这种反转链表的方法既高效又实用。
451 0
|
4月前
|
JSON Java API
【干货满满】分享拼多多API接口到手价,用Java语言实现
本方案基于 Java 实现调用拼多多开放平台商品详情 API,通过联盟接口获取商品到手价(含拼团折扣与优惠券),包含签名生成、HTTP 请求及响应解析逻辑,适用于电商比价、导购系统集成。
|
4月前
|
JSON Java API
【干货满满】分享淘宝API接口到手价,用Java语言实现
本文介绍了如何使用 Java 调用淘宝开放平台 API 获取商品到手价,涵盖依赖配置、签名生成、HTTP 请求与响应解析等核心实现步骤。
|
5月前
|
JavaScript Java Go
Go、Node.js、Python、PHP、Java五种语言的直播推流RTMP协议技术实施方案和思路-优雅草卓伊凡
Go、Node.js、Python、PHP、Java五种语言的直播推流RTMP协议技术实施方案和思路-优雅草卓伊凡
412 0
|
5月前
|
JSON JavaScript 前端开发
Python+JAVA+PHP语言,苏宁商品详情API
调用苏宁商品详情API,可通过HTTP/HTTPS发送请求并解析响应数据,支持多种编程语言,如JavaScript、Java、PHP、C#、Ruby等。核心步骤包括构造请求URL、发送GET/POST请求及解析JSON/XML响应。不同语言示例展示了如何获取商品名称与价格等信息,实际使用时请参考苏宁开放平台最新文档以确保兼容性。