• 第二章《Java程序世界初探》第10节:多重if...else语句


    程序员希望实现这样的功能:由用户从控制台输入一个考试分数,如果这个分数在90或90以上输出“优”,如果分数在70到89输出“良”,如果分数在60到69输出“平”,如果分数在60以下输出“差” (暂不考虑分数大于100和小于0的错误处理)。

    这是一个典型的“数字归类”问题。假设用户输入的分数用变量score来表示,并且运用之前所学的逻辑运算符,可以用如下代码实现该功能:

    1. if(score>=90) {
    2. System.out.println("优");
    3. }
    4. if(score>=70 && score<90) {
    5. System.out.println("良");
    6. }
    7. if(score>=60 && score<70) {
    8. System.out.println("平");
    9. }
    10. if(score<60) {
    11. System.out.println("差");
    12. }

    这段程序中一共出现了4个if条件语句。通过观察不难发现:程序虽然能够实现题目要求的功能,但存在重复判断的情况,也就是说:无论用户输入的分数是多少,都会进行4次判断。如果用户输入95分,满足第1个if条件,此时直接就可以把分数归为“优”,后面的3次判断已经没有必要进行。如何实现在score>=90的情况下不进行后面的3次判断呢?很简单,把后面3个if语句放到else块中就行,这样,在score>=90的情况下只进行1次判断,只有在score<90的情况下才进行后面的判断,代码如下:

    1. if(score>=90) {//①
    2. System.out.println("优");
    3. }else {//①
    4. if(score>=70 && score<90) {
    5. System.out.println("良");
    6. }
    7. if(score>=60 && score<70) {
    8. System.out.println("平");
    9. }
    10. if(score<60) {
    11. System.out.println("差");
    12. }
    13. }

    为了方便读者阅读,在程序中用注释的形式为if和else块进行了编号。在这段程序中,①号else与①号if相对应。当score>=90的情况下,①号if条件成立,程序不会进入else部分,此时只需要进行1次判断就能完成分数归类。

    虽然优化了程序,但问题并没有彻底解决。当score<90的情况下,还是会进行3次判断。如果用户输入80分,程序进入else块,else块中的第1个if条件已经成立,分数可直接归为“良”,完全没必要进行后面的两次判断。解决这个问题可以仿照之前的优化办法,在程序中再添加一个else,代码如下:

    1. if(score>=90) {//①
    2. System.out.println("优");
    3. }else {//①
    4. if(score>=70 && score<90) {//②
    5. System.out.println("良");
    6. }else{//②
    7. if(score>=60 && score<70) {
    8. System.out.println("平");
    9. }
    10. if(score<60) {
    11. System.out.println("差");
    12. }
    13. }
    14. }

    这段程序中,②号else与②号if相对应。这样,一旦②号if条件成立,就无需进行后面的判断。但是在 ②号else块中,之前存在的重复判断问题仍然存在,所以,还需按照相同的方式继续优化程序,代码如下:

    1. if(score>=90) {//①
    2. System.out.println("优");
    3. }else {//①
    4. if(score>=70 && score<90) {//②
    5. System.out.println("良");
    6. }else{//②
    7. if(score>=60 && score<70) {//③
    8. System.out.println("平");
    9. }else{//③
    10. if(score<60) {//④
    11. System.out.println("差");
    12. }
    13. }
    14. }
    15. }

    经过3次优化,程序效率已经大大提升。但是仔细观察不难发现:②和③这两个if语句中不需要列出两个判断条件。因为②号if语句位于①号else块中,这意味着当进行②号if的条件判断时,score的值必定已经小于90。同理,③号if位于②号else块中,当进行③号if的条件判断时,score的值必定已经小于70。按照这种思路查看代码,不难发现④号if是完全多余的,因为④号if位于③号else块中,程序只要能进入③号else块,必然是因为score的值小于60,而④号if做了不必要的重复判断。综上所述,程序代码可以进一步优化为:

    1. if(score>=90) {//①
    2. System.out.println("优");
    3. }else {//①
    4. if(score>=70) {//②仅保留一个判断条件
    5. System.out.println("良");
    6. }else{//②
    7. if(score>=60) {//③仅保留一个判断条件
    8. System.out.println("平");
    9. }else{//③
    10. System.out.println("差");
    11. }
    12. }
    13. }

    经过优化之后,去掉了④号if语句。Java语言还允许程序员在某个else块中仅存在判断性的语句的情况下去掉它的大括号,这样,程序就可以进一步优化为以下形式:

    1. if(score>=90) {
    2. System.out.println("优");
    3. }else if(score>=70) {
    4. System.out.println("良");
    5. }else if(score>=60) {
    6. System.out.println("平");
    7. }else{
    8. System.out.println("差");
    9. }

    使用这样方式书写的程序去掉了所有不必要的判断,执行效率最高。同时,程序结构清晰,易于阅读。以后读者在遇到类似的“数字归类”问题时,建议都使用这样的结构书写程序。以下是原题目的完整代码:

    【例02_11 分数归类】

    Exam02_11.java

    1. import java.util.Scanner;
    2. public class Exam02_11 {
    3. public static void main(String[] args) {
    4. int score;// 分数
    5. Scanner sc = new Scanner(System.in);
    6. System.out.println("请输入分数:");
    7. score = sc.nextInt();
    8. if (score >= 90) {
    9. System.out.println("优");
    10. } else if (score >= 70) {
    11. System.out.println("良");
    12. } else if (score >= 60) {
    13. System.out.println("平");
    14. } else {
    15. System.out.println("差");
    16. }
    17. }
    18. }

    除阅读文章外,各位小伙伴还可以点击这里观看我在本站的视频课程学习Java!

  • 相关阅读:
    Vue3属性绑定方式分析
    为什么需要线程池?C++如何实现一个线程池?
    关于MySql中explain结果filtered的理解
    软件测试工程师怎么样面试上好的公司?
    带你了解如何防御DDoS攻击
    Java后端使用POST请求向mysql中插入Json数据的问题
    从JDK8升级到JDK17
    pytorch-过拟合&欠拟合
    实战SpringMVC之CRUD
    抽象类和接口的区别
  • 原文地址:https://blog.csdn.net/shalimu/article/details/127997355