• 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

  • 相关阅读:
    The bean 'xxx' could not be injected as a 'xxx'because it is a JDK dynamic proxy that implements
    JQuery对象选择详细说明
    C#将image中的显示的图片转换成二进制
    选择一个图片文件,并且用PictureBox表示在Form上
    Android推送方案分析(MQTT/XMPP/GCM)
    [转载]什么是 Design Hackathon?
    脚本启动MySql服务
    Mysql数据库插入数据乱码问题,解决方案!
    MySQL自动备份脚本
    读取Excel模板,写入数据,并别输出另存为Excel文件
  • 原文地址:https://www.cnblogs.com/lch1/p/8576062.html
Copyright © 2020-2023  润新知