《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:当每位选手的评分均相同时,输出的平均分却递增
原因: 求平均分的时候,上一次的和未清零,被加到了本次成绩中
解决方案:每次平均分之后重新给分数和赋值

(三)代码托管
码云提交历史截图
上传实验项目代码到码云,在码云项目中选择“统计-提交”,设置搜索时间段,搜索本周提交历史,并截图。

posted on 2018-03-18 21:00  计科-XJ  阅读(160)  评论(0编辑  收藏  举报