JAVA课后习题答案.docx
《JAVA课后习题答案.docx》由会员分享,可在线阅读,更多相关《JAVA课后习题答案.docx(59页珍藏版)》请在冰豆网上搜索。
JAVA课后习题答案
前言
学习网址
第一章Java语言基础
1.指出Java语言的主要特点和ava程序的执行过程。
答:
强类型。
编译和解释。
自动无用内存回收功能。
面向对象。
与平台无关。
安全性。
分布式计算。
多线程。
2.说出开发与运行Java程序的主要步骤。
答:
安装SUN的JDK,配置classpath
编写源文件。
编译。
运行。
3.如何区分应用程序和小应用程序。
答:
应用程序必须在一类中定义一个main()方法,该方法代表应用程序的入口。
小应用程序不必定义main()方法,但是必须继承applet类。
4.说出Java源文件的命名规则。
答:
和类命名规则一样,首字母大写。
5.选择一种上机环境,参照实例,编写一个输出“helloworld!
”字样的Java程序。
答:
选择SUN的IDE,用UltraEdit-32编写如下:
//HelloWorld.java
/**
*
这是第一个程序
*@author饶林
*@see
*/
classHelloWorld{
publicstaticvoidmain(String[]args){
System.out.println("HelloWorld!
");
}
}
6.Java用什么字符集?
共有多少个不同的字符?
答:
Java语言使用Unicode字符集,共有65535个字符。
7.Java语言标识符的命名规则是什么?
答:
由字母(包括英文字母、下划线、美元字符、文字字符)和数字字符组成。
限定标识符的第一个字符不能是数字。
8.Java有哪些基本的数据类型,它们的常量又是如何书写的?
答:
基本的数据类型也称为原始数据类型,是系统预先规定的一些常用类型。
它们是:
整数类型、浮点数(实数)类型、字符(文字)类型、逻辑类型(布尔型)。
9.指出下列内容那些事Java语言的整形常量,哪些是浮点数类型常量,那些两者都不是?
1)E-42)A4233)-1E-314)0xABCL5).32E316)0877)0xL
8)0039)0x12.510)07711)11E12)056L13)0.14).0
答:
整形常量:
4,5,6,8,10,12
浮点型:
1,3,9,13,14
两者都不是:
2,7,11
第二章运算和语句
1.Java字符能参加算术运算吗?
答:
能,例如char类型a自加后变b
2.占字节多的变量能直接赋给占字节少的变量吗?
答:
不能,需强制类型转换。
3.试用Java语言表达式描述以下数学计算式或逻辑条件:
1)
V=(4/3)*math.PI*math.pow(r,3);
2)R=1/(1/R1+1/R2)
原式
3)y=x5+x3+6
y=pow(x,5)+pow(x,3)+6;
4)F=M1M2/R2
F=M1*M2/R*R
5)
Math.sin(x)/ax+Math.cos(π*x/2)>0?
Math.cos(π*x/2):
-Math.cos(π*x/2);
6)0a>0&&a<10
7)条件x=1与y=2有且只有一个成立
(x==1&&y!
=2)||(x!
=1&&y==2)
4.设再求以下表达式之前,整形变量a的值是4,试指出在求表达式之后变量a,b和c的值。
1)b=a*a++;
b=16,a=5;
2)c=++a+a;
c=10,a=5;
5.编写一个程序示意前缀++和后缀++的区别,前缀—和后缀—的区别。
答:
领悟第四题完全就可以理解前缀++后缀++
--亦如此。
6.若一个数恰好等于它的因子之和,则这个数称为“完全数”。
编写程序求1000之内的所有完全数。
解析:
什么是数的因子?
因子就是所有可以整除这个数的数,但是不包括这个数自身.
//HelloWorld.java
/**
*
这是第二个程序
*@author饶林
*@see
*/
publicclassPraxis2_6{
publicstaticvoidmain(String[]args){
inti,j,sum;
for(i=1;i<=1000;i++){
//sum归0必须在此处
sum=0;
for(j=1;j<=i/2;j++){
if((i%j)==0)
sum=sum+j;
}
if(i==sum)
System.out.print(i+"");
}
}
}
7.编写输入正实数x,求平方不超过x的最大正整数n,并输出。
解析:
/**
*
这是第三个程序
*@author饶林
*@see
*/
importjava.util.*;
publicclassPraxis2_7
{
publicstaticvoidmain(String[]args)
{
ScannerconsoleScanner=newScanner(System.in);
System.out.print("请输入正实数X:
");
intx=consoleScanner.nextInt();
inty=(int)(Math.sqrt(x));
System.out.println("n="+y);
}
}
8.输入正整数n输出n行n列星号字符组成三角图案。
/**
*
这是第四个程序
*@author饶林
*@see
*/
importjava.util.*;
publicclassPraxis2_8{
publicstaticvoidmain(String[]args){
ScannerconsoleScanner=newScanner(System.in);
System.out.print("请输入正整数x:
");
intx=consoleScanner.nextInt();
for(inty=0;yfor(intm=x-y-1;m>0;m--){
System.out.print("");
}
for(intn=0;nSystem.out.print("*");
}
System.out.println();
}
}
}
9.设有整形变量x和y的值分别为5和110.指出执行了下列语句后,变量x和y后的值分别是多少?
1)while(x<=y)x*=2;
X=160,y=110;
2)do{x=y/x;y=y-x;}while(y>=1);
X=18,y=0;
10.水仙花数是一个n(>=3)位的数,它等于每个数字的n次幂之和。
例如,153是一个水仙花数,153=13+53+33,是编写一个程序,求小于999的所有水仙花数。
/**
*
这是第五个程序
*@author饶林
*@see
*/
publicclassPraxis2_10{
publicstaticvoidmain(String[]args){
intx,y,z;
for(intm=100;m<999;m++){
x=m/100;
y=(m%100)/10;
z=(m%100)%10;
if(m==x*x*x+y*y*y+z*z*z)
System.out.print(m+"");
}
}
}
11.编程序解百鸡问题:
鸡翁一,值钱五,鸡母一,值钱三,鸡邹三,值钱一,百钱买百鸡,求鸡翁,鸡母,鸡邹各几何?
/**
*
这是第六个程序
*@author饶林
*@see
*/
publicclassPraxis2_11
{
publicstaticvoidmain(Stringargs[])
{
for(inti=0;i<=100;i++)
for(intj=0;j<=100;j++)
for(intk=0;k<=100;k+=3)//鸡雏的个数必须使3的倍数
{
if(((5*i+3*j+k/3)==100)&&(i+j+k==100))
System.out.println("鸡翁:
"+i+";鸡母:
"+j+";鸡雏:
"+k);
}
}
}
12.编写程序,按下面的公式计算自然对数底e的值:
e=1+1/1!
+1/2!
+1/3!
......
/**
*
这是第七个程序
*@author饶林
*@see
*/
publicclassPraxis2_12
{
publicstaticvoidmain(Stringargs[])
{
intn=1000;//计算精度
doublee=1.0;
for(inti=1;i<=n;i++)
{
e=e+1.0/Praxis2_12.factorial(i);
}
System.out.println("e="+e);
}
staticdoublefactorial(inta)//计算阶乘的静态方法
{
doublef=1.0;
for(intj=1;j<=a;j++)
f=f*j;
returnf;
}
}
13.编写程序,用如下公式计算圆周率的近似值:
14.回文整数是正读反读相同的整数,编写一个程序,输入一个整数,判断是否为回文整数。
/**
*
这是第八个程序
*@author饶林
*@see
*/
importjava.util.*;
publicclassPraxis2_14//输入整数,判断是否是回文整数
{
publicstaticvoidmain(Stringargs[])
{
inta[]=newint[100];
inti=0;
booleanb=true;
ScannerconsoleScanner=newScanner(System.in);
System.out.print("请输入一个int型整数:
");
intx=consoleScanner.nextInt();
inttest=x;
while(test>0)//把整数的各个位上的数存到数组里
{
a[i]=test%10;
test=test/10;
i++;
}
for(intj=0;j
{
if(a[j]!
=a[i-j-1])
{
b=false;
break;
}
}
if(b)System.out.println(x+"是回文整数");
elseSystem.out.println(x+"并不是回文整数");
}
}
15.草地上有一堆野果,有一只猴子每天要吃掉一半又一个,五天后刚好吃完,问有多少个,猴子每天吃多少个?
/**
*
这是第九个程序
*@author饶林
*@see
*/
publicclassPraxis2_15{
publicstaticvoidmain(String[]args){
intday,x1,x2;
day=5;x2=0;
while(day>0){
x1=(x2+1)*2;
x2=x1;
day--;
}
System.out.println("共有"+x2+"个桃子。
");
System.out.println("----------------------------");
for(inti=1;i<6;i++){
inteast;
east=x2/2+1;
x2=x2/2-1;
System.out.println("第"+i+"天吃"+east+"个。
");
}
System.out.println("----------------------------");
}
}
第三章面向对象编程基础
1.什么是面向对象技术?
它有什么优点?
答:
程序设计者考虑的是对象的描述,对象间的关系,类的管理、什么时候什么地方调用对象的那一种方法。
最大的优点是面向对象编程能有效地支持重用,是超大规模的程序也变得相对容易维护。
2.面向对象的程序设计与面向过程的程序设计有什么区别?
答:
面向过程的语言编程编程模式是:
程序=数据结构+算法
编程时需要考虑的是程序做什么,怎么做,重点考虑每个实现的细节。
面向对象的编程模式:
程序=对象+消息
程序设计者考虑的是对象的描述、对象间的关系、类的管理、什么时候和什么地方调用对象的那一种方法。
3.在程序中对象有什么区别?
答:
类是对同一种对象的描述,类概括了同类对象的共有性质:
数据和方法。
类的每个对象都有自己的标识,但它们具有相同的一组属性和提供相同的一组方法。
4.举例说明类方法和实例方法,以及类变量和实例变量的区别。
什么情况下用实例变量?
什么情况下用类变量?
答:
一般静态的数据和方法使用类变量。
5.子类能继承超类的那些成员变量和方法?
超类
子类
Private
No
(默认)
Yes
Protect
Yes
Public
Yes
6.子类在什么情况下能隐藏超类的成员变量和方法?
答:
重写
7.在子类中是否允许有一个方法和超类的方法名字相同,而类型不同?
答:
不应许,子类中定义一个方法,并且这个方法的名字、返回类型、参数个数、和类型与从父类继承的方法完全相同。
例如:
classR{
intadd(){
inta=2;
returna++;
}
}
publicclassRRextendsR{
floatadd(){
floata=2.0;
returna;
}
publicstaticvoidmain(String[]args){
System.out.println(add());
}
}
8.试说出对象、类、继承和多态性的概念。
9.略
10.接口与抽象类的区别。
答:
抽象类:
whatcanIdo?
接口:
Icandoit.
例子:
就像铁门木门都是门(抽象类),你想要个门我给不了(不能实例化),但我可以给你个具体的铁门或木门(多态);而且只能是门,你不能说它是窗(单继承);一个门可以有锁(接口)也可以有门铃(多实现)。
门(抽象类)定义了你是什么,接口(锁)规定了你能做什么(一个接口最好只能做一件事,你不能要求锁也能发出声音吧(接口污染))。
11.指出Applet的程序结构及各方法的作用。
答:
JavaAPI的Applet类为您提供设计applet程序外观并管理其动作时所需要的支持。
该类提供一种叫做Panel(面板)的图形用户界面(GUI)组件以及大量方法。
要创建一个applet程序,就需要扩展该Applet类(或创建子类)并实现您所需要的外观和动作。
12.以下程序的错误:
Takecare.java:
5:
无法从静态上下文中引用非静态变量a
floatc=a+b;
^
13.试声明一个复数类Complex。
解析:
//样例大家扩展
classComplex{
doublea,b;
Complex(){}
Complex(doublea,doubleb){
this.a=a;
this.b=b;
}
publicStringPrint(){
Stringresult=newString(this.a+(b>0?
"+":
"")+(b!
=0?
this.b+"i":
""));
returnresult;
}
publicComplexadd(Complexval){
Complexresult=newComplex();
result.a=this.a+val.a;
result.b=this.b+val.b;
returnresult;
}
}
publicclassTestComplex{
publicstaticvoidmain(String[]args){
Complexcomplex1=newComplex(1.0,2.0);
Complexcomplex2=newComplex(2.0,3.0);
System.out.println(complex1.add(complex2).Print());
}
}
第四章数组和字符串
1.举例说明如何声明、创建初始化数组。
答:
有三种方法。
书P69,不一一举例了。
2.略
3.一个数组能存储不同类型的元素吗?
答:
不能。
4.编写一个Java程序,形成以下形式的二维数组,并输出。
解析:
publicclassArry{
publicstaticvoidmain(String[]args){
int[][]a={{1,2,9,10,25},
{4,3,8,11,24},
{5,6,7,12,23},
{16,15,14,13,22},
{17,18,19,20,21}};
for(inti=0;ifor(intj=0;jif(a[i][j]<10){
System.out.print(""+a[i][j]+"");
}else
System.out.print(a[i][j]+"");
}
System.out.println();
}
}
}
5.Java中字符数组与字符串有什么区别?
答:
数组是一个容器。
6.确定一个字符数组长度与确定一个Sting对象的长度有什么区别?
答:
确定字符数组的长度用属性length,而String对象用方法length()。
7.String类的方法转换。
解析:
publicclassConvert{
publicstaticvoidmain(String[]args){
Stringa="StrIng";
System.out.println(a.toUpperCase());
System.out.println(newString(a.toLowerCase()));
}
}
8.使用String类的concat方法:
例:
publicclassTestConcat{
publicstaticvoidmain(String[]args){
Stringa=newString("raoliv->");
Stringb=newString("");
System.out.println(a.concat(b));
}
}
9.试利用java.util.Date类继承声明实现MyDate类。
。
。
解析:
10.略
11.编写实现从两字符串找出最长的相同字符序列的代码。
解析:
得到字符串str1,str2后,有一个为空则子列为空。
如果都不为空,开始下面的步骤。
求得两列的长度分别为n1,n2。
动态生n2行n1列矩阵(二维数组)。
取str2中每个元素(记位置为i)与str1中元素(记位置为j)逐个比较,如果相等则为矩阵中相应行列坐标的元素赋值为1,否则为0(可用循环嵌套完成)。
比如str1(abc0cbad)str2(cba1abc)两串的话,可以得到如图所示矩阵。
然后,不难看出,要进行如下步骤。
定义strax,用来记录最大子列中元素个数。
定义数组l[n2],用来记录最大子列的首字符地址(因为可能有不同最大子列,故用数组,而不是单个变量)。
判断矩阵中每一个元素,是否为1,如果是则记下此时行地址到l数组,然后判断相对于这个元素的下一行下一列的元素是否为1,如果是则继续判断,一直到为0。
记下此次判断(即一个while循环)中“1”的个数n,存入变量strax。
对于矩阵中的每一个元素都这么判断,如果判断中n的值大于strax那么把n付给strax,同时把这个子列的首地址付给l[0],l[0]后面的元素全赋值为-1。
如果,某次判断得到的n与strax相同,即有相同最大子列,那么把它的首地址存入l数组的下一个位置。
当这个矩阵的每一个元素都判断完毕后,会得到strax,和数组l,然后用循环做如下输出过程:
依次以l数组中的每个元素为首地址,输出str2字符串中以相应序号开头的strax个字符,那么完成所有最大子列的输出。
例子:
输入:
aabcbcb
bcabcbac
输出:
abcb
publicclasstest1{
publicstaticvoidmain(String[]args){
intmax=0;
intcurrent=0;
Stringstr1=newString("aabcbcb");
Stringstr2=newString("bcabcbac");
intlen1=str1.length();
intlen2=str2.length();
intarr[][];
arr=newint[len1][len2];
//初始化数组
for(inti=0;ifor(intj=0;j