本文共 4107 字,大约阅读时间需要 13 分钟。
一、程序改错
下面的程序使用“?:”运算符实现求一个变量的绝对值,设该变量的值为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())。
转载地址:http://dfntx.baihongyu.com/