一、程序改错下面的程序使用“?:”运算符实现求一个变量的绝对值,设该变量的值为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文档中有着详细的介绍,希望大家在今后的学习过程中对这部分内容要时常地加以熟悉。
一、观察与思考
编写声明不同数据类型变量的程序文件SY2_1.java,源代码如下: 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,使用时两边不能加任何引号。
建立SY2_2.java 文件,通过本程序了解变量的使用范围,源代码如下: 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())。
相关资源:七夕情人节表白HTML源码(两款)