JAVA《第一次作业》

(一)学习总结

1.在java中通过Scanner类完成控制台的输入,查阅JDK帮助文档,Scanner类实现基本数据输入的方法是什么?不能只用文字描述,一定要写代码,通过具体实例加以说明。

	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		int x=input.nextInt();
		System.out.println(" "+x);
	}

2..Random类和Math类的random()方法都能产生随机数,这两种方式有什么区别,各有什么特点呢?查阅JDK帮助文档,并举例加以说明。

	public static void main(String[] args) {
		int x=(int)(Math.random()*100);
		//产生随机数的方法一
		Random rand=new Random();
		int y=rand.nextInt(3);
		System.out.println(x);
		System.out.println(y);
	}

(1)Math.random();只能产生double的随机值,(返回值为double)想要生成int型的随机数 前面需要int强制转换。

(2)而Random类是工作Random类的相关方法,有多种类型的随机值的获取方法,如nextBoolean()、 nextInt()等。

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”。

   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");
	        }
	        System.out.println(a+b+c);
	    }    

将这三个数相加结果输出会发现结果为0.30000000000000004。

计算机在进行二进制算法时发生精度损失,产生了实际误差,为了处理精度损失的问题,可以使用java.math.BigDecimal类。
解决方法:
第一种方法:

   public static void main(String args[]) { 
	        double a = 0.1;
	        double b = 0.1;
	        double c = 0.1;
	        BigDecimal a1=new BigDecimal(a);
	        BigDecimal b1=new BigDecimal(b);
	        BigDecimal c1=new BigDecimal(c);
	        if((c1.add(b1).add(a1).round(new MathContext(1)).equals(new BigDecimal("0.3")))){
	            System.out.println("等于0.3");
	        }else {
	            System.out.println("不等于0.3");
	        }
	    } 

第二种方法:

 public static void main(String args[]) { 
	    	 double a = 0.1;
	         double b = 0.1;
	         double c = 0.1;
	         if((a + b + c)-0.3<1e-6){
	             System.out.println("等于0.3");
	         }else {
	             System.out.println("不等于0.3");
	         }
	     }     

4.本次学习要点中其他需要总结的内容:因人而异,根据自己的学习情况,记录难掌握或难理解的内容,以及学有心得的内容。还存在哪些问题,也可以提出来,对于同学在博客中提出的问题,大家可以积极讨论,互帮互学。

1.使用方法很重要!现在心里还有种抵触函数心理,但是要迎难而上,尽量主函数中没有过多代码,多写方法。
2.逻辑关系有时候很混乱,先搞清楚关系,再动手写,要不然代码写得太乱。
3.刚开始学java代码风格还基本上是c的风格

(二)实验总结

实验内容:

1.看商品猜价格:

public static void main(String[] args) {
		// TODO Auto-generated method stub
		int n=5,j,m=100;
		int x=(int)(Math.random()*100);
		double y,z;
		Scanner input = new Scanner(System.in);
		System.out.println("请输入你认为商品的价格,你有五次机会:");
		while(input.hasNextDouble())
		{	
			
			n--;
			y=input.nextDouble();
			if(x==y)//读取双精度数据
			{
				j=5-n;
				m=100-j*20+20;
				System.out.println( "恭喜你猜对了!!!用了"+j+"次机会" );
				System.out.println("你的最终得分为:"+m);
				System.out.println("是否继续下一轮游戏?输入1进行下一轮游戏,2结束游戏");
				z=input.nextDouble();
				if(z==1)
				{
					n=5;
					x=(int)(Math.random()*100);
					continue;
				}
				else
				{
					break;
				}
			}
			else if(n==0)
				{
				System.out.println("机会用完了,正确答案是:  "+x);
				System.out.println("你的最终得分为0");
				System.out.println("是否继续下一轮游戏?1进行下一轮游戏,2结束游戏");
				z=input.nextDouble();
				if(z==1)
				{
					n=5;
					x=(int)(Math.random()*100);
					continue;
				}
				else
				{
					break;
				}
				}
			else
			{
				if(x<=y)
				{
					System.out.println("猜大了");
				}
				else if(x>=y)
				{
					System.out.println("猜小了");
				}
				System.out.print( "没有猜对你还有"+n+"次机会");
			}
		}	
	}

程序设计思路:首先调用生成随机数的函数生成随机数,创建一个循环,循环中运用if语句通过判断键盘输入的数和随机生成的数进行对比,产生对应结果。如果想进行下一轮的话,运用contibue跳出if从句,继续进行循环。(这里要注意:要再次进行随机数的生成,否则的话随机数不会发生改变)
问题:当时在进行下轮游戏时发现随机数没有改变,原因是随机数在循环之前产生的,再进行循环的话并没有改变,需要再次产生新的随机数。

2.万年历

