第7章 工具类及常用算法
1.在所有的Java系统类中,Object类有什么特殊之处?它在什么情况下使用?
答:Object类是Java程序中所有类的直接或间接父类,也是类库中所有类的父类。正因为Object类是所有Java类的父类,而且可以和任意类型的对象匹配,所以在有些场合可以使用它作为形式参数的类型。使用Object类可以使得该方法的实际参数为任意类型的对象,从而扩大了方法的适用范围。
2.数据类型包装类与基本数据类型有什么关系?
答:Java的基本数据类型用于定义简单的变量和属性将十分方便,但为了与面向对象的环境一致,Java中提供了基本数据类型的包装类(wrapper),它们是这些基本类型的面向对象的代表。与8种基本数据类型相对应,基本数据类型的包装类也有8种,分别是:Character,Byte, Short, Integer, Long, Float, Double, Boolean。
3.Math类用来实现什么功能?设x,y是整型变量,d是双精度型变量,试书写表达式完成下面的操作:
(1)求x的y次方; (2)求x和y的最小值; (3)求d取整后的结果;
(4)求d的四舍五入后的结果; (5)求atan(d)的数值。 答:相应的表达式为: (1) Math.pow(x, y) (2) Math.min(x, y) (3) Math.floor(d) (4) Math.rint(d) (5) Math.atan(d)
4.Math.random()方法用来实现什么功能?下面的语句起到什么作用? (int)(Math.random()*6)+1
答:Math.random()用于产生随机数(0到1之间,包含0,但不包含1)。 上面的表达式表示1到6之间的一个随机整数(包含1及6)。
5.编程生成100个l~6之间的随机数,统计1—6之间的每个数出现的概率;修改程 序,使之生成1 000个随机数并统计概率;比较不同的结果并给出结论。
答:见程序。class Ex7_5 { public static void main(String[] args) { statistics( 100 ); statistics(1000 ); //结论:次数越大,6个数出现的机率越接近 } public static void statistics( int times ) { int [] cnt = new int[6]; for( int i=0; i { int r = rnd( 6 ); //得到一个随机数 cnt[ r-1 ] ++; //计数 } System.out.println(\出现的次数分别为\ for( int i=0; i<6; i++ ) { System.out.print( cnt[i] + \ } System.out.println(); } public static int rnd( int max ) { return (int)(Math.random() * max ) + 1; } } 结论是次数越多越均匀。 6.什么是字符串?Java中的字符串分为哪两类? 答:字符串是是字符的序列,在Java中,字符串,无论是常量还是变量,都是用类的对象来实现的。 字符串可以分为两大类,一类是创建之后不会再做修改和变动的字符串常量;另一类是创建之后允许再做更改和变化的字符串。前者是String类,后者是StringBuffer类。 7.编写Applet程序,接受用户输入的一个字符串和一个字符,把字符串中所有指定的字符删除后输出。 答:import java.applet.*; import java.awt.*; import java.awt.event.*; public class Ex7_7 extends Applet { TextField in1 = new TextField(10); TextField in2 = new TextField(10); Button btn = new Button(\删除字符串的指定字符\ Label out = new Label(\用于显示结果的标签\ public void main int() { setLayout( new FlowLayout() ); add( in1 ); add( in2 ); add( btn ); add( out ); btn.addActionListener( new BtnActionAdapter() ); } class BtnActionAdapter implements ActionListener { public void actionPerformed( ActionEvent e ) { String s1 = in1.getText(); String s2 = in2.getText(); char c2 = s2.charAt(0); StringBuffer sb = new StringBuffer(); for( int i=0; i 8.编程判断一个字符串是否是回文。 答:import java.io.*; public class Ex7_8 { public static void main(String[] args) { try{ BufferedReader in = new BufferedReader( new InputStreamReader( System.in ) ); System.out.print(\请输入一串字符: \ String s = in.readLine(); boolean flg = true; int len = s.length(); for( int i=0; i 9.String类的concat()方法与StringBuffer类的append()方法都可以连接两个字符串,它们之间有何不同? 答:String的concat()方法不改变原字符串本身,而是产生一个新的字符串。 StringBuffer的append()方法则改变其中的字符串内容,而不产生一个新的对象。 10.什么是递归方法?递归方法有哪两个基本要素?编写一个递归程序求一个一维数组所有元素的乘积。 答:简单地说,递归方法就是直接或间接调用自己的方法。递归方法有两个要素:一个是求得范围缩小的同性质问题的结果;另一是利用这个已得到的结果和一个简单的操作求得问题的最后解答。class Ex7_10 { public static double multi( double [] a ) { return mul( a, 0 ); //从第0个元素开始乘 } //下面的mul是一个辅助函数,它表示从第p个元素开始乘 public static double mul( double [] a, int p ) { if( p >= a.length ) return 1; else return a[p] * mul(a, p+1 ); //递归调用 } public static void main( String [] args ) { double [] a = { 1, 6, 7, 9 }; System.out.println( multi(a) ); } } 具体程序见源文件。 11.你了解几种排序算法?它们各自有什么优缺点?分别适合在什么情况下使用? 答:常见的排序算法有:冒泡排序、选择排序、快速排序等。前二者较简单,适合于元素个数较少的场合,而快速排序法则速度较快,适合于各种场合。 12.向量与数组有何不同?它们分别适合于什么场合? 答:向量的元素个数可以动态地增减,而数组则不行。前者适合于元素个数动态改变的场合,后者则适合于元素个数不变的场合。 13.Java中有几种常用的集合类及其区别如何?怎样获取集合中的各个元素。 答:常用的集合有向量、堆栈、队列等。它们可以使用枚举等方法来获集合中的元素,有的还可使用elemnetAt()等方法来获取其中的元素。 14.队列和堆栈各有什么特点? 答:队列和堆栈都是线性数据结构,队列遵循―先进先出‖(FIFO)原则,堆栈遵循―后进先出‖(LIFO)原则。 15.求解―鸡兔同笼问题‖:鸡和兔在一个笼里,共有腿100条,头40个,问鸡兔各有几只。 答://Ex 7-15: 鸡兔同笼 class Ex7_15 { public static void main(String[] args) { int chicken, rabbit; for( chicken=1; chicken<=40; chicken++ ) { rabbit = 40-chicken; //共40头 if( rabbit *4 + chicken *2 == 100 )//共100支脚 { System.out.println(\鸡有\,兔有\ } } } } 16.求解―百鸡问题‖。已知公鸡每只3元,母鸡每只5元,每3只小鸡1元。用100元钱买100只鸡,问每种鸡应各买多少。 答:见程序。class Ex7_16 { public static void main(String[] args) { int a, b, c; //三种鸡的只数 for( a=1; a<=100; a++ ){ for( b=1; b<100-a; b++ ){ c = 100 - a - b; if( c>0 && c%3==0 && 3*a+5*b+c/3==100 ){ System.out.println(\找到解:\ + a +\ } } } } } 17.求四位的水仙花数。即满足这样条样的四位数:各位数字的4次方和等于该数自身。 答:见程序。class Ex7_17 { public static void main(String[] args) { int a, b, c, d; //各位数 for( a=1; a<=9; a++ ){ for( b=0; b<=9; b++ ){ for( c=0; c<=9; c++ ){ for( d=0; d<=9; d++ ){ int s = 1000*a+100*b+10*c+d; int q = a*a*a*a+b*b*b*b+c*c*c*c+d*d*d*d; if( s == q ) System.out.println( s ); } } } } } }