作业

带着疑问看故事

一家软件公司程序员二柱的小孩上了小学二年级,老师让家长每天出30道四则运算题目给小学生做。

import java.util.Random;
import java.util.Scanner;

public class yunsuan {
    enum Operation {
        PLUS, MINUS, MULTIPLY, DIVIDE
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        Random rand = new Random();
        for(int i=0; i<30; i++){
        int n = rand.nextInt(100);
        int k = rand.nextInt(100);
            Operation op = getRandomOperation(rand); // 随机选择运算类型
            switch (op) {
                case PLUS:
                    System.out.println(n + " + " + k + " =  ");
                    break;
                case MINUS:
                    System.out.println(n + " - " + k + " =  ");
                    break;
                case MULTIPLY:
                    // 为了防止结果过大,可以将操作数范围缩小
                    n = rand.nextInt(10);
                    k = rand.nextInt(10);
                    System.out.println(n + " * " + k + " =  ");
                    break;
                case DIVIDE:
                    // 确保不会除以0
                    do {
                        k = rand.nextInt(100) + 1; // 加1确保不为0
                    } while (k == 0);
                    // 同时确保结果为整数
                    n = n - n % k;
                    System.out.println(n + " / " + k + " =  ");
                    break;
            }
        }

    }
    private static Operation getRandomOperation(Random rand) {
        Operation[] operations = Operation.values();
        return operations[rand.nextInt(operations.length)];
    }
}

动手动脑

仔细阅读示例:EnumTest.iava,运行它,分析运行结果

你能得到什么结论?你掌握了枚举类型的基本用法了吗?

public class EnumTest {

    public static void main(String[] args) {
        Size s=Size.SMALL;
        Size t=Size.LARGE;
        //s和t引用同一个对象?
        System.out.println(s==t);  //false
        //是原始数据类型吗?
        System.out.println(s.getClass().isPrimitive());
        //从字符串中转换
        Size u=Size.valueOf("SMALL");
        System.out.println(s==u);  //true
        //列出它的所有值
        for(Size value:Size.values()){
            System.out.println(value);
        }
    }

}
enum Size{SMALL,MEDIUM,LARGE};

分析

1.Size s = Size.SMALL; 和 Size t = Size.LARGE; 定义了两个 Size 类型的枚举常量引用,分别指向枚举类型 Size 的不同实例。
2.System.out.println(s == t); 输出 false。因为 s 和 t 引用的是 Size 枚举中的不同实例(SMALL 和 LARGE),所以它们不是同一个对象。
3.System.out.println(s.getClass().isPrimitive()); 这行代码输出 false。枚举不是原始数据类型,它们是引用类型。
4.Size u = Size.valueOf("SMALL"); 这行代码通过字符串 “SMALL” 获取到 Size 枚举中对应的实例,并赋值给 u。
5.System.out.println(s == u); 输出 true。这是因为 valueOf 方法返回的是枚举类型中与字符串对应的常量实例。由于 s 和 u 都引用的是 Size.SMALL,它们是同一个对象。
6.for (Size value : Size.values()) { System.out.println(value); } 这行代码遍历枚举 Size 的所有值,并打印它们。

结论:

枚举类型是引用类型,不是原始数据类型。
每一个枚举常量在枚举类型中只有一个实例。
使用==操作符比较枚举示例,来检查它们是否引用同一个对象
使用valueof方法根据枚举常量的名称获取对应的枚举实例
使用values方法获取枚举类型中的所有枚举常量的数组

请运行以下代码(TestDouble.iava)

public class TestDouble {

    public static void main(String args[]) {
        System.out.println("0.05 + 0.01 = " + (0.05 + 0.01));
        System.out.println("1.0 - 0.42 = " + (1.0 - 0.42));
        System.out.println("4.015 * 100 = " + (4.015 * 100));
        System.out.println("123.3 / 100 = " + (123.3 / 100));
    }
}

输出结果


结果表明double类型的数值进行计算结果是不精确的

以下代码的输出结果是什么

int X=100:
int Y=200;
System.out.println("X+Y="+X+Y);System.out.println(X+Y+"=X+Y");

为什么会有这样的输出结果?

在第一行输出语句 System.out.println("X+Y="+X+Y); 中,字符串 "X+Y=" 被首先处理,然后 X 和 Y 的值(100 和 200)被转换为字符串并连接到 "X+Y=" 的后面。由于 + 操作符在这里是字符串连接操作符,所以结果是将 X 和 Y 的值作为字符串直接连接在 "X+Y=" 的后面,而不是进行数值加法。因此,输出是 "X+Y=" 后面跟着 X 的值 100 和 Y 的值 200,没有加号分隔。
在第二行输出语句 System.out.println(X+Y+"=X+Y"); 中,由于 X 和 Y 都是整数类型,所以 X+Y 首先进行数值加法操作,得到结果 300。然后,这个数值结果与字符串 ""=X+Y" 进行连接,生成最终的字符串 "300=X+Y"。

结论:

当 + 操作符用于字符串和非字符串类型时,非字符串类型会被转换为字符串,并执行字符串连接操作。

posted @ 2024-09-27 10:58  haoyinuo  阅读(24)  评论(0)    收藏  举报