一、程序改错
下面的程序使用“?:”运算符实现求一个变量的绝对值,设该变量的值为8,则程序运行结果如图2-2所示。
找出下列程序中的错误,并将其改正。
#1 public class TernaryTest {
#2 public static void main(String[] args) {
#3 int a,b;
#4 a=8;
#5 b=a>0?-a:a;
#6 System.out.println(a "的绝对值是:" b);
#7 a=-8;
#8 b=a<0?-a:a;
#9 System.out.println(a;"的绝对值是:";b);
#10 }
#11 }
答案:
#5 应改正为:b=a<0?-a:a;
#6 应改正为:System.out.println(a+"的绝对值是:"+b);
#9 应改正为:System.out.println(a+"的绝对值是:"+b);
解析:根据条件运算符“?:”的运算规则,它首先判别表达式a>0的值,由于当前a=8,故表达式的值为真,则返回–a的值,这显然是不合要求的。因此要将表达式改为a<0。在第6行的输出语句中,变量a之后与变量b之前的加号的作用是:让a的取值与它后面的字符串以及b的取值相连接,然后再输出结果字符串(实际上在连接的过程中首先将a和b转换成等同的字符串然后再进行连接)。一般来说,在println()方法中若要将多个字符串连在一起,通常是用加号来实现的。第9行语句的修改理由与第6行是一样的。
二、编程题
编写程序,利用System.out.println()方法分别输出下列语句的执行结果:
1)将变量a的初值赋值为10,变量b的初值赋值为5。
2)变量a的值加2,变量b的值加5。
3)求a和b的平均值,并将该值赋予变量c。
4)将a的平方乘以b的平方并赋值给变量d。
答案:程序代码如下:
public class Expression {
public static void main(String[] args) {
int a=10,b=5;
double c;
long d;
System.out.println("a="+a+" b="+b);
a+=2;
b+=5;
System.out.println("a="+a+" b="+b);
c=(a+b)/2;
System.out.println("c="+c);
d=(long)(Math.pow((double)a,2)*Math.pow((double)b,2));
System.out.println("d="+d);
}
}
解析:Java语言规定:任何变量在使用之前必须声明,在变量声明的过程中允许同时对变量进行赋值。程序中的“a+=2;”与“b+=5;”语句是在变量a和b已被赋值的情况下的复合赋值运算语句;本程序中使用的pow(double a,double b)方法,返回第一个参数(a)的第二个参数(b)次幂的值,即ab的值。该方法被封装于java.lang的Math类中。值得注意的是:这个方法的两个参数都必须是double类型,但由于我们所声明的a和b变量都为int类型,因此在使用前必须进行强制转换,同时我们声明的变量d是long类型,因此当乘法运算结束时,必须再一次将结果强制转换为long类型数据才能赋值给d。
在这里使用的pow()方法,在第1章中所提到的API文档中有着详细的介绍,希望大家在今后的学习过程中对这部分内容要时常地加以熟悉。
一、观察与思考
public class SY2_1 {
public static void main(String args[]) {
byte mb=050;
short ms=0xff;
int mi=1000000;
long ml=0xffff;
char c='a';
float mf=0.25f;
double md=0.8E-3;
boolean B=true;
}
}
在原有代码后面加上相应的输出语句,输出变量的值。编译并运行该程序,仔细观察其运行结果。
程序分析:
在程序的第3行至第6行的语句中,可以看到:对于Java的整型变量,不管以何种数制进行输入,系统总会将其转换为十进制数进行输出。
在程序的第7行语句中,Java的字符型常量值是用单引号引起来的一个字符,双引号用来表示字符串,两者切记不可混用。
在程序的第8行语句中,语句的最后加了一个数据类型符f,为什么要加这个符号呢?这是为了“告诉”编译器将该常数按程序员指定的数据类型(该处为单精度型)进行处理,因为编译系统在处理类似“0.25”这样的“直接常数”时,有其默认的处理规则:对于整数一律按int类型处理;对于浮点数一律按double类型处理。第8行的语句若是不加f的话,编译器就会将数据0.25按double类型处理,double类型的数据要赋值给float类型的变量,系统不能进行自动转换,因此就会出现编译错误。对于第6行的语句,正规的赋值语句应该是“long ml=0xffffL;”,若是后面不加L,编译器将把十六进制数ffff转换为十进制数65535后按int类型处理,由于65535属于int类型的处理范围,因而处理完毕后赋值给长整型变量ml,int类型的数据到long类型的数据,系统可以进行自动转换,因此不会出错。
在程序的第10行语句中,Java的布尔型常量只有两个值:false和true,使用时两边不能加任何引号。
public class SY2_2 {
static int a=10;
public static void main(String args[]) {
{
int b=20;
System.out.println("a="+a);
System.out.println("b="+b);
}
System.out.println("a="+a);
System.out.println("b="+b);
}
}
观察编辑窗口的提示情况,试修改上面的程序,然后编译并运行该程序。
程序分析:
此时会出现错误提示。因为变量b在方法块中声明,在方法块之外它是不存在的, 所以此时系统会提示出错。修改方法有两种:一是将变量b作为静态变量声明到第二行(即变量a的声明语句)的后面,二是干脆删除第10行关于变量b的输出语句。
二、程序改错
#1 public class Getval {
#2 public static void main (String args []) {
#3 int x, y;
#4 float z = 3.414;
#5 double w = 3.1415;
#6 boolean tru = true;
#7 char c;
#8 String str1 = 'bye';
#9 c = "A";
#10 x = 6;
#11 y = 1000;
#12 }
#13 }
#1 public class Statval {
#2 public static main(String[] args) {
#3 int x = 2, y = 4, z = 6;
#4 a = x + y – 2*2 + z;
#5 System.out.println(a);
#6 a = (x + y – 2)*(2 + z);
#7 System.out.println(a);
#8 }
#9 }
三、编程题
编写一个Java Application,其功能为:在程序中取两个随机整数(10~300),以如图2-3所示形式显示它们的和(设两个随机数分别为204和94)。
提示:可在java.lang.Math类中调用random()方法,random()为实现取0~1之间的随机数方法,该方法返回值是正数,类型为double。如果要得到其他范围的数,则要进行相应的转换。例如要得到(a,b)之间整数的方法可写为:(int) ((b–a+1)Math.random()+a),若要得到(0,99)之间的整数可以使用语句:int m = (int) (100Math.random())。