「Java题库」选择结构(理论+操作)

122 阅读8分钟

理论试题

一、选择题

  1. 下面哪个if语句的写法是正确的? A.if x > 10 { } B.if (x > 10) then { } C.if (x > 10) { } D.if {x > 10} 答案:C
    解析:Java的if语句条件必须用圆括号括起来,A选项错误。B选项多了一个then,D选项的花括号位置不对。

  2. 以下代码的输出结果是?

    int score = 85;
    if (score >= 90) {
        System.out.print("优秀");
    } else if (score >= 80) {
        System.out.print("良好");
    } else {
        System.out.print("加油");
    }
    

    A.优秀
    B.良好
    C.加油
    D.没有输出
    答案:B
    解析:85分不满足第一个条件(>=90),但满足第二个条件(>=80),所以输出"良好"。else if就像梯子一样,从上往下逐个检查,遇到第一个满足的条件就执行对应的代码块。

  3. 关于switch语句,下列说法错误的是: A.case后面的值可以是字符串
    B.每个case后面都要加break
    C.default分支可以省略
    D.JDK7以后支持字符串类型
    答案:B
    解析:break不是必须的,不加break会继续执行下一个case的代码,这叫"case穿透"。虽然有时候故意利用这个特性,但大多数情况下还是应该加break。其他选项都是正确的,特别是JDK7确实开始支持字符串switch了。

  4. 下面代码的输出是?

    int x = 2;
    switch (x) {
        case 1: System.out.print("一");
        case 2: System.out.print("二");
        case 3: System.out.print("三");
        default: System.out.print("未知");
    }
    

    A.二
    B.二三
    C.二三未知
    D.一
    答案:C
    解析:因为没有break语句,程序会从匹配的case 2开始,一直执行到switch结束。这就是典型的case穿透现象,输出"二三未知"。

  5. 下面哪种情况最适合使用switch语句? A.判断一个数是否大于100
    B.根据星期几执行不同操作
    C.检查用户年龄是否在18-60之间
    D.判断三个变量的大小关系
    答案:B
    解析:switch最适合处理固定值的多分支选择,比如星期、月份、菜单选项等离散值。A和C适合用if,D需要复杂的条件判断,用if更合适。

二、填空题

  1. 在if-else语句中,当if条件为______时,会执行else后面的代码块。 答案:false
    解析:else就像是if条件的"备胎",只有当if条件不成立时才会执行。if条件必须是一个布尔表达式,结果是true或false。
  2. switch语句中,______关键字用于处理所有未被case匹配的情况。 答案:default
    解析:default相当于if-else里的else,是可选的。当所有case都不匹配时,就执行default分支的代码。
  3. 下面代码的输出是______。
    int a = 10, b = 20;
    if (a > b) {
        System.out.print("A");
    } else if (a < b) {
        System.out.print("B");
    } else {
        System.out.print("C");
    }
    
    答案:B
    解析:10不大于20,所以跳过第一个if;10小于20,满足第二个条件,输出B。虽然简单,但考察了对if-else执行流程的理解。
  4. 要防止switch语句中的case穿透,应该在每个case分支末尾加上______语句。 答案:break
    解析:break就像开关,执行到这里就会跳出整个switch块。不加break的话,程序会继续执行下一个case的代码,不管条件是否匹配。
  5. 在Java 7之前,switch语句不支持______类型的数据。 答案:String(字符串)
    解析:早期switch只支持byte、short、char、int等基本类型,JDK7开始才支持字符串。枚举类型也支持,但浮点数到现在也不行。

三、代码分析题

分析下面这段成绩评级程序的输出结果,并解释每个判断条件的执行过程:

public class GradeEvaluator {
    public static void main(String[] args) {
        int score = 88;
        char grade;
        
        if (score >= 90) {
            grade = 'A';
        } else if (score >= 80) {
            grade = 'B';
        } else if (score >= 70) {
            grade = 'C';
        } else if (score >= 60) {
            grade = 'D';
        } else {
            grade = 'E';
        }
        
        switch (grade) {
            case 'A':
                System.out.println("优秀");
                break;
            case 'B':
                System.out.println("良好");
                break;
            case 'C':
                System.out.println("中等");
                break;
            case 'D':
                System.out.println("及格");
                break;
            default:
                System.out.println("不及格");
        }
    }
}

答案及解析

  • 首先定义score为88分,进入if-else判断链:
    • 第一个条件score >= 90不成立(88<90)
    • 第二个条件score >= 80成立(88>80),所以grade被赋值为'B'
    • 后面的条件不再检查,直接跳过
  • 接着根据grade='B'进入switch语句:
    • 匹配到case 'B',执行System.out.println("良好")
    • 遇到break立即跳出switch
  • 最终输出结果是:良好

执行过程重点

  • if-else if是从上往下顺序判断的
  • 只要有一个条件满足,后面的条件就不再检查
  • switch语句用grade的值直接跳转到对应case
  • 每个case后面的break防止了穿透到下一个case

注意事项

  • 如果把if条件的顺序反过来写(比如先判断>=60),就会出错
  • switch的case值必须是常量,不能是变量或范围
  • 这个例子展示了if和switch的典型配合用法

实操试题