package shiyanyi;
import java.util.Scanner;
public class shiyanyi2 {
static final int N = 1900;//1900年为初始年
	public static void main(String[] args) { //主函数
		// TODO Auto-generated method stub
		Scanner input = new Scanner(System.in);
		System.out.println("输入年份和月份,用回车隔开");
		int year=input.nextInt();
		int month=input.nextInt();
		printCalender(year,month);
	}
	public static boolean isLeap(int year) {  //判断闰年
		if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0){
		    return true;
		}else{
			return false;
		}
	}
	public static int days(int year,int month) {//判断某年某月有多少天
		
		int result = 0;
		switch (month) {
			case 1:
			case 3:
			case 5:
			case 7:
			case 8:
			case 10:
			case 12:
				result = 31;
				break;
			case 4:
			case 6:
			case 9:
			case 11:
				result = 30;
				break;
			case 2:
				result = 28;
				if (isLeap(year)) {
				result = 29;
			}
			break;
		}
		return result;
	}
	public static int totalDays(int year,int month) {//计算某年某月之前距离1900年1月1日的总天数
		 int i,s = 0;
		 int a=0;
		 for(i=1900; i<year; i++)
		 {
		  s += 365;
		  if(isLeap(year))
			  ++s;
		 }
		 for(i=1;i<month;i++){
		 a=a+days(year,i);
		 }
		 return s+a+1;
	}
	public static void printCalender(int year,int month) {//输出某年某月日历
		int a=0,i,day;
		day=days(year,month);
		System.out.println("							"+year+"年"+month+"月");
		System.out.println("	星期日	"+"	星期一	"+"	星期二	"+"	星期三	"+"	星期四	"+"	星期五	"+"	星期六	");
		a=1+totalDays(year,month)%7;
		if(a==1)
		{
			System.out.print("			");
		}
		else if(a==2)
		{
			System.out.print("					");
		}
		else if(a==3)
		{
			System.out.print("							");
		}
		else if(a==4)
		{
			System.out.print("									");
		}
		else if(a==5)
		{
			System.out.print("											");
		}
		else if(a==6)
		{
			System.out.print("													");
		}
		else if(a==7)
		{
			System.out.print("	");
		}
		for(i=1;i<=day;i++)
		{
			System.out.print(" "+i);
			System.out.print("		");
			if((a+i)%7==0){
			System.out.println("");
			System.out.print("	");
			}
		}
	}
}

程序设计思路:分别创建“判断闰年”“某年某月多少天”(先把普通的月份天数确定,二月的天数通过判断闰年方法确定天数)“距离1900年天数(先计算这个年之前到1900年天数再加上这几个月的天数)”“输出函数”这几个方法进行程序设计。其中判断某月天数时用到闰年方法,计算据1900年总天数会用到某月多少天的方法,最后通过1+totaldays(year,month)%7,算出星期几,最后进行输出。
问题:刚开始没有一点头绪,后来先把实验要求的方法写出来之后才有了思路,方法之间相互联系。

3.评分系统

package shiyanyi;
import java.util.Scanner;//文本扫面类

public class shiyanyi3 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		double a[][]=new double [5][10];
		double b[]=new double [5];
		int i,j,k;
		Scanner input = new Scanner(System.in);
		System.out.println("请依次输入各个评委对各个选手的评分,评分最高分为10分");
		for(j=0;j<5;j++)
		{
			for(i=0;i<10;i++)
			{
				System.out.println("第"+(j+1)+"个评委请打分:");
				System.out.println("第"+(i+1)+"个选手");
				a[j][i]=input.nextDouble();
			}
		}
		maxmin(a);
		pingjun(a);
	}
	public static double pingjun(double a[][]) {
		int j,i,z;
		int c[]=new int [5];
		double b[]=new double [5];
		double ave[]=new double [5];
		double t,ma = 0,mb=0,mc=0,md=0,me=0,ave1,ave2,ave3,ave4,ave5;;
		c[0]=1;
		c[1]=2;
		c[2]=3;
		c[3]=4;
		c[4]=5;
		for(j=0;j<5;j++)
			for(i=1;i<9;i++)
			{
				if(j==0) {
					ma=ma+a[j][i];
				}
				else if(j==1) {
					mb=mb+a[j][i];
				}
				else if(j==2) {
					mc=mc+a[j][i];
				}
				else if(j==3) {
					md=md+a[j][i];
				}
				else if(j==4) {
					me=me+a[j][i];
				}
			}
			ave1=ma/8;
			ave2=mb/8;
			ave3=mc/8;
			ave4=md/8;
			ave5=me/8;
			ave[0]=ave1;
			ave[1]=ave2;
			ave[2]=ave3;
			ave[3]=ave4;
			ave[4]=ave5;
			for(i=0;i<5;i++) {
				System.out.println(+i+"号选手的平均分为:"+ave[i]);
			}
			b[0]=ave1;
			b[1]=ave2;
			b[2]=ave3;
			b[3]=ave4;
			b[4]=ave5;
			for(i=0;i<5;i++)
				for(j=0;j<4;j++)
					if(b[j]<b[j+1]) {
						t=b[j];
						b[j]=b[j+1];
						b[j+1]=t;
						z=c[j];
						c[j]=c[j+1];
						c[j+1]=z;
					}
			System.out.println("选手得分从高到低排名为:");
			for(i=0;i<5;i++)
			{
				System.out.println("选手"+c[i]+"	"+b[i]);
			}
		return 0;	
}
	public static double maxmin(double a[][]) {
		double t;
		int i,j,k;
		for(i=0;i<5;i++)
			for(j=0;j<10;j++)
				for(k=0;k<9;k++)
					if(a[i][k]>a[i][k+1]) {
						t=a[i][k];
						a[i][k]=a[i][k+1];
						a[i][k+1]=t;
					}
		for(i=0;i<5;i++) {
			System.out.println(i+"号选手的最高分为:"+a[i][9]+"最低分为:"+a[i][0]);
		}
		return 0;
	}
}

程序设计思路:创建一个二维数组用来存储选手的成绩,两个for循环嵌套进行分数输入。先将选手成绩数组排序,然后for循环不取第一个和最后一个求平均分即去掉最高分和最低分。最后对选手成绩排序,输出成绩排名。
问题:刚开始排完序后没有选手编号,又定义了一个选手序号数组在拍平均值时同时排序,得到各个选手对应的序号。对于重复的输出尽量用循环操作。

(三)代码托管

码云链接:https://gitee.com/lichenhao97/events

原文地址:https://www.cnblogs.com/lch1/p/8576062.html