5.12 练习

本章的示例代码位于仓库 ThinkJavaCode 的目录 ch05 中,有关如何下载这个仓库,请参阅前言中的“使用示例代码”一节。做以下的练习前,建议你先编译并运行本章的示例。

如果你还没有阅读 A.6 节,那么现在正是阅读的好时机。该节介绍了 DrJava 调试器,这是一个很有用的执行流程跟踪工具。

练习5-1

逻辑运算符可简化嵌套的条件语句。例如,你能只用一条 if 语句重写下面的代码吗?

  1. if (x > 0) {
  2. if (x < 10) {
  3. System.out.println("positive single digit number.");
  4. }
  5. }

练习5-2

根据下面的程序:

(1) 绘制一个栈图,指出第二次调用 ping 时该程序的状态;

(2) 这个程序的完整输出是什么?

  1. public static void zoop(String fred, int bob) {
  2. System.out.println(fred);
  3. if (bob == 5) {
  4. ping("not ");
  5. } else {
  6. System.out.println("!");
  7. }
  8. }
  9. public static void main(String[] args) {
  10. int bizz = 5;
  11. int buzz = 2;
  12. zoop("just for", bizz);
  13. clink(2 * buzz);
  14. }
  15. public static void clink(int fork) {
  16. System.out.print("It's ");
  17. zoop("breakfast ", fork) ;
  18. }
  19. public static void ping(String strangStrung) {
  20. System.out.println("any " + strangStrung + "more ");
  21. }

练习5-3

对于 5.8 节中的程序,假设在 main 中用实参 4 调用了方法 nLines,请据此绘制一个栈图,并指出 nLines 的最后一次调用返回前,该程序的状态如何。

练习5-4

费马大定理指出,如果整数 n 大于 2,则方程 an+bn=cn 没有整数解。

请编写一个名为 checkFermat 的方法,它接受四个整数作为参数:abcn,然后检查费马大定理是否正确。如果 n 大于 2,且 an+bn=cn,那么这个方法就显示“Holy smokes, Fermat was wrong!”,否则就显示“No, that doesn't work.”。

提示:你可能需要使用 Math.pow

练习5-5

这个练习的目的是将一个大问题分解成多个小问题,并编写简单的方法来解决这些小问题。下面是歌曲 99 Bottles of Beer 的第一段歌词:

99 bottles of beer on the wall,

99 bottles of beer,

ya' take one down, ya' pass it around,

98 bottles of beer on the wall.

接下来的各段歌词与此相同,只是每段中的瓶数依次少 1。而最后一段歌词如下:

No bottles of beer on the wall,

no bottles of beer,

ya' can't take one down, ya' can't pass it around,

'cause there are no more bottles of beer on the wall!

至此,这个歌曲总算结束了。

请编写一个显示这首歌全部歌词的程序。程序应包含一个承担重任的递归方法,但你可能还需要编写其他方法。可在程序编写期间用较少的段数(如 3)进行测试。

练习5-6

这个练习将通过一个包含多个方法的程序来复习执行流程。请阅读下面的代码,并回答后面的问题。

  1. public class Buzz {
  2. public static void baffle(String blimp) {
  3. System.out.println(blimp);
  4. zippo("ping", -5);
  5. }
  6. public static void zippo(String quince, int flag) {
  7. if (flag < 0) {
  8. System.out.println(quince + " zoop");
  9. } else {
  10. System.out.println("ik");
  11. baffle(quince);
  12. System.out.println("boo-wa-ha-ha");
  13. }
  14. }
  15. public static void main(String[] args) {
  16. zippo("rattle", 13);
  17. }
  18. }

(1) 在这个程序首先执行的代码行旁边标上数字 1。

(2) 在这个程序执行的第 2 行代码旁边标上数字 2,再依此类推,直到该程序末尾。多次执行的代码行旁边将有多个数字。

(3) 调用 baffle 时,形参 blimp 的值是什么?

(4) 这个程序的输出是什么?

练习5-7

学习条件语句后,现在我们可以回过头去完善练习 3-4 中的“猜数”游戏了。

你应该已经有这样一个程序,它可以选择一个随机数,让用户猜这个数,并显示用户猜的数字与这个随机数的差距。

请修改这个程序,让程序可以告诉用户他猜的数字太大还是太小,并提示用户再猜一次。每次修改只添加少量的代码,并边修改边测试。

这个程序应不断运行,直到用户猜对为止。

提示:使用两个方法,并将其中一个编写为递归方法。