一、基础编程题

  1. 年龄分段判断
    编写程序,根据输入的年龄输出所属年龄段:

    • 儿童(0-12岁)
    • 青少年(13-17岁)
    • 成人(18-59岁)
    • 老年(60岁及以上)

    要求使用if-else if-else结构实现。

    参考解答

    # 源文件保存为“AgeGroup.java”
    import java.util.Scanner;
    
    public class AgeGroup {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            System.out.print("请输入年龄:");
            int age = sc.nextInt();
            
            if(age >= 0 && age <= 12) {
                System.out.println("儿童");
            } else if(age >= 13 && age <= 17) {
                System.out.println("青少年");
            } else if(age >= 18 && age <= 59) {
                System.out.println("成人");
            } else if(age >= 60) {
                System.out.println("老年");
            } else {
                System.out.println("年龄不能为负数!");
            }
        }
    }
    

    调试要点

    • 测试边界值:12、13、17、18、59、60这些关键点
    • 输入负数时要给出错误提示
    • 条件判断要用逻辑运算符连接
    • 注意else的位置,它捕获所有未满足的条件
  2. 简易计算器
    用switch结构实现加减乘除四则运算,用户输入两个数和运算符,程序输出计算结果。 参考解答

    # 源文件保存为“SimpleCalculator.java”
    import java.util.Scanner;
    
    public class SimpleCalculator {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            System.out.print("请输入第一个数:");
            double num1 = sc.nextDouble();
            System.out.print("请输入运算符(+ - * /):");
            char operator = sc.next().charAt(0);
            System.out.print("请输入第二个数:");
            double num2 = sc.nextDouble();
            
            switch(operator) {
                case '+':
                    System.out.println("结果:" + (num1 + num2));
                    break;
                case '-':
                    System.out.println("结果:" + (num1 - num2));
                    break;
                case '*':
                    System.out.println("结果:" + (num1 * num2));
                    break;
                case '/':
                    if(num2 != 0) {
                        System.out.println("结果:" + (num1 / num2));
                    } else {
                        System.out.println("除数不能为零!");
                    }
                    break;
                default:
                    System.out.println("不支持的运算符");
            }
        }
    }
    

    易错点

    • 除法要检查除数是否为零
    • char类型输入用charAt(0)获取第一个字符
    • 每个case后面要加break防止穿透
    • default处理非法运算符输入

二、综合应用题

学生成绩转换
编写程序将百分制成绩转换为等级制:

  • 90-100分:优秀
  • 80-89分:良好
  • 70-79分:中等
  • 60-69分:及格
  • 0-59分:不及格

要求:

  • 用if-else和switch两种方式分别实现
  • 检查输入是否在0-100范围内
  • 对非法输入给出提示

参考解答

# 源文件保存为“GradeConverter.java”
import java.util.Scanner;

public class GradeConverter {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入成绩(0-100):");
        int score = sc.nextInt();
        
        // if-else实现
        if(score < 0 || score > 100) {
            System.out.println("成绩必须在0-100之间!");
        } else {
            String grade;
            if(score >= 90) {
                grade = "优秀";
            } else if(score >= 80) {
                grade = "良好";
            } else if(score >= 70) {
                grade = "中等";
            } else if(score >= 60) {
                grade = "及格";
            } else {
                grade = "不及格";
            }
            System.out.println("if-else版:" + grade);
            
            // switch实现
            switch(score / 10) {
                case 10:
                case 9:
                    grade = "优秀";
                    break;
                case 8:
                    grade = "良好";
                    break;
                case 7:
                    grade = "中等";
                    break;
                case 6:
                    grade = "及格";
                    break;
                default:
                    grade = "不及格";
            }
            System.out.println("switch版:" + grade);
        }
    }
}

关键技巧

  • 用score/10将百分制转换为switch可处理的离散值
  • case 10和case 9共用同一段代码处理90-100分
  • 先统一检查输入合法性,避免重复代码
  • 两种实现结果应该一致,可以互相验证

三、调试改错题

下面这个"季节判断"程序有3处错误,请找出并修正:

import java.util.Scanner;

public class SeasonChecker {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入月份(1-12):")
        int month = sc.nextInt();
        
        if (month >= 3 || month <= 5) {
            System.out.println("春季");
        } else if (month >=6 month <= 8) {
            System.out.println("夏季");
        } else if (month >=9 || month <=11) {
            System.out.println("秋季");
        } else (month ==12 || month ==1 || month ==2) {
            System.out.println("冬季");
        }
    }
}

错误点及修正

  • System.out.print() 语句缺少分号
    解析:Java语句必须以分号结尾,这是语法硬性要求
  • 第一个if条件错误使用了逻辑或(||)
    修正if (month >= 3 && month <= 5)
    解析:判断范围应该用与(&&)运算符,用或(||)会导致所有月份都满足条件
  • else后面多了条件判断
    修正else if (month ==12 || month ==1 || month ==2)
    解析:else不能带条件,要么改成else if,要么直接else

完整修正版

import java.util.Scanner;

public class SeasonChecker {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入月份(1-12):");
        int month = sc.nextInt();
        
        if (month >= 3 && month <= 5) {
            System.out.println("春季");
        } else if (month >=6 && month <= 8) {
            System.out.println("夏季");
        } else if (month >=9 && month <=11) {
            System.out.println("秋季");
        } else if (month ==12 || month ==1 || month ==2) {
            System.out.println("冬季");
        }
    }
}

测试建议

  • 测试边界月份:3月、5月、6月、8月、9月、11月、12月、1月、2月
  • 测试非法输入:0、13等超出范围的数字
  • 可以添加输入验证,确保月份在1-12之间