课后作业
一、编写程序,消息框显示计算结果
设计思想:导入Scanner包,使用JOptionPane类来实现消息框的输入和结果的显示。
程序代码:
package com;
import java.util.Scanner;
//导入Scanner包
import javax.swing.JOptionPane;
public class Manner {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
//定义Scanner类
int a,b;
String s1,s2;
s1 =JOptionPane.showInputDialog( "Enter first integer" );
s2=JOptionPane.showInputDialog( "Enter second integer" );
//输入两个整数
a= Integer.parseInt( s1 );
b= Integer.parseInt( s2 );
//将String类型两个数据的转换成整型的两个数据进行运算 JOptionPane.showMessageDialog(
null,"两个整数的和为:"+(a+b));
JOptionPane.showMessageDialog(
null,"两个整数的差为:"+(a-b));
JOptionPane.showMessageDialog(
null,"两个整数的积为:"+(a*b));
JOptionPane.showMessageDialog(
null,"两个整数的商为:"+(a/b));
in.close();
}
}
结果截图:
二、动手动脑
一、(1)仔细阅读示例: EnumTest.java,运行它,分析运行结果?
答:运行结果为:true SMALL MEDIUM LARGE,在判断了是否引用了同一个对象之后,利用枚举的方式输出数组的数据。
(2)你能得到什么结论?你掌握了枚举类型的基本用法了吗?
答:枚举类型输入的是字符串类型,输出的是字符串类型,它不属于原始数据类型,是引用类型,所以可以使用“==”和equals()方法比对变量的值。
二、数值的二进制表示
1、原码:表示方式是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值。
2、反码:表示方式是正数的反码是其本身;负数的反码是在其原码的基础上,符号位不变,其余各个位取反。所以如果一个反码表示的是负数,人脑无法直观的看出来它的数值,通常要将其转换成原码再计算。
3、补码:表示方式是正数的补码就是其本身;负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+1(即在反码的基础上+1)。对于负数,补码的表示方式也是人脑无法直观看出其数值的,通常也需要转换成原码再计算其数值。
4、Java中的数是采用补码表示的。
三、
看着这个图,再查查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),你看到了什么样的输出,意外吗?
答:0.05 + 0.01 = 0.060000000000000005
1.0 - 0.42 = 0.5800000000000001
4.015 * 100 = 401.49999999999994
123.3 / 100 = 1.2329999999999999
结果都是不精确的,不是数学范围内的精确结果,因为double型是浮点数类型,存在精度问题。
五、为什么double类型的数值进行运算得不到“数学上精确”的结果?
答:double类型是双精度浮点数,由符号位、阶码、尾数三部分组成,符号位决定浮点数的正负,指数和尾数均从浮点数的二进制科学计数形式中获取,根据浮点数的存储标准IEEE制定,double类型指数的起始数为1023,在此基础上加指数,得到的就是内存中指数的表示形式,尾数则直接填入,空间多余则以0补齐,如果空间不够则0舍1入。因为用二进制无法精确表示,所以double不是很精确。计算机中是用有限的连续字节保存浮点数的,很多小数根本无法在二进制计算机中精确表示,由于浮点数尾数域的位数是有限的,为此,浮点数的处理办法是持续该过程直到由此得到的尾数足以填满尾数域,之后对多余的位进行舍入。换句话说,除了之前讲到的精度问题外,十进制到二进制的变换也并不能保证总是精确的,而只能是近似值。事实上,只有很少一部分十进制小数具有精确的二进制浮点数表达。再加上浮点数运算过程中的误差累积,结果就会出现浮点运算的不准确问题。
六、(1)以下代码的输出结果是什么?
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
(2)为什么会有这样的输出结果?
答:因为String类型的变量加上其他任何基本类型的变量都将被当做字符串处理。而输出的第一条语句里面X+Y没有用括号括起来,就成了字符串,加号的作用就成了拼接字符串,所以输出的是100200;而输出的第二条语句X+Y放在最前面,不需要括号,所以加号是求和的作用。