《Java技术》第一次作业
(一)学习总结
1.在java中通过Scanner类完成控制台的输入,查阅JDK帮助文档,Scanner类实现基本数据输入的方法是什么?不能只用文字描述,一定要写代码,通过具体实例加以说明。
Scanner 使用分隔符模式将其输入分解为标记,默认情况下该分隔符模式与空白匹配。然后可以使用不同的 next 方法将得到的标记转换为不同类型的值。
Scanner 的头文件为import java.util.Scannner,之后再次声明 Scanne r即可调用。需要注意的是在用Scanner输入的时候要保持前后一致,
如:Scanner in=new Scanner(System.in)和year = in.nextInt(),Scanner后为in,则用in.nextInt,而且字符串类型遇到空格或者回车时会结束输入。
代码举例:
import java.util.Scanner;
public class square {
public static void main(String[] args) {
// TODO 自动生成的方法存根
int i;
Scanner in = new Scanner (System.in);
System.out.println("请输入一个数字");
int x = in.nextInt();
for(i=1;i<=x;i++){
System.out.println(i+"*"+i+"="+(i*i));
}
}
}
2.Random类和Math类的random()方法都能产生随机数,这两种方式有什么区别,各有什么特点呢?查阅JDK帮助文档,并举例加以说明。
Random类的随机方法是设定随机种子的,(如:new Random().nextInt(10)),这里的10就是随机种子,根据随机数的原理,相同随机种子在相同的随机次数中产生的随机数是一样的;
Math类的随机方法是返回带正号的 double 值,该值大于等于 0.0 且小于 1.0。
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");
}
}
}
为了处理精度损失的问题,可以使用java.math.BigDecimal类,查阅JDK帮助文档或教材p378,对上述程序进行修改。
结果为“不等于0.3”
造成此类问题是因为在Java中使用分数和指数来表示浮点类型的数据时,在加减的过程中,产生了浮点型误差,解决此类问题的方法可调用BigDecimal方法。
改正方法如下:
package test;
import java.math.BigDecimal;
import java.math.MathContext;
@SuppressWarnings("unused")
public class Test {
public static void main(String args[]) {
BigDecimal a = new BigDecimal(0.3);
BigDecimal b = new BigDecimal("0.3");
System.out.println(a);
System.out.println(b);
}
}
4.本次学习要点中其他需要总结的内容:因人而异,根据自己的学习情况,记录难掌握或难理解的内容,以及学有心得的内容。还存在哪些问题,也可以提出来,
对于同学在博客中提出的问题,大家可以积极讨论,互帮互学。
1)注意定义时变量的类型,确保精度和变量范围足够
2)注意使用Scanner时in或input的匹配
实验内容:
1.看商品猜价格
程序设计思路:首先系统生成一个随机数,然后提示用户输入猜的数字,根据输入的数字,系统会给出提示“猜大了”或者“猜小了”,用户可以继续输入至猜对或者用完
次数,无论哪种情况,系统均会给出正确答案,并提示输入了几次。
问题1:无法产生随机数
原因: 未在开始进行定义
解决方案:在项目开头添加对随机数的定义
问题2:无法进行输入
原因: 用Scanner进行输入时,上下使用的关键字不匹配
解决方案:同时使用in输入或同时使用inpt输入
代码:
package caijiage;
import java.util.Random;
import java.util.Scanner;
public class caijiage {
public static void main(String[] args) {
@SuppressWarnings({ "resource" })
Scanner in=new Scanner(System.in);
Random rand=new Random();
int answer;
int count=0;
int result = rand.nextInt(100);
@SuppressWarnings("unused")
String str = null;
while(count<10){
System.out.println("请输入你猜的价格:");
answer = in.nextInt();
if(answer<result){
System.out.println("猜小了,继续输入");
count++;
}
else if(answer>result){
System.out.println("猜大了,继续输入");
count++;
}
else{
count++;
break;
}
}
System.out.println("这个数字是"+result);
System.out.println("你猜的次数是"+count);
}
}
2.万年历
程序设计思路:用户输入年份和月份,系统对其进行判断,判断是否为闰年,之后判断月份,闰年时2月为29天,平年为28天;
之后计算天数的时候要确定输入月份与上一年12月相距的天数。
import java.util.Scanner;
public class NewWannianli {
public static void main(String[] args) {
@SuppressWarnings("resource")
Scanner in=new Scanner(System.in);
@SuppressWarnings("unused")
int year,mouth,i;
System.out.print("请输入一个年份:");
year = in.nextInt();
isLeap(year);
System.out.print("请输入一个年份和月份:");
year = in.nextInt();
int month = in.nextInt();
days(year,month);
System.out.println(year+"年"+month+"月有"+days(year,month)+"天");
System.out.println(year+"年"+month+"月距离1900年1月1日有"+totalDays(year,month)+"天");
printCalender(year,month);
}
//判断闰年的方法
public static boolean isLeap(int year){
if(year%4==0&&year%100!=0||year%400==0){
System.out.println(year+"是闰年");
return true;
}
else{
System.out.println(year+"是平年");
return false;
}
}
//判断某年某月有多少天的方法
public static int days(int year, int month){
int day=0;
switch(month){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
day = 31;
break;
case 4:
case 6:
case 9:
case 11:
day = 30;
break;
case 2:
if(year%4==0&&year%100!=0||year%400==0){
day = 29;
}
else{
day = 28;
}
}
return day;
}
//计算某年某月之前距离1900年1月1日的总天数的方法
public static int totalDays(int year, int month){
int i,j,sum=0,sum1=0,sum2=0;
for(i=1900;i<year;i++){
if(i%4==0&&i%100!=0||i%400==0){
sum1+=366;
}
else{
sum1+=365;
}
}
for(j=1;j<month;j++){
if(j==1||j==3||j==5||j==7||j==8||j==10||j==12)
sum2+= 31;
else if(j==4||j==6||j==9||j==11)
sum2+= 30;
else{
if(year%4==0&&year%100!=0||year%400==0){
sum2+= 29;
}
else{
sum2+= 28;
}
}
}
sum = sum1 + sum2;
return sum;
}
//输出某年某月日历的方法的方法
public static void printCalender(int year, int month){
int totalDays = totalDays(year, month);// 月之前
int MonthDays = days(year,month);// 月的天数
int sum3 = MonthDays;
System.out.println("星期一 \t星期二\t星期三\t星期四\t星期五\t星期六\t星期日");
int day = totalDays % 7;// System.out.print(""+a);
if (day==7)
day=0;
for (int m=1;m<=day;m++)
System.out.print("\t");
int flag = day;
for (int i=1;i<=sum3;i++) {
if (flag%7==0 && flag!=0)
System.out.println("");
flag++;
System.out.print(i + "\t");
}
}
}
问题:无法打印出每个月的日历
原因: 未在主类中调用打印函数
解决方案:在主类中添加输出,调用“打印”函数
3.评分系统
程序设计思路:因为选手和评委均为多位,所以应该设计一个二维数组来存放每位评委对每个选手的评分。
import java.util.Arrays;
import java.util.Scanner;
public class Pingfen {
public static void main(String[] args) {
@SuppressWarnings("resource")
Scanner input = new Scanner(System.in);
int i,j,sum=0;
float ave;
int score[][] = new int [5][10];
for(i=0;i<5;i++){
for(j=0;j<10;j++){
if(j==0){
System.out.println("请输入选手成绩:");
}
score[i][j] = input.nextInt();
}
Arrays.sort(score[i]);
}
for(i=0;i<5;i++){
System.out.println("第"+(i+1)+"选手成绩为:");
for(j=8;j>0;j--){
sum+=score[i][j];
System.out.print(score[i][j]+" ");
if(j==1)
System.out.print('\n');
}
ave=(float)sum/8;
System.out.println("该选手最低成绩为"+score[i][0]);
System.out.println("该选手最高成绩为"+score[i][9]);
System.out.println("该选手平均成绩为"+ave);
sum=0;
}
}
}
问题1:当每位选手的评分均相同时,输出的平均分却递增
原因: 求平均分的时候,上一次的和未清零,被加到了本次成绩中
解决方案:每次平均分之后重新给分数和赋值
(三)代码托管
码云提交历史截图
上传实验项目代码到码云,在码云项目中选择“统计-提交”,设置搜索时间段,搜索本周提交历史,并截图。