20190918Java课堂记录
1. EnumTest.java
public class EnumTest { public static void main(String[] args) { Size s=Size.SMALL; Size t=Size.LARGE; //s和t引用同一个对象? System.out.println(s==t); // //是原始数据类型吗? 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};
s 和 t 的值不同,s == t 的结果为 false
Size 不是基本类型,返回 false
枚举类型值相等即为一个变量
values() 为返回所有值
总结:枚举enum是一种特殊的类(还是类),使用枚举可以很方便的定义常量
一个常用的场合就是switch语句中,使用枚举来进行判断
注:因为是常量,所以一般都是全大写
使用枚举的好处就是可以把变量的范围限定在几个以内,在使用 switch 的时候就不用担心有其他值的情况
2. TestDouble.java
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)); } }
运行结果:
0.05 + 0.01 = 0.060000000000000005
1.0 - 0.42 = 0.5800000000000001
4.015 * 100 = 401.49999999999994
123.3 / 100 = 1.2329999999999999
结论:使用double类型的数值进行计算, 其结果是不精确的。
解决方法——使用BigDecimal类
import java.math.BigDecimal; public class TestBigDecimal { public static void main(String[] args) { BigDecimal f1 = new BigDecimal("0.05"); BigDecimal f2 = BigDecimal.valueOf(0.01); BigDecimal f3 = new BigDecimal(0.05); System.out.println("下面使用String作为BigDecimal构造器参数的计算结果:"); System.out.println("0.05 + 0.01 = " + f1.add(f2)); System.out.println("0.05 - 0.01 = " + f1.subtract(f2)); System.out.println("0.05 * 0.01 = " + f1.multiply(f2)); System.out.println("0.05 / 0.01 = " + f1.divide(f2)); System.out.println("下面使用double作为BigDecimal构造器参数的计算结果:"); System.out.println("0.05 + 0.01 = " + f3.add(f2)); System.out.println("0.05 - 0.01 = " + f3.subtract(f2)); System.out.println("0.05 * 0.01 = " + f3.multiply(f2)); System.out.println("0.05 / 0.01 = " + f3.divide(f2)); } }
运行结果:
下面使用String作为BigDecimal构造器参数的计算结果:
0.05 + 0.01 = 0.06
0.05 - 0.01 = 0.04
0.05 * 0.01 = 0.0005
0.05 / 0.01 = 5
下面使用double作为BigDecimal构造器参数的计算结果:
0.05 + 0.01 = 0.06000000000000000277555756156289135105907917022705078125
0.05 - 0.01 = 0.04000000000000000277555756156289135105907917022705078125
0.05 * 0.01 = 0.0005000000000000000277555756156289135105907917022705078125
0.05 / 0.01 = 5.000000000000000277555756156289135105907917022705078125
3.
int X=100; int Y=200; System.out.println("X+Y="+X+Y); System.out.println(X+Y+"=X+Y");
使用运算符 + 连接字面量“The sum is” 和计算结果 sum将String 和其它数据类型相加,结果是一个新的String
4.
自动生成 n 道小学四则运算题目的 “软件”
//信1805-2孙超凡20183558 import java.util.Scanner; public class Mathtest{ public static void main(String[] args) { int[] chucun1= new int [1001]; int[] chucun2= new int [1001]; int[] chucun3= new int [1001]; int[] chucun4= new int [1001]; int[] chucun5= new int [1001]; int[] chucun6= new int [1001]; int[] chucun7= new int [1001]; int[] chucun8= new int [1001]; int max=100,min=1; int ran1 = (int) (Math.random()*(max-min)+min); int ran2=(int) (Math.random()*(max-min)+min); int zhuangtai=0; char fuhao[]={'+','+','-','*','/'}; max=4;min=1; int ran3=(int) (Math.random()*(max-min)+min); int shuliang; System.out.println("enter the number1:"); Scanner scan=new Scanner(System.in); shuliang=scan.nextInt(); System.out.println("enter the number2:"); int hang=scan.nextInt(); int p=0; for(int i=1;i<shuliang+1;++i) { ++p; max=100;min=1; ran1 = (int) (Math.random()*(max-min)+min); ran2=(int) (Math.random()*(max-min)+min); max=5;min=1; ran3=(int) (Math.random()*(max-min)+min); switch(ran3){ case 1:{max=100;min=1; chucun5[i]=ran1; chucun6[i]=ran2; for(int m=0;m<i;++m){ if(ran1==chucun5[m]||ran2==chucun6[m]){ zhuangtai=1; break;} zhuangtai=0; } while(zhuangtai==1){ ran1 = (int) (Math.random()*(max-min)+min); ran2=(int) (Math.random()*(max-min)+min); chucun5[i]=ran1; chucun6[i]=ran2; for(int m=0;m<i;++m){ if(ran1==chucun5[m]||ran2==chucun6[m]){ zhuangtai=1; break;} zhuangtai=0;} } System.out.println(i+","+ran1+" + "+ran2+" ="); break; } case 2:{ max=100;min=1; chucun1[i]=ran1; chucun2[i]=ran2; for(int m=0;m<i;++m){ if(ran1==chucun1[m]||ran2==chucun2[m]){ zhuangtai=1; break;} zhuangtai=0; } while(zhuangtai==1){ ran1 = (int) (Math.random()*(max-min)+min); ran2=(int) (Math.random()*(max-min)+min); chucun1[i]=ran1; chucun2[i]=ran2; for(int m=0;m<i;++m){ if(ran1==chucun1[m]||ran2==chucun2[m]){ zhuangtai=1; break;} zhuangtai=0;} } if(ran1>ran2)System.out.println(i+","+ran1+" - "+ran2+" ="); else System.out.println(i+","+ran2+" - "+ran1+" ="); break; } case 3: { max=100;min=1; ran1 = (int) (Math.random()*(max-min)+min); ran2=(int) (Math.random()*(max-min)+min); chucun3[i]=ran1; chucun4[i]=ran2; while((ran1*ran2)>=100){ ran1 = (int) (Math.random()*(max-min)+min); ran2=(int) (Math.random()*(max-min)+min); chucun3[i]=ran1; chucun4[i]=ran2; } for(int m=0;m<i;++m){ if(ran1==chucun3[m]||ran2==chucun4[m]){ zhuangtai=1; break;} zhuangtai=0; } while(zhuangtai==1&&(ran1*ran2)>=100){ ran1 = (int) (Math.random()*(max-min)+min); ran2=(int) (Math.random()*(max-min)+min); chucun3[i]=ran1; chucun4[i]=ran2; for(int m=0;m<i;++m){ if(ran1==chucun3[m]||ran2==chucun4[m]){ zhuangtai=1; break;} zhuangtai=0;} } System.out.println(i+","+ran1+" * "+ran2+" ="); max=100;min=1; ran1 = (int) (Math.random()*(max-min)+min); ran2=(int) (Math.random()*(max-min)+min); break; } case 4:{ max=100; if(ran1>ran2){ float ran=ran1/ran2; while(ran1%ran2!=0){ ran1 = (int) (Math.random()*(max-min)+min); ran2=(int) (Math.random()*(max-min)+min); } chucun7[i]=ran1; chucun8[i]=ran2; for(int m=0;m<i;++m){ if(ran1==chucun7[m]||ran2==chucun8[m]){ zhuangtai=1; break; } zhuangtai=0; } while(zhuangtai==1){ ran1 = (int) (Math.random()*(max-min)+min); ran2= (int) (Math.random()*(max-min)+min); ran=ran1/ran2; while(ran1%ran2!=0){ ran1 = (int) (Math.random()*(max-min)+min); ran2=(int) (Math.random()*(max-min)+min); } chucun7[i]=ran1; chucun8[i]=ran2; for(int m=0;m<i;++m){ if(ran1==chucun7[m]||ran2==chucun8[m]){ zhuangtai=1; break;} zhuangtai=0;} // System.out.println(zhuangtai+"!!"); } System.out.println(i+","+ran1+" / "+ran2+" ="); break; } else { int t=ran2; ran2=ran1; ran1=t; float ran=ran1/ran2; while(ran1%ran2!=0){ ran1 = (int) (Math.random()*(max-min)+min); ran2=(int) (Math.random()*(max-min)+min); } chucun7[i]=ran1; chucun8[i]=ran2; for(int m=0;m<i;++m){ if(ran1==chucun7[m]||ran2==chucun8[m]){ zhuangtai=1; break;} zhuangtai=0; } while(zhuangtai==1){ ran1 = (int) (Math.random()*(max-min)+min); ran2=(int) (Math.random()*(max-min)+min); ran=ran1/ran2; while(ran1%ran2!=0){ ran1 = (int) (Math.random()*(max-min)+min); ran2=(int) (Math.random()*(max-min)+min); } chucun7[i]=ran1; chucun8[i]=ran2; for(int m=0;m<i;++m){ if(ran1==chucun7[m]||ran2==chucun8[m]){ zhuangtai=1; break; } zhuangtai=0; } // System.out.println(zhuangtai+"??"); } System.out.println(i+","+ran1+" / "+ran2+" ="); break; } } } if(p==hang){ System.out.println("\n"); p=0; } } } }//定制,不能重复
运行结果
实现功能:
自定义题目总数和组数
算式不重复
乘法结果 < 100
除法均为整除
5. 计算机储存数据最终都是转换成二进制数字进行储存,而计算机进行简单的运算时,也是通过二进制下的数字进行计算的。
比如4Bytes的int类型变量储存了十进制的11,那么在内存中它的存在形式是00000000 00000000 00000000 00001011,那么如果它储存的是
十进制的-11,那么它的存在形式是10000000 00000000 00000000 00001011,这个数就叫二进制原码。对于一个正数,其二进制反码和原码
相同;对于一个负数,其二进制反码即其二进制原码除了符号位各位取反后的结果。补码的定义和反码很像,对于一个正数,它的二进制补
码是它的二进制原码;对于一个负数,它的二进制补码是它的二进制反码再加上1。
如图所示,Java是用采用补码表示的