else if ( score >= 60 ) grade = 'D';
else // if ( score < 60 ) grade = 'F';
System.out.println(\分数为\的等级为\ } // method main
} // class PlugIfElseDemo3
2. Java编程语言有八种原始数据类型(Primitive Data Type)。原始类型可分为四种:
(1) 逻辑类 boolean (2) 文本类 char
(3) 整数类 byte、short、int、long (4) 浮点类 double、float
逻辑类boolean:数据类型有两种文字值:true和false。
文本类char:代表一个16-bit无符号的(不分正负的)Unicode字符
整数类byte, short, int, long: 采用三种进制(十进制、八进制和16进制),见下面的示例:
2 十进制数2
077 首位的0表示这是一个八进制的数值 0xBAAC 首位的0x表示这是一个16进制的数值
Java编程语言中的整数类型都是带符号的数字。整数数据类型的取值范围见表2.1。
表2.1 整数数据类型
字节数 8 bits 16 bits 32 bits 64 bits
数据类型 byte short int long 7 153163取值范围 -2 ... 2-1 -2 ... 2-1 -2 ... 2-1 -2 ... 2-1 6331157 浮点类float和double: 浮点数据类型的取值范围见表2.2。浮点文字除非明确声明为float,否则默认为double。
表2.2 浮点数据类型
字节数 32 bits 64 bits 数据类型 float double 取值范围 1.7E-308~1.7E+308 3.4E-038~3.4E+038 实验2.4.23: (I)嵌套if/else结构和变量的初始化
注意程序PlugIfElseDemo3.java中最后一个else的注释语句:
else // if ( score < 60 )
当执行到最后这个else时,程序已经穷举了变量score大于或者等于60的所有情况。因此,else执行时,我们知道变量score 的值肯定小于60。为PlugIfElseDemo3.java保存一个副本,命名为PlugIfElseDemo4.java。 然后删除最后else后的双斜杠: else if ( score < 60 )
26
编译程序,会得到什么错误信息?
PlugIfElseDemo4.java:29: 可能尚未初始化变量 grade
System.out.println(“分数为” + score + “ 的等级为” + grade + “.”); ^ 1 错误
由于最后的else已经和前一个if配对,最后一个if没有配对else。结果编译器认为有可能发生某种情况使得变量grade在下面的语句使用前没有赋初值。
System.out.println(\分数为\的等级为\编译器无法认识到程序已经罗列了所有的可能性。为了避免这种类型的编译错误,在嵌套if/else结构中初始化一个变量时要保证每个if都有与之配对的else。
实验2.4.24: (D)嵌套控制结构和变量的作用域
if/else结构不仅可以嵌套在另一个if/else结构中,也可以嵌套在while循环中。
OddEvenWithPlugIfElse.java程序(见程序清单2-20)使用了这种while循环嵌套if/else结构。
程序清单2-20:OddEvenWithPlugIfElse.java // OddEvenWithPlugIfElse.java
public class OddEvenWithPlugIfElse {
public static void main(String[] args) { if ( args.length == 0 ) {
System.out.print(\此程序计算输入的\ System.out.println(\一列命令行参数中的\ System.out.println(\奇数和偶数的个数。\ System.exit(0); } // if
int oddCount = 0; int evenCount = 0; int loopCount = 0;
while ( loopCount < args.length ) {
int number = Integer.parseInt(args[loopCount]); if ( number % 2 == 0 ) {
System.out.println(number + \是偶数。\ evenCount = evenCount + 1; } // if else {
System.out.println(number + \是奇数。\ oddCount = oddCount + 1;
27
} // else
loopCount = loopCount + 1; // 循环自加 } // while
System.out.println(\输入了 \
\个奇数和 \ \个偶数。\
} // method main
} // class OddEvenWithPlugIfElse
注意变量number是在循环体里声明的,而变量oddCount、evenCount和loopCount是在while循环前声明的。循环体中声明的变量只能在循环体中被使用,而在while循环前声明的变量在循环体内和循环体外都可以使用。
一般来说,一个代码块是用一对{ }括号括起来的任意数量的简单Java语句。块定义了变量的作用范围,也就是说,块中声明的变量只能在该块中使用。变量作用域是变量的可被访问范围,具体地说就是从变量第一次被声明的位置开始到声明这个变量的代码块的封闭(右)括号为止。
系统会在内存中为块中声明的变量分配一个区域。一旦程序执行退出代码块,在这个代码块中声明的任何变量就超出了作用域,对应的内存区域会被系统取消分配,对程序而言这些变量不可访问。
OddEvenWithPlugIfElse.java程序的while循环代码块中声明了变量number,变量number的作用域就是该循环体。while循环代码块一结束,变量number就超出了作用域,如果试图在后面的程序中访问number,编译器将产生下面的错误消息:
图2.2 变量作用域外访问变量引起的程序编译错误
实验2.4.25: (P)写一个命令行的应用程序GPA.java
GPA.java程序用于计算GPA(平均学分绩点),程序的一个输出示例如下: java GPA
java GPA grade1 credit1 grade2 credit2 ......calculates the GPA.
java GPA 100 3 89 4 75 2 Your GPA is 3.16
用户输入的第一个参数是第一门课程的百分制考试成绩,第二个参数是第一门课程的学分,第三个参数是第二门课程的成绩??
28
百分制与学分绩点的对应关系如下:
百分制成绩 100-95 94-90 89-85 84-80 79-75 74-70 69-65 64-60 59及其以下 成绩绩点 4.0 3.5 3.0 2.6 2.2 1.8 1.4 1.0 0
平均学分绩点 = (成绩绩点1×课程学分1 + 成绩绩点2×课程学分2 + ??) / 总学分 提示:编写一个多重分支的if/else结构,并把这个结构嵌套在while循环中。GPA的值取小数点后两位。
29