程序员希望实现这样的功能:由用户从控制台输入一个考试分数,如果这个分数在90或90以上输出“优”,如果分数在70到89输出“良”,如果分数在60到69输出“平”,如果分数在60以下输出“差” (暂不考虑分数大于100和小于0的错误处理)。
这是一个典型的“数字归类”问题。假设用户输入的分数用变量score来表示,并且运用之前所学的逻辑运算符,可以用如下代码实现该功能:
- if(score>=90) {
- System.out.println("优");
- }
- if(score>=70 && score<90) {
- System.out.println("良");
- }
- if(score>=60 && score<70) {
- System.out.println("平");
- }
- if(score<60) {
- System.out.println("差");
- }
这段程序中一共出现了4个if条件语句。通过观察不难发现:程序虽然能够实现题目要求的功能,但存在重复判断的情况,也就是说:无论用户输入的分数是多少,都会进行4次判断。如果用户输入95分,满足第1个if条件,此时直接就可以把分数归为“优”,后面的3次判断已经没有必要进行。如何实现在score>=90的情况下不进行后面的3次判断呢?很简单,把后面3个if语句放到else块中就行,这样,在score>=90的情况下只进行1次判断,只有在score<90的情况下才进行后面的判断,代码如下:
- if(score>=90) {//①
- System.out.println("优");
- }else {//①
- if(score>=70 && score<90) {
- System.out.println("良");
- }
- if(score>=60 && score<70) {
- System.out.println("平");
- }
- if(score<60) {
- System.out.println("差");
- }
- }
为了方便读者阅读,在程序中用注释的形式为if和else块进行了编号。在这段程序中,①号else与①号if相对应。当score>=90的情况下,①号if条件成立,程序不会进入else部分,此时只需要进行1次判断就能完成分数归类。
虽然优化了程序,但问题并没有彻底解决。当score<90的情况下,还是会进行3次判断。如果用户输入80分,程序进入else块,else块中的第1个if条件已经成立,分数可直接归为“良”,完全没必要进行后面的两次判断。解决这个问题可以仿照之前的优化办法,在程序中再添加一个else,代码如下:
- if(score>=90) {//①
- System.out.println("优");
- }else {//①
- if(score>=70 && score<90) {//②
- System.out.println("良");
- }else{//②
- if(score>=60 && score<70) {
- System.out.println("平");
- }
- if(score<60) {
- System.out.println("差");
- }
- }
- }
这段程序中,②号else与②号if相对应。这样,一旦②号if条件成立,就无需进行后面的判断。但是在 ②号else块中,之前存在的重复判断问题仍然存在,所以,还需按照相同的方式继续优化程序,代码如下:
- if(score>=90) {//①
- System.out.println("优");
- }else {//①
- if(score>=70 && score<90) {//②
- System.out.println("良");
- }else{//②
- if(score>=60 && score<70) {//③
- System.out.println("平");
- }else{//③
- if(score<60) {//④
- System.out.println("差");
- }
- }
- }
- }
经过3次优化,程序效率已经大大提升。但是仔细观察不难发现:②和③这两个if语句中不需要列出两个判断条件。因为②号if语句位于①号else块中,这意味着当进行②号if的条件判断时,score的值必定已经小于90。同理,③号if位于②号else块中,当进行③号if的条件判断时,score的值必定已经小于70。按照这种思路查看代码,不难发现④号if是完全多余的,因为④号if位于③号else块中,程序只要能进入③号else块,必然是因为score的值小于60,而④号if做了不必要的重复判断。综上所述,程序代码可以进一步优化为:
- if(score>=90) {//①
- System.out.println("优");
- }else {//①
- if(score>=70) {//②仅保留一个判断条件
- System.out.println("良");
- }else{//②
- if(score>=60) {//③仅保留一个判断条件
- System.out.println("平");
- }else{//③
- System.out.println("差");
- }
- }
- }
经过优化之后,去掉了④号if语句。Java语言还允许程序员在某个else块中仅存在判断性的语句的情况下去掉它的大括号,这样,程序就可以进一步优化为以下形式:
- if(score>=90) {
- System.out.println("优");
- }else if(score>=70) {
- System.out.println("良");
- }else if(score>=60) {
- System.out.println("平");
- }else{
- System.out.println("差");
- }
使用这样方式书写的程序去掉了所有不必要的判断,执行效率最高。同时,程序结构清晰,易于阅读。以后读者在遇到类似的“数字归类”问题时,建议都使用这样的结构书写程序。以下是原题目的完整代码:
【例02_11 分数归类】
Exam02_11.java
- import java.util.Scanner;
- public class Exam02_11 {
- public static void main(String[] args) {
- int score;// 分数
- Scanner sc = new Scanner(System.in);
- System.out.println("请输入分数:");
- score = sc.nextInt();
- if (score >= 90) {
- System.out.println("优");
- } else if (score >= 70) {
- System.out.println("良");
- } else if (score >= 60) {
- System.out.println("平");
- } else {
- System.out.println("差");
- }
- }
- }