《Java技术》第一次作业
(一)学习总结
1.在java中通过Scanner类完成控制台的输入,查阅JDK帮助文档,Scanner类实现基本数据输入的方法是什么?不能只用文字描述,一定要写代码,通过具体实例加以说明。
Scanner类实现基本数据输入方法:
<1>添加java.util.Sanner到程序中
<2>用Sanner类定义一个对象,通过此对象的属性来实现对数据的输入,如:Sannner input = new Sanner(System in);(System in,是指从键盘上输入)
实例:
import java.util.Scanner;
public class Test {
public static void main(String args[]) {
String gchar1 = new String();
String gchar2 = new String();
Scanner input = new Scanner(System.in);
System.out.println("nextLine方式接收:");
gchar1=input.nextLine();
System.out.println("next方式接收:");
gchar2=input.next();
System.out.println(gchar1+"\n"+gchar2);
}
}
运行结果:
2.Random类和Math类的random()方法都能产生随机数,这两种方式有什么区别,各有什么特点呢?查阅JDK帮助文档,并举例加以说明。
区别:
<1>Random是类(java.util.Random),里面有很多方法,而random()是Math类中的一个方法
<2>Math类的random()方法产生的随机数是[0,1.0)之间的小数
Math类的random()方法的特点:
<1>Random类可以直接利用其方法生成随机数,并分为指定种子数字和默认构造方法两种;
<2>Math.random()是令系统随机选取大于等于 0.0 且小于 1.0 的伪随机 double 值,若要用此方法产生0~100的随机数需要对random()方法产生的随机数进行放大倍数再进行改变(注意:此时的随机数仍是double的,如要int类型还需要强制转换)
<3>Random类中各方法生成的随机数字都是均匀分布的,也就是说区间内部的数字生成的几率是均等的
实例:
import java.util.Scanner;
import java.util.Random;
public class Test {
public static void main(String args[]) {
Random rand = new Random();
int temp1,temp2,temp3;
temp1=rand.nextInt();
temp2=rand.nextInt(101);//0~100间 的随机数
temp3=(int)(Math.random()*100+1);
System.out.println("使用Random类随机产生一个整型的数:"+temp1);
System.out.println("使用Random类产生一个[0,100]的随机数:"+temp2);
System.out.println("使用Math类的random()方法产生一个[0,100]之间的随机整数"+temp3);
}
}
运行结果:
3.运行下列程序,结果是什么?查阅资料,分析为什么。
public class Test {
public static void main(String args[]) {
double a = 0.1;
double b = 0.1;
double c = 0.1;
if((a + b + c) == 0.3){
System.out.println("等于0.3");
}else {
System.out.println("不等于0.3");
}
}
}
运行结果:不等于0.3
原因:在运算时精度损失,从而产生了极小的误差,于是出现错误
改进:
import java.math.BigDecimal;
import java.math.MathContext;
public class Test {
public static void main(String args[]) {
BigDecimal ia = new BigDecimal("0.1");
BigDecimal ib = new BigDecimal("0.1");
BigDecimal ic = new BigDecimal("0.1");
if((ic.add(ia.add(ib))).round(new MathContext(1)).equals(new BigDecimal("0.3"))){
System.out.println("等于0.3");
}else {
System.out.println("不等于0.3");
}
}
}
为了处理精度损失的问题,可以使用java.math.BigDecimal类,查阅JDK帮助文档或教材p378,对上述程序进行修改。
(二)实验总结
实验内容:
1.看商品猜价格
程序设计思路:
<1>先设置一个循环来控制用户是否继续游戏,初始判断定义为yes
<2>利用Random类生成一个0~100的随机数
<3>让用户输入价格
<4>共猜五次猜对了给出得分,猜错了继续,满五次后给出正确答案,得分为0分
问题<1>:内层控制用户猜的次数的循环令输入出现了6次
原因:忽略了内层循环外的第一条输入语句
解决方法:令循环变量初始值=1
2.万年历
程序设计思路:
<1>判断是否为闰年
<2>计算某个月有多少天(闰年二月29天,平年28天)
<3>计算总天数分为当用户指定的年份大于1900年时和年份小于1900年时两种情况,令循环变量等于较小的年份,判断当前年份是否等于较大的年份,不等于则判断循环变量是平年还是闰年,平年+365,闰年+366,并且循环变量++,计算完年的总天数后计算用户指定年月的总天数,同理于计算年的天数,最后得到总天数。
<4>在打印日历的方法中调用总天数的方法赋值给一个整型变量如 sum,sum%7+1 即为当前年份当前月份第一天是周几
<5>主方法调用即可
问题<1>:在得知当前月份是周几后无法令其前面出现空格
解决方法:
<先让循环变量循环到today,每次输出一个空格和'\t',结束循环。令time=today,每次循环time都++,判断time是否=7,等于7则换行同时time=0
3.评分系统
程序设计思路:
<1>在求最大值的方法里定义max数组记录每个选手的最高分,并返回max数组,求最小值同理
<2>求平均分时调用每个选手的最小值和最大值并减去,最后令sum/8返回平均分数组
<3>对平均分排序,列出选手的名次和得分
问题<1>:最小值数组和最大值数组中存储的数据有误
原因:忽略了max是一个数组,只定义了max[0]=score[0][0],并放在了循环外面,所以出错
解决方法:max[0]=score[i][0],放在循环中
(三)代码托管