java2实用教学教程课后知识题目解析(第三版编程题).doc
,3. 编写应用程序,求1!+2!+10!。答:class Factpublic static void main(String args)int fact,sum=0;for(int i=1;i<=10;i+)fact=1;for(int j=1;j<=i;j+)fact*=j;sum+=fact;System.out.println("1到10的阶乘之和是:"+sum);4. 编写一个应用程序,求100以内的全部素数。答:class Primespublic static void main(String args)int w=1;for(int i=2;i<=100;i+)for(int j=2;j<i;j+)w=i%j;if(w=0)break;if(w!=0)System.out.println(i+"是素数");5. 分别用dowhile和for循环计算1+1/2!+1/3!+1/4!+的前20项和。答: for循环class Sumpublic static void main(String args)int fact;double sum=0;for(int i=1;i<=20;i+)fact=1;for(int j=1;j<=i;j+)fact*=j;sum+=1.0/fact;System.out.println(sum);dowhile循环class Sumpublic static void main(String args)int i=1;int fact;double sum=0;dofact=1;int j=0;while(+j<=i)fact*=j;sum+=1.0/fact;while(+i<=20);System.out.println(sum);6. 一个数如果恰好等于它的因子之和,这个数就称为“完数”。编写应用程序,求1000之内的所有完数。答:class Wanshu public static void main(String args)int x,i,sum;for(x=1;x<=1000;x+)sum=0;for(i=1;i<x;i+)if(x%i=0)sum+=i;if(x=sum)System.out.println(x+"是完数");7. 编写应用程序,分别使用while和for循环计算8+88+888+前10项之和。答: for循环class TheSumpublic static void main(String args)long sum=0,data=8;for(int i=1;i<=10;i+)sum=sum+data;data=data*10+8;System.out.println(sum);while循环class TheSumpublic static void main(String args)long sum=0,data=8,i=0;while(+i<=10)sum=sum+data;data=data*10+8;System.out.println(sum);8. 编写应用程序,输出满足1+2+3+n<8888的最大正整数n。答:class Maxnpublic static void main(String args)int k=1,sum=0;while(sum+=k)<8888)k+;k-;System.out.println("最大能取到:"+k);15.模仿例子4.27,编写一个类实现两个接口的程序。答: interface 表面积double allArea(double r);interface 体积double volu(double r);class Sph implements 表面积,体积double PI=3.14159;public double allArea(double r)return 4*PI*r*r;public double volu(double r)return 4.0/3*PI*r*r*r;public class Testpublic static void main(String args)double r=5.0;Sph a=new Sph();System.out.println("半径为5的球的表面积是:"+a.allArea(r);System.out.println("半径为5的球的体积是:"+a.volu(r);16.编写一个类A,该类创建的对象可以调用方法f输出英文字母表,然后再编写一个该类的子类B,要求子类B必须继承A类的方法f(不允许重写),子类创建的对象不仅可以调用方法f输出英文字母表,而且调用子类新增的方法g输出希腊字母表。答: class A int m;void f() for(m=65;m<91;m+)System.out.print(char)m+" ");for(m=97;m<123;m+)System.out.print(char)m+" ");System.out.println(" ");class B extends A int i;void g() for(i=913;i<930;i+)System.out.print(char)i+" ");for(i=931;i<938;i+)System.out.print(char)i+" ");for(i=945;i<962;i+)System.out.print(char)i+" ");for(i=963;i<970;i+)System.out.print(char)i+" ");System.out.println(" "); public class Test public static void main(String args) B b=new B();System.out.println("我调用方法f输出英文字母表:");b.f();System.out.println("我调用方法g输出希腊字母表:");b.g();17.编写一个异常类MyException,再编写一个类Student,该类有一个产生异常的方法public void speak(int m) throws MyException,要求参数m的值大于1000时,方法抛出一个MyException对象。最后编写主类,在主类的main方法中用Student创建一个对象,让该对象调用speak方法。答:class MyException extends Exception String str1;MyException(int m) str1=m+"出现错误 可能造成的原因是取值大于1000"public void showStr1() System.out.println(str1);class Student public void speak(int m) throws MyException if(m>1000) MyException exception=new MyException(m);throw exception;else System.out.println(m);public class Test public static void main(String agrs) int m;Student stu1=new Student();m=987;try stu1.speak(m);m=1234;stu1.speak(m);catch(MyException e) e.showStr1(); 18.编写一个类,该类有一个方法public int f(int a,int b),该方法返回a和b的最大公约数。然后再编写一个该类的子类,要求子类重写方法f,而且重写的方法将返回a和b的最小公倍数。要求在重写的方法的方法体中首先调用被隐藏的方法返回a和b的最大公约数m,然后将乘积(a*b)/m返回。要求在应用程序的主类中分别使用父类和子类创建对象,并分别调用方法f计算两个正整数的最大公约数和最小公倍数。答: class Apublic int f(int a,int b)if(a<b)int temp=0;temp=a;a=b;b=temp;int r=a%b;while(r!=0)a=b;b=r;r=a%b;return b;class B extends Apublic int f(int a,int b) int m;m=super.f(a,b);return (a*b)/m;public class Testpublic static void main(String args)A a=new A();System.out.println("18和102的最大公约数是:"+a.f(18,102);B b=new B();System.out.println("18和102的最小公倍数是:"+b.f(18,102);1. 使用String类的public String toUpperCase()方法可以将一个字符串中的小写字母变成大写字母,使用public String toLowerCase()方法可以将一个字符串中的大写字母变成小写字母。编写一个程序,使用这两个方法实现大小写的转换。答: class Testpublic static void main(String args)String str="I can use Java"System.out.println("要转换的字符串是:"+str);String s=str.toUpperCase();System.out.println("转换成大写字符串是:"+s);s=str.toLowerCase();System.out.println("转换成小写字符串是:"+s);2. 使用String类的public String concat(String str)方法可以把调用该方法的字符串与参数指定的字符串连接,把str指定的串连接到当前串的尾部获得一个新的串。编写一个程序通过连接两个串得到一个新串,并输出这个新串。答: class Testpublic static void main(String args)String str1="I can u"String str2="se Java"String s=str1.concat(str2);System.out.println("将字符串"+str1+"与字符串"+str2+"连接后得到的新字符串是:");System.out.println(s);1. 用Data类不带参数的构造方法创建日期,要求日期的输出格式是:星期 小时 分 秒。答: import java.util.*;import java.text.*;class Testpublic static void main(String args)Date 时间=new Date();SimpleDateFormat s=new SimpleDateFormat("E HH时 mm分 ss秒");System.out.println(s.format(时间);3. 计算某年、某月、某日和某年、某月、某日之间的天数间隔。要求年、月、日通过main方法的参数传递到程序中。答: import java.util.*;class Testpublic static void main(String args)Calendar c=Calendar.getInstance();c.set(2000,0,1);long time1=c.getTimeInMillis();c.set(2008,7,8);long time2=c.getTimeInMillis();long dayCous=(time2-time1)/(1000*60*60*24);System.out.println("2008年8月8日和2000年1月1日相隔"+dayCous+"天");5. 使用BigInteger类计算1!+3!+5!+7!+的前30项的和。答: import java.math.*;public class Testpublic static void main(String args)BigInteger sum=new BigInteger("0"), jieCheng=new BigInteger("1"), ONE=new BigInteger("1"), i=ONE;int k=0;while(+k<=30)sum=sum.add(jieCheng);i=i.add(ONE);jieCheng=jieCheng.multiply(i);i=i.add(ONE);jieCheng=jieCheng.multiply(i);System.out.println(sum);4. 编写应用程序,有一个标题为“计算的窗口”的窗口,窗口的布局为FlowLayout布局。窗口中添加两个文本区,当我们在一个文本区中输入若干个数时,另一个文本区,同时对输入的数进行求和运算并求出平均值,也就是说随着输入的变化,另一个文本区不断地更新求和及平均值。答: import java.awt.*;import java.awt.event.*;import java.util.*;class Calculated extends Frame implements TextListener TextArea text1,text2; /定义了2个文本区Calculated(String s) /标题为“计算的窗口”的窗口 super(s);setLayout(new FlowLayout(); /窗口布局为FlowLayouttext1=new TextArea(5,23);text2=new TextArea(5,23);add(text1);add(text2);text2.setEditable(false); /显示求和结果和平均值的文本区禁止编辑text1.addTextListener(this);addWindowListener(new WindowAdapter()public void windowClosing(WindowEvent e)System.exit(0););setBounds(100,100,400,160);setVisible(true);validate();public void textValueChanged(TextEvent e)String s=text1.getText();StringTokenizer geshu=new StringTokenizer(s); int n=geshu.countTokens();double a=new doublen;for(int i=0;i<n;i+) String temp=geshu.nextToken();double date=Double.parseDouble(temp);ai=date; double sum=0,average;for(int i=0;i<n;i+) sum=sum+ai;average=sum/n;text2.setText(null);text2.append("和:"+sum+"n"+"平均数:"+average);public class Test public static void main(String args) Calculated calc=new Calculated("计算的窗口"); 5. 文本区可以使用getSelectedText()方法获取该文本区通过拖动鼠标选中的文件。编写应用程序,有一个标题为“挑单词”的窗口,窗口的布局为BorderLayout布局。窗口中添加两个文本去和一个按钮组件,要求文本区分别添加到窗口的东部区域和西部区域;按钮添加到窗口的南部区域,当单击按钮时,程序将东部区域的文本区中鼠标选中的内容尾加到西部区域的文本区中。答: import java.awt.*;import java.awt.event.*;class WindowSelectedText extends Frame implements ActionListener TextArea text1,text2; /定义2个文本区Button button; /定义一个按钮WindowSelectedText(String s) /窗口名字为“挑单词” super(s);setLayout(new BorderLayout(); /窗口布局是BorderLayout布局text1=new TextArea(6,15);text2=new TextArea(6,15);button=new Button("确定");add(text1,BorderLayout.EAST);add(text2,BorderLayout.WEST);add(button,BorderLayout.SOUTH);button.addActionListener(this);addWindowListener(new WindowAdapter()public void windowClosing(WindowEvent e)System.exit(0););text2.setEditable(false);setBounds(100,100,350,200);setVisible(true);validate();public void actionPerformed(ActionEvent e) if(e.getSource()=button) String s=text1.getSelectedText()+"n"String str=text2.getText();text2.setText(str+s);public class Test public static void main(String args) new WindowSelectedText("挑单词");7. 改进例子7.16,在程序中增加一个名称为“确定”的按钮和一个文本区。当单击按钮时,程序验证用户是否输入了合法的E-mail地址格式,如果合法就将用户输入的姓名、E-mail和职业尾加到文本区中,否则在输入E-mail的文本框中提示用户输入了非法格式的E-mail地址。答: import javax.swing.*;import javax.swing.border.*;import java.awt.*;import java.awt.event.*;class WindowBox extends Frame implements ActionListener TextField text1,text2,text3;TextArea textarea;Box baseBox,boxV1,boxV2;Button button;WindowBox() button=new Button("确定");textarea=new TextArea(6,12);text1=new TextField(12);text2=new TextField(12);text3=new TextField(12);boxV1=Box.createVerticalBox();boxV1.add(new Label("姓名");boxV1.add(Box.createVerticalStrut(8);boxV1.add(new Label("email");boxV1.add(Box.createVerticalStrut(8);boxV1.add(new Label("职业");boxV2=Box.createVerticalBox();boxV2.add(text1);boxV2.add(Box.createVerticalStrut(8);boxV2.add(text2);boxV2.add(Box.createVerticalStrut(8);boxV2.add(text3);baseBox=Box.createHorizontalBox();baseBox.add(boxV1);baseBox.add(Box.createHorizontalStrut(10);baseBox.add(boxV2);setLayout(new FlowLayout();add(baseBox);add(button);add(textarea);addWindowListener(new WindowAdapter()public void windowClosing(WindowEvent e)System.exit(0););textarea.setEditable(false);button.addActionListener(this);setBounds(100,100,210,250);setVisible(true);validate();public void actionPerformed(ActionEvent e) boolean a;int b;String s;if(e.getSource()=button) s=text2.getText();a=s.endsWith(".com");b=s.indexOf("");if(a&&b>0) String str1=text1.getText()+"n"+text2.getText()+"n"+text3.getText()+"n"String str2=textarea.getText();textarea.setText(str2+str1);else text2.setText("输入了非法格式的E-mail地址");public class Test public static void main(String args) new WindowBox();8. 写一个应用程序,要求编写一个Panel的子类MyPanel,MyPanel中有一个文本框和一个按钮,要求MyPanel的实例作为其按钮的ActionEvent事件的监视器,当单击按钮时,程序获取文本框中的文本,并将该文本作为按钮的名称。然后在编写一个Frame的子类,即窗口。窗口的布局为BorderLayout布局。窗口中添加两个MyPanel面板,分别添加到窗口的东部区域和西部区域。答: import java.awt.*;import java.awt.event.*;class MyPanel extends Panel implements ActionListener String name;TextField text;Button button;MyPanel() text=new TextField(10);button=new Button("确定");add(text);add(button);button.addActionListener(this);addWindowListener(new WindowAdapter()public void windowClosing(WindowEvent e)System.exit(0););public void actionPerformed(ActionEvent e) if(e.getSource()=button) name=text.getText();button.setLabel(name);class MyFrame extends Frame MyPanel panel1,panel2;MyFrame() panel1=new MyPanel();panel2=new MyPanel();add(panel1,BorderLayout.EAST);add(panel2,BorderLayout.WEST);setBounds(100,100,400,100);setVisible(true);validate();public class Test public static void main(String args) MyFrame win=new MyFrame();9. 参照例子7.18编写一个应用程序,要求有一个画布,在画布上绘制一个矩形,用户通过文本框输入矩形的宽和高以及矩形左上角的位置坐标。答:import java.awt.*;import java.awt.event.*;class Mycanvas extends Canvas int x,y,w,h;Mycanvas() setBackground(Color.cyan);public void setX(int x) this.x=x;public void setY(int y) this.y=y;public void setW(int w) this.w=w;public void setH(int h) this.h=h;public void paint(Graphics g) g.drawRect(x,y,w,h);class WindowCanvas extends Frame implements ActionListener Mycanvas canvas;TextField text1,text2,text3,text4;Button button;WindowCanvas() canvas=new Mycanvas();text1=new TextField(4);text2=new TextField(4);text3=new TextField(5);text4=new TextField(5);Panel pNorth=new Panel(),pSouth=new Panel();button=new Button("确定");button.addActionListener(this);pNorth.add(new Label("矩形的宽: ");pNorth.add(text3);pNorth.add(new Label("矩形的高: ");pNorth.add(text4);pSouth.add(new Label("左上角位置坐标:");pSouth.add(text1);pSouth.add(text2);pSouth.add(button);addWindowListener(new WindowAdapter()public void windowClosing(WindowEvent e)System.exit(0););add(canvas,BorderLayout.CENTER);add(pNorth,BorderLayout.NORTH);add(pSouth,BorderLayout.SOUTH);setBounds(100,100,500,500);setVisible(true);validate();public void actionPerformed(ActionEvent e) int x,y,w,h;try x=Integer.parseInt(text1.getText();y=Integer.parseInt(text2.getText();w=Integer.parseInt(text3.getText();h=Integer.parseInt(text4.getText();canvas.setX(x);canvas.setY(y);canvas.setW(w);canvas.setH(h);canvas.repaint();catch(NumberFormatException ee) x=0;y=0;w=0;h=0;public class Test public static void main(String args) new WindowCanvas();10.编写应用程序,有一个窗口对象,该窗口取它的默认布局: BorderLayout布局,北面添加一个List组件,该组件有四个商品名称的选项。中心添加一个文本区,当选择List组件中的某个选项后,文本区显示对该商品的价格和产地:当双击List组件中的某个选项后,文本区显示该商品的详细广告。答: import java.awt.*;import java.awt.event.*;class WindowGoods extends Frame implements ActionListener,ItemListener String s="产地:北京","产地:上海","产地:沈阳","产地:广东"String p="价格:3200","价格:158","价格:13.2","价格:320/打"String a="本商品*","本商品*","本商品*","本商品*"List list;TextArea text;WindowGoods()list=new List(3,false);text=new