// 测试数字是为奇数还是偶数
public class OddEven {
public static void main(String args[]) { if ( args.length == 0 ) {
System.out.print(\此程序将判断一正整数 \ System.out.println(\是奇数还是偶数 .\ System.out.print(\键入作为命令行参数 \ System.out.println(\的数字 .\ System.exit(0); } // if
int number = Integer.parseInt(args[0]);
if ( number % 2 == 0 ) // 如果数字为偶数 System.out.println(number + \为偶数 .\ else
System.out.println(number + \为奇数 .\ } // method main } // class OddEven
对于这种形式的条件语句,格式为:
if (expression) { statements1 } else { statements2 }
该条件语句的布尔表达式为true时执行语句statements1,布尔表达式为false时执行语句statements2。不同于if语句,else语句不包含条件。通常,在Java程序中,else语句与前面离它最近的if语句相匹配。如OddEven.java程序中:
if ( number % 2 == 0 ) // 如果数字为偶数
System.out.println(number + \为偶数 .\ else
System.out.println(number + \为奇数 .\ }
这个程序用一个数字是否可以被2整除来判断该数的奇偶性。被2除后,余数为0的数为偶数;余数为1的数则为奇数。程序中使用了if/else结构,根据if后面括号里的条件的真值来选择两种可能的行为。如果条件(number%2 == 0)是正确的, 即该数被2除后,余数为0,则条件后的陈述语句被执行;否则, else后面的陈述语句被执行。
把 statements1 和 statements2 括在花括号 ({}) 内通常是一个好习惯,这样更清楚,并可以避免无意中造成错误。这里对于if 和else的陈述语句可以不需要大括号,因为当条件正确时只有一条执行语句,而当条件错误时也只有另一条执行语句。假如在一种情况下要执行多于一条的语句,则需要用花括号括起来组成语句块(block)。
11
实验2.4.8: (W)练习if/else语句
为Compare.java 保存一个副本,命名为MyCompare.java。在后一个文件里,相应地修改类名和注释。然后修改MyCompare.java,使用3个if/else结构代替6个if结构来实现和Compare.java一样的效果。
编译MyCompare.java,用几组不同的数字对进行测试,这些数字对包括以下情形:(1) 第一个数小于第二个数;(2)第一个数大于第二个数;(3)第一个数等于第二个数。在每种情况中,程序都要显示正确的比较结果。
实验2.4.9: (P)编写程序HourMinSec.java
程序要求使用命令行参数来读取一个正整数,这个整数表示总秒数,编写程序输出与总秒数相等的时-分-秒。如果程序无命令行参数输入,DOS窗口将显示一个用户友好的提示信息。[提示:用整数除法和模运算,1小时=3600秒。]
实验2.4.10: (P)编写程序DigitParts.java
程序要求使用命令行参数来读取一个三位数,然后把这个三位数分离成单个的数字,最后把这些数字用空格分离的形式显示出来。例如,数字123 会被显示成 1 2 3。[提示:用整数除法和模运算来分离数位上的数字。] 运行结果示例如图2.1
图2.1 实验2.4.10运行结果示例
实验2.4.11: (P)编写程序DigitParts2.java
为DigitParts.java 保存一个副本,命名为DigitParts2.java。在后一个文件里,相应地修改类名和注释。修改DigitParts2.java,当用户的输入不是三位数时(如45,4258),程序会显示用户友好的错误提示信息。当然,如果用户没有正确输入命令行参数,这个程序也应该显示用户友好的的错误提示信息。
实验2.4.12: (W)JAVA中符号“+”的使用
编译并运行Plus.java,然后用记事本打开它,这个程序在DOS窗口输出:
68 366 7852
程序清单2-10:Plus.java
12
// Plus.java
// 演示加法和字符串连接
public class Plus {
public static void main(String[] args) {
System.out.println(23 + 45 + \ } // method main } // class Plus
JAVA语言中,加号“+”可以用做加法运算(当它出现在两个数字之间),也可以用做字符串的连接(当它出现在两个字符串之间,或者在一个字符串和一个数字之间。在这种情况下,数字会被自动转换成字符串然后和另一个字符串连接)。
Plus.java程序中System.out.println语句里的四个加号按照从左到右的顺序被依次定义。最左端的加号是加法运算,因为它出现在两个整数之间;第二个加号是字符串连接运算,因为它出现在一个数学表达式 23 + 45 和字符串 “ 366 ”之间;第三个加号是字符串连接运算,因为它出现在字符表达式23 + 45 + “ 366 ” 也就是“68 366”和正整数78之间。最右边的加号是字符串连接运算,因为在它左边所有的表达式在第四个加号未定义之前已经运算并生成了字符串“68 366 78” 。最终生成的字符串为“68 366 7852 “。
和代数运算一样, 在表达式中加括号可以改变运算的顺序。 为Plus.java 保存一个副本,命名为MyPlus.java,在源代码中只插入两个括号,使程序输出成为:
68 366 130
除了加入两个括号之外,代码不要做任何其他的修改。
实验2.4.13: (I)浮点数的比较
1. 编译和运行Comp3Flo.java程序,使用三个浮点数类型的命令行参数,这个程序会找出这三个数
中最大的那个数。
程序清单2-11:Comp3Flo.java
// Comp3Flo.java
public class Comp3Flo {
public static void main( String args[] ) { if ( args.length < 3 ) {
System.out.print(\此程序将找出\
System.out.println(\个作为命令行参数输入\ System.out.println(\的浮点数中的最大值.\ System.out.println(\运行此程序键入: \
System.out.println(\ java Comp3Flo num1 num2 num3\ System.out.print(\用数字值替代\
13
System.out.println(\和num3.\
System.exit(0); } // if
float number1 = new Float(args[0]).floatValue(); float number2 = new Float(args[1]).floatValue(); float number3 = new Float(args[2]).floatValue();
float largest;
if ( number1 > number2 ) largest = number1; else
largest = number2;
if ( number3 > largest ) largest = number3;
System.out.println(\数字\ + \ + \和\
+ \的最大数为 \
} // method main } // class Comp3Flo
如果输入没有小数点的命令行参数,这些参数会被自动的转换成浮点数,然后用小数点的形式显示出来。例如,
C:\\Lab02>java Comp3Flo 6 1 4.2 数字 6.0, 1.0, 和 4.2 的最大数为 6.0.
用不同的输入测试这个程序。测试3个不同数字的6种不同组合:
(1) 最小的数,中间的数,最大的数 (2) 最小的数,最大的数,中间的数 (3) 中间的数,最小的数,最大的数 (4) 中间的数,最大的数,最小的数 (5) 最大的数,最小的数,中间的数 (6) 最大的数,中间的数,最小的数
即使三个数字中有两个或两个以上的数字相等时,程序也可以正确地找出最大的数字。仔细阅读这个程序,理解程序中每一行代码的意义。
找出三个数字中最大数的关键代码如下:
float largest;
14
if ( number1 > number2 )
largest = number1; else
largest = number2;
if ( number3 > largest )
largest = number3;
第一行代码只声明(declare)了变量largest,并没有给largest变量赋初始值。largest变量的初始值是由if/else结构中条件number1 > number2 决定的。如果number1大于number2,执行初始赋值语句 largest = number1, 变量largest的初始值等于number1;反之,变量largest的初始值等于number2。
2. 为Comp3Flo.java 保存一个副本,命名为MyComp3Flo.java。
修改MyComp3Flo.java源码的类名和注释,编译程序,确保程序正确运行。
修改MyComp3Flo.java源码。在变量largest声明前加上注释//,在if/else结构中声明变量并同时对其赋初值。修改后的代码段如下:
// float largest;
if ( number1 > number2 )
float largest = number1; else
float largest = number2; 试着编译修改后的程序。 显然,编译不会通过。这是由于变量largest在赋初值前只能声明一次。
3. 修改MyComp3Flo.java源码,使之能正确编译。
程序编译通过后,进一步修改源码。用一对if结构代替if/else结构,修改后的代码段如下:
float largest;
if ( number1 > number2 )
largest = number1;
if ( number1 <= number2 )
largest = number2; 重新编译程序,将得到的错误提示信息写在下面: Comp3Flo.java:29: 可能尚未初始化变量 largest if ( number3 > largest ) ^
1 错误
编译错误的原因在于编译器(Compiler)无法识别条件number1 > number2 是条件 number1 <=number2的否定条件。因此,编译器认为可能在某种情况下,这两个布尔表达式都为false。当变量largest 在
if ( number3 > largest ) 语句中使用时,两个初始赋值语句可能都没有执行,变量largest可能尚未初始化。
15