《Java语言程序设计(一)》课后习题答案全集 下载本文

*/ public MyBigInteger divide(MyBigInteger val) { MyBigInteger result = new MyBigInteger(); result.signum = this.signum * val.signum;// 商的符号 MyBigInteger a = this.abs(); MyBigInteger b = val.abs();// 计算a/b; if (a.toString().length() < b.toString().length())// 如果位数,被除数 < 除数,则商0 result.setData(\); else if (a.toString().length() == b.toString().length())// 位数相同时 { if (a.compareTo(b) < 0)// 位数相同,被除数 < 除数,则商0 result.setData(\); else // 否则是,相同或,位数被除数 > 除数,则商1 result.setData(\); } else // 如果位数,被除数 > 除数,循环计算 { String dividend = a.toString();// 被除数的字符串形式 String quotient = \;// 累加商的字符串 MyBigInteger c = new MyBigInteger(dividend.substring(0, b.length()));// 初始为被除数的前几位,位数是除数的位数 int index = b.length();// 确定,落位时候,被除数该落下哪位 while (index < a.length()) { int bit = -1;// 累计每次的商值,因为开始总会执行次++,所有把初始设为-1 c.setData(c.toString() + dividend.charAt(index++));// 被除数上,落下一位 if (c.compareTo(b) < 0 && index < a.length())// 不够减,商0,落位 { quotient += \; c.setData(c.toString() + dividend.charAt(index++)); } else // 够减,用循环开始去减除数,知道不够减 { while (c.signum > 0) { c = c.subtract(b); bit++; } c = c.add(b);// 因为减完检测到为负数了,所有加回来 quotient += bit;// 累加商 } } result.setData(quotient); } return result; } /** * 取余,返回其值为 (this % val) 的 BigInteger。

36

* @param val- 此 BigInteger 要除以的值和计算所得的余数。 * @return - this % val */ public MyBigInteger remainder(MyBigInteger val) { MyBigInteger result =

this.subtract(val.multiply(this.divide(val))); return result; } /** * 比较大小,将此 BigInteger 与指定的 BigInteger 进行比较 * @param val - 将此 BigInteger 与之比较的 BigInteger * @return - 当此 BigInteger 在数值上小于、等于或大于 val 时,返回 -1,0,或 1。 */ public int compareTo(MyBigInteger val) { if (this.signum < 0 && val.signum > 0) return -1; else if (this.signum > 0 && val.signum < 0) return 1; else { MyBigInteger b1 = null; MyBigInteger b2 = null; if (this.signum < 0 && val.signum < 0) { b1 = val; b2 = this; } else if (this.signum > 0 && val.signum > 0) { b1 = this; b2 = val; } for (int i = MyBigInteger.MAXLENGTH - 1; i >= 0; i--) { if (b1.dataArray[i] > b2.dataArray[i]) return 1; else if (b1.dataArray[i] < b2.dataArray[i]) return -1; } return 0; } } /** * 得到绝对值,这里要用字符串重新new一个新的对象, 如果直接改变this的属性,返回this,会使原对象发生改变 * @return - 绝对值后的新对象 */ public MyBigInteger abs() { MyBigInteger result = new MyBigInteger(this.toString()); result.signum = 1; return result; }

37

/**

* 返回此 BigInteger 的十进制字符串表示形式。

* @return - 此 BigInteger 的十进制字符串表示形式。 */

public String toString() { String str = \; boolean boo = false; for (int i = dataArray.length - 1; i >= 0; i--) { if (boo == false && dataArray[i] != 0) { boo = true; str = this.signum > 0 ? \ : \; } if (boo) { str += dataArray[i]; } } if (str.equals(\)) return \; else return str; } /**

* 得到大整数的实际位数,不包括符号 * @return - 位数 */

public int length() { return this.abs().toString().length(); } /**

* 检查进位,做加法时检测 * @param i */

private void carryBit(int i) { if (i < MyBigInteger.MAXLENGTH - 1) this.dataArray[i + 1] += this.dataArray[i] / 10; this.dataArray[i] = this.dataArray[i] % 10; } /**

* 检查借位,做减法时检测 */

private void borrowBit(int i) { if (i < MyBigInteger.MAXLENGTH - 1) { if (this.dataArray[i] < 0) { this.dataArray[i] = this.dataArray[i] + 10; this.dataArray[i + 1]--; } }

38

} }

大整数类测试类源文件:TestBigInteger.java

import java.math.BigInteger; /**

* 大整数测试类 * @author 段智敏 */

public class TestBigInteger { public static void main(String[] args) { String a = \; String b = \; MyBigInteger m1 = new MyBigInteger(a); MyBigInteger m2 = new MyBigInteger(b); MyBigInteger m3; BigInteger b1 = new BigInteger(a);// 用Math包中的大整数类,验证结果 BigInteger b2 = new BigInteger(b); BigInteger b3; m3 = m1.add(m2); b3 = b1.add(b2); System.out.println(\和 = \ + m3.toString()); System.out.println(\验证结果:\ + b3.toString()); m3 = m1.subtract(m2); b3 = b1.subtract(b2); System.out.println(\差 = \ + m3.toString()); System.out.println(\验证结果:\ + b3.toString()); m3 = m1.multiply(m2); b3 = b1.multiply(b2); System.out.println(\积 = \ + m3.toString()); System.out.println(\验证结果:\ + b3.toString()); m3 = m1.divide(m2); b3 = b1.divide(b2); System.out.println(\商 = \ + m3.toString()); System.out.println(\验证结果:\ + b3.toString()); m3 = m1.remainder(m2); b3 = b1.remainder(b2); System.out.println(\余 = \ + m3.toString()); System.out.println(\验证结果:\ + b3.toString()); } }

第五章 图形界面设计

5.1 Swing与AWT有何关系?

答:Swing可以看作是AWT的改良版,而不是代替AWT,是对AWT的提高和扩展。在写GUI程序时,Swing和AWT都要使用,它们共存于JAVA基础类中。Swing中的类是从AWT中

39

继承的。 但它们也有重要的不同:AWT依赖于主平台绘制用户界面组件,而Swing有自己的机制,在主平台提供的窗口中绘制和管理界面组件。Swing和AWT之间的最明显的区别是界面组件的外观,AWT在不同平台上运行相同的程序,界面的外观和风格可能会有一些差异,而一个基于Swing的应用程序可能在任何平台上都会有相同的外观和风格。

5.2 什么是组件对象?什么是容器?容器与其他类型的组件有何不同?

答:组件是图形界面的基本元素,用户可以直接操作,java语言为每种组件都预定义类,程序通过它们或它们的子类创建各种组件对象。 容器是图形界面的复合元素,容器可以包含组件。java语言也为每种容器预定义类,程序通过它们或它们的子类创建各种容器对象。 容器与其他组件的不同是:为了能层次地构造复杂的图形界面,容器被当作特殊的组件,可以把容器放入另一个容器中,可以向容器中添加组件。

5.3 以下程序中,有多少个组件,哪些既是组件又是容器?

答:题中有五个组件:JFrame、JPanel、JButton、JTextField、JLabel,其中JFrame、JPanel既是组件也是容器。

5.4 什么是事件?什么是监听器?如何进行事件注册?

答:图形界面上的事件是指在某个组件上发生的用户操作。 对事件作监视的对象称为监视器,监视器提供响应事件的处理方法。

为了让监视器与事件对象关联起来,需要对事件对象作监视器注册,告诉系统事件对象的监视器。以程序响应按钮事件为例,当用户点击用户界面中与button对应的按钮时,button对象就会产生一个ActionEvent类型的事件。如果监视器对象是obj,对象的类是Obj,则类Obj必须实现AWT中的ActionListener接口,实现监视按钮事件睥actionPerformed方法。buton对象必须用addActionListener方法注册它的监视器对象obj。

5.5 如何进行事件处理?如何获取事件源?

答:java语言编写事件处理程序主要有两种主要方法:一个是程序重设方法handleEvent(Event evt);一个是程序实现一些系统设定的接口。java按事件类型提供多种接口,作为监视器对象的类需要实现相应的接口,即实现响应事件的方法。当事件发生时,系统内设的handleEvent(Event evt)方法就自动调用监视器的类实现响应事件的方法。 一个事件驱动程序要作的工作除创建源对象和监视器对象之外,还安排监视器了解源对象,或向源对象注册监视器。每个源对象有一个已注册的监视器列表,提供一个方法向该列表添加监视器对象。在源对象注册了监视器之后,系统会将源对象上发生的事件通知监视器对象。 getSource() 。

5.6 编写已个小应用程序,小应用程序窗口有一个按钮,点击这个按钮时,点击按钮的次数会显示在按钮上。

程序运行结果:

40