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不是同一个对象,但均是一个枚举类里的属性。

枚举类型是引用类型
枚举不属于原始数据类型,它的每个具体值都引用一个特定的对象。相同的值则引用同一个对象。
可以使用“==”和equals()方法直接比对枚举变量的值,换句话说,对于枚举类型的变量,“==”和equals()方法执行的结果是等价的。

对于枚举类的属性成员,可以通过value依次输出属性成员。

二、原码,反码,补码:

原码:二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
反码:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
例如
{原码10010= 反码11101 (10010,1为符号码,故为负)
(11101) 二进制= -2 十进制}
补码:正数的补码与其原码相同;负数的补码是在其反码的末位加1。
JAVA采用的是 补码

对于原码, 反码, 补码而言, 需要注意以下几点:

(1).Java中没有无符号数, 换言之, Java中的数都是有符号的;

(2).二进制的最高位是符号位, 0表示正数, 1表示负数;

(3).正数的原码, 反码, 补码都一样;

(4).负数的反码=它的原码符号位不变, 其他位取反;

(5).负数的补码=它的反码+1;

(6).0的反码, 补码都是0;

(7).在计算机运算的时候, 都是以补码的方式来运算的.

public class testBuma {
public static void main(String[] args) {
System.out.println(~2);//取反操作,二进制码原码转化为反码,转为补码,最后1变0,0变1
System.out.println(2&3);//按位与,转化为二进制两个二进制数依次比较,当两位同时为1时,才为1

System.out.println(2|3);//按位或,转化为二进制至少一个1就为1
System.out.println(~-5);
System.out.println(13&7);
System.out.println(5|4);
System.out.println(-3^3);异或操作,一个为1,另一个为0就为1

System.out.println(1>>2);//算术右移,低位溢出,符号位不变,并用符号位补高位
System.out.println(-1>>2);
System.out.println(1<<2);//左移,符号为不变,低位补0
System.out.println(-1<<2);
System.out.println(3>>>2);

}

}

 

三、变量的作用域:

public class test33 {
private static int value=1;
public static void main(String[] args) {
int value=2;
System.out.println(value);
}
}

输出:2

Java变量遵循“同名变量的屏蔽原则”

Java中的类型转换:

1.自动类型转换是安全的

2.强制类型转换时,可能会引起信息的损失

 

实线代表无精度损失,虚线表示有精度损失。

自动类型转化是指容量小的可以自动转化为容量大的(即表数范围)

自动例子:

public static void main(String[] args) {
int a=324;
long b=a;//int类型可以转化为long类型
double c=a;//int类型可以转化double类型
//a=b; //不能转化
float d=3222L;//long类型可以转化为float类型
}

强制例子:

public static void main(String[] args) {
double x=3.14;
int t=(int)x;//会有精度损失,直接取整数部分
char c='a';//a的ASCLL码为97
int d=1+c;
System.out.println(t);
System.out.println(d);
}

结果:

 

四、测试double类型的值运算:

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类型的数值进行计算, 其结果是不精确的。

解决方法——使用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));
}
}

 

 

五、 以下的代码结果是什么呢?:

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);其中 + 为连接运算符
  System.out.println(X+Y+"=X+Y");其中 + 为加法运算符,为两个数相加

若加上括号System.out.println("X+Y="+(X+Y)); 可进行加法运算

 六、二柱子出题:

/**
*
*
* 刘子煜20183542
*/
import java.util.Random;
import java.util.Scanner;
public class erzhu {
public static int[] a=new int[100000];
public static int[] b=new int[100000];
public static int[] c=new int[100000];
public static void main(String[] args) {
int x=0;
int y=0;
int z=1;
int i=0;
int j=0;
int q=0;
int num=1;
int n;
int m;
//int[] a=new int[1000000];
//int[] b=new int[1000000];
//int[] c=new int[1000000];
Scanner scanner =new Scanner(System.in);
System.out.println("请输入要出的题目数:");n=scanner.nextInt();
System.out.println("请输入每行的题目数:");m=scanner.nextInt();

for(i=0;;i++)
{
if(num==n+1) break;
else {
z=(int)(Math.random()*5);
x=(int)(Math.random()*100);
y=(int)(Math.random()*100);
//检查重复
for(j=0;j<num;j++)
{
if(x==a[j]&&y==b[j]&&z==c[j])
{
y=(int)(Math.random()*100);
}
}
a[num-1]=x;b[num-1]=y;c[num-1]=z;
if((num-1)%m==0)
{System.out.print("\n"+"\t");}
switch(z) {
case 1:
if(x+y<100)
{
System.out.print(num+"."+x+"+"+y+" "+"\t");num++;
}
else break;
break;
case 2:
if(x>=y)
{
System.out.print(num+"."+x+"-"+y+" "+"\t");num++;}
else {System.out.print(num+"."+y+"-"+x+" "+"\t");num++;}
break;
case 3:
if(x*y>100) break;
else {System.out.print(num+"."+x+"*"+y+" "+"\t");num++;}
break;
case 4:
if(x>y&&y!=0)
{
if(x%y!=0)break;
else System.out.print(num+"."+x+"/"+y+" "+"\t");num++;
}
else if(y>x&&x!=0)
{
if(y%x!=0) break;
else System.out.print(num+"."+y+"/"+x+" "+"\t");num++;
}
break;
default:
break;
}}
}
}}

结果:

 

 利用基本的switch选择四则运算,并把算术的细节完善,避免重复则定义数组存储遍历,产生100以内的随机数,由此达到出题的功能。

posted @ 2019-09-20 09:23  ziyuliu  阅读(308)  评论(0编辑  收藏  举报