JAVA语法基础 动手动脑及课后作业

动手动脑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};

运行结果:false  false  true  SMALL  MEDIUM  LARGE

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

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

动手动脑2:看着这个图,再查查Java中每个数据类型所占的位数,和表示数值的范围,你能得出什么结论?

char 8位二进制数范围是-2的7次方到2的7次方-1,byte 8位带符号整数-128到127之间的任意整数,short 16位无符号整数-32768到32767之间的任意整数,int 32位带符号整数-2的31次方到2的31次方-1之间的任意整数,long 64位带符号整数-2的63次方到2的63次方-1之间的任意整数,float 32位单精度浮点数,double 64位双精度浮点数。

结论是:Java会自动完成从低级类型向高级类型转换,即取值范围相对较小的数据类型转换成取值范围相对较大的数据类型。

动手实验:请运行以下代码(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类型的数值进行运算得不到“数学上精确”的结果?

请通过互联网查找资料,或者是阅读相关计算机教材,解决这个问题。

提示:这个问题,与浮点数在计算机内部的表示方法有关系。可以使用这个知识在搜索引擎中查找相关资料

事实上浮点运算很少是精确的,只要是超过精度能表示的范围就会产生误差。往往产生误差不是 因为数的大小,而是因为数的精度。因此,产生的结果接近但不等于想要的结果。尤其在使用 float 和 double 作精确运 算的时候要特别小心。可以考虑采用一些替代方案来实现。如通过使用 long 类型来转换。我们知道在计算机中浮点数的表示方法是由一个整数(即尾数)乘以一个基数(计算机中一般为2)的整次幂得到。(类似于科学计数法,科学记数法基数为10)float的内存结构为:符号位表示正负,1位 指数位,8位 尾数位,32位(符号位1表示负,0表示正)指数是以2为底的,范围是 -128 到 127,如果超过了127,则从-128开始计。 即:127+1=-128尾数都省去了第1位的1,所以在还原时要先在第一位加上1。它可能包含整数和纯小数两部分,也可能只包含其中一部分,视数字大小而定。对于带有整数部分的浮点数,其整数的表示法有两种,当整数大于十进制的16777215时使用的是科学计数法,如果小于或等于则直接采用一般的二进制表示法。科学计数法和小数的表示法是一样的。小数部分则是直接使用科学计数法,形式是X * ( 2 ^ n )。这样就导致浮点类型在计算机的存贮中无法精确表示。

动手动脑3:

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

int X=100;

int Y=200;

System.out.println("X+Y="+X+Y);

System.out.println(X+Y+"=X+Y");

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

输出结果是:X+Y=100200

300=X+Y

原因:System.out.println("X+Y="+X+Y)中的“+”为连接运算符,

System.out.println(X+Y+"=X+Y")中的“+”为加法运算符,即为两个数相加。

课后练习:阅读相应教材,或者使用互联网搜索引擎,弄清楚反码、补码跟原码这几个概念,然后编写示例程序,对正数、负数进行各种位操作,观察输出结果,与手工计算的结果进行比对,看看Java中的数是采用上述哪种码表示的。

在计算机内,定点数有3种表示法:原码、反码和补码。反码是数值存储的一种,但是由于补码更能有效表现数字在计算机中的形式,所以多数计算机一般都不采用反码表示数。

所谓原码就是二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。

反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。

原码10010= 反码11101 (10010,1为符号码,故为负)

(11101) 二进制= -2 十进制

补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。

课后作业:编写一个程序,用户输入两个数,求出其加减乘除,并用消息框显示计算结果。

import javax.swing.JOptionPane;

public class Yusuan {

public static void main(String[] args) {

// TODO 自动生成的方法存根

String firstNumber,secondNumber;

int number1,number2,sum,minus,multiply,divide;

// read in first number from user as a string

firstNumber =JOptionPane.showInputDialog( "Enter first integer" );

// read in second number from user as a string

secondNumber =JOptionPane.showInputDialog( "Enter second integer" );

// convert numbers from type String to type int

number1 = Integer.parseInt( firstNumber );

number2 = Integer.parseInt( secondNumber );

// yunsuan the numbers

sum = number1 + number2;

minus=number1 - number2;

multiply=number1*number2;

divide=number1/number2;

// display the results

JOptionPane.showMessageDialog(null,"和为: "+sum+" 差为:"+minus+" 积为:"+multiply+" 商为:"+divide,"Results",JOptionPane.PLAIN_MESSAGE);//在窗口上显示结果

System.exit(0);//释放空间

}

}

输出结果:

时间: 2024-08-01 22:47:28

JAVA语法基础 动手动脑及课后作业的相关文章

Java语法基础动手动脑实践

输出结果为: 0.05+0.01=0.0600000000000000051.0-0.42=0.58000000000000014.015*100401.49999999999994123.3/100=1.2329999999999999 输出结果为 2

异常处理---动手动脑及课后作业

动手动脑1:请阅读并运行AboutException.java示例,然后通过后面的几页PPT了解Java中实现异常处理的基础知识. 源码: import javax.swing.*; class AboutException { public static void main(String[] a) { int i=1, j=0, k; k=i/j; try { k = i/j; // Causes division-by-zero exception //throw new Exception

第七讲 数组动手动脑和课后作业

[动手动脑1] 数据作为方法参数示例代码 int[] arr= new int[ 24 ]; -- modifyArray( arr ); 阅读并运行示例PassArray.java,观察并分析程序输出的结果,小结,然后与下页幻灯片所讲的内容进行对照. // PassArray.java // Passing arrays and individual array elements to methods public class PassArray { public static void ma

第四讲动手动脑集课后作业

一.动手动脑 1.编写一个方法,使用以上算法生成指定数目(比如1000个)的随机整数. 源代码: //huzejie20161016//生成指定数目的随机数import java.util.Scanner;public class Suijishu { public static void main(String[] args) { System.out.print("请输入要输出多少个随机数:"); Scanner s = new Scanner(System.in); int n

动手动脑及课后作业02

1.SquareIntTest.java中不用static如何还能使用Square函数 解决方法: 2. 代码: import java.util.Scanner; public class Suiji { public static void main(String[] args) { System.out.print("请输入要输出的随机数个数:"); Scanner s = new Scanner(System.in); int num = s.nextInt(); //生成随机

03_方法(动手动脑和课后作业)

一. MethodOverload.java public class MethodOverload { public static void main(String[] args) { System.out.println("The square of integer 7 is " + square(7)); System.out.println("\nThe square of double 7.5 is " + square(7.5)); } public s

02-JAVA语法基础 作业(动手动脑和课后作业)

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());   /

JAVA动手动脑及课后作业

1.查看其输出结果.如何解释这样的输出结果?从中你能总结出什么? 运行结果 true true false 原因 1)在Java中,内容相同的字串常量("Hello")只保存一份以节约内存,所以s0,s1,s2实际上引用的是同一个对象. 2)编译器在编译s2一句时,会去掉"+"号,直接把两个字串连接起来得一个字串("Hello").这种优化工作由Java编译器自动完成. 3)当直接使用new关键字创建字符串对象时,虽然值一致(都是"He

Java作业03 (动手动脑和课后作业1.使用下面定义的类,以下代码输出结果是什么?)

1.使用下面定义的类,以下代码输出结果是什么? 输出结果: 请依据代码的输出结果,自行总结Java字段初始化的规律. Java初始化的地方有两个:初始化块和构造函数,其中初始化又分为实例初始化块和静态初始化块,实例初始化块没有关键字修饰,而静态初始化块由static修饰. 执行类成员定义时指定的默认值或类的初始化块,到底执行哪一个要看哪一个“排在前面” 执行类的构造函数:类的初始化块不接收任何的参数,而且只要一创建类的对象,它们就会被执行.因此,适合于封装那些“对象创建时必须执行的代码”. 2.