Java第一次作业 1502 李新磊

Java第一次作业

(一)学习总结

1.Scanner类实现基本数据输入的方法

当通过new Scanner(System.in)创建一个Scanner,控制台会一直等待输入,直到回车键结束,把所有输入的内容传给Scanner,作为扫描对象。
如果要获取输入的内容,需要调用Scanner的nextLine()、nextInt()、nextDouble()、next()等方法。
nextInt(): 读取整型数据。    
nextDouble():读取双精度数据。   
next() :读取输入的下一个单词(空格作为分隔符)。
nextLine(): 读取输入的下一行内容。

import java.util.Scanner;
public class ScannerTest {
	public static void main(String[] args) {
		Scanner n = new Scanner(System.in); /*构造Scanner对象,并与System.in关联*/
		int x = n.nextInt();                /*调用Scanner的nexInt方法完成输入操作*/
		System.out.println("x:" + x);
	}
}

2.Random类和Math类的random()产生随机数的特点

Math类:java.lang包中的Math类,包含了许多用来进行科学计算的类方法,涉及大多数学函数。
直接调用Math.random()产生一个(0,1)之间的随机数,为double型的小数。在猜数程序中,需要1900-2099之间的随机数,则强制转换为int,先乘199再加1900。

(int)(Math.random()*199=) + 1900

Random类中实现的随机算法是伪随机。在进行随机时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要的随机数字。
相同种子数的Random对象,相同次数生成的随机数字是相同的。

public Random()  使用一个和当前系统时间对应的相对时间有关的数字作为种子数,然后使用这个种子数构造Random对象。

Random r = new Random();

public Random(long seed)  制定一个种子数进行创建Random对象。

Random r1 = new Random(10);

public double nextDouble() 生成一个随机的double值,数值介于[0,1.0)之间。

public int nextInt() 生成一个随机的int值,该值介于int的区间(-231~231-1)。

public int nextInt(int n) 生成一个随机的int值,该值介于[0,n)之间,包含0不包含n。

3.运用Random类产生一个1900-2099之间的随机数

加入一个判断,将产生的随机数进行筛选。

public static int randomYear(){/*(测试)产生随机年份*/
		Random random=new Random();
		int randomyear;
		randomyear=random.nextInt(2099);/*产生一个0-2099之间的随机数*/
		while(randomyear<1900){           /*判断产生的随机数是否小于1900,如果小于1900,则重新产生随机数,直到产生1900-2099之间的数*/
			randomyear=random.nextInt(2099);
		}
		return randomyear;
	}

4.equals判断两个字符串是否相等

equals()比较的是对象的内容(返回true 或false),如果使用“==”比较两个对象时,比较的是两个对象的内存地址,所以不相等。

猜数游戏中,判断用户输入的yes/no

  Scanner s = new Scanner(System.in);
  String str = null;
        System.out.println("Whether continue?yes/no");
        str = s.next();
        String string1=new String( "yes" ); 
        String string2=new String( "no" );
        if(str.equals(string1)==true)
        ......
        else if(str .equals(string2)==true)
        ......

(二)实验总结

1.猜数

程序设计思路

(1)运用Random类编写一个产生随机数(0-100)的方法
public static int randomNum()

(2)编写一个比较输入数字与产生的数字大小的方法
public static int compreNum(产生的随机数,用户输入的数)
返回值:> 0用户输入的数比随机数大
< 0用户输入的数比随机数小
= 0用户输入的数与随机数相等

(3)编写方法,实现猜数过程与选择下一轮
public static int guessNumber()
如果用户输入的数字与产生的随机数不同,输出“错误(大或小)”;
当用户输入数字与随机数相同,输出“正确”,选择是否进行下一轮,选择“否”程序结束(输出得分与次数),选择“是”后递归调用本方法,进行下一轮;
当连续5次不同时,选择是否进行下一轮,选择“否”程序结束(输出得分与次数),选择“是”后递归调用本方法,进行下一轮。

问题1.如何实现进行下一轮

解决方案
当猜对或5次猜错,一轮结束时,用户选择是否进行下一轮,选择“是”后递归调用方法guessNumber(),重新生成随机数,用户重新输入数字,直到又一轮结束,用户继续选择是否下一轮,如此循环,直到用户选择结束为止。

public static int guessNumber(......){
        ......
        System.out.println("Whether continue?y/n");/*猜对或5次未猜对,选择是否继续下一轮*/
	c = in.next().charAt(0);
	if(c=='y')
		return guessNumber(n,score);/*调用自身,重新开始下一轮*/
	else if(c!='y')
	System.out.printf("共%d次,共 %d分",n,score);	
	        return 0;/*返回0,程序结束*/
}

问题2.如何记录总得分与总次数

解决方案
主方法中定义变量次数n与分数score,guessNum方法传递参数guessNumber(int n,int score),每执行一次compreNum(判断产生的随机数与用户输入的数是否相等),次数n+1,
每猜对一次(产生的随机数与用户输入的数相等),分数分别+100、80、60、40、20,当用户选择结束时,输出总次数n和总分数score。

public static void main(String[] args) {
		int score=0,n=0;/* 声明次数n,分数score*/
		guessNumber(n,score);
	}

public static int guessNumber(int n,int score){/*传参*/
......
        if(compreNum(a,b)>0){
	System.out.println("wrong,less");
	n++;
	}
	else if(compreNum(a,b)==0){
	System.out.println("right");/*计算猜对后的得分*/
	n++;
	switch(i){
		case 1:score=score+100;
		break;
		case 2:score=score+80;
		break;
		case 3:score=score+60;
		break;
		case 4:score=score+40;
		break;
		case 5:score=score+20;
		break;
	        }
		.............
	}
	else if(compreNum(a,b)<0){
	System.out.println("wrong,large");
		n++;
	}
......
System.out.println("Whether continue?y/n");/*猜对或5次未猜对,选择是否继续下一轮*/
	c = in.next().charAt(0);
	if(c=='y')
		return guessNumber(n,score);/*调用自身,重新开始下一轮*/
	else if(c!='y')
	System.out.printf("共%d次,共 %d分",n,score);/*输出总次数和总分数*/	
	        return 0;/*返回0,程序结束*/
}

2.万年历

程序设计思路

(1)编写一个判断闰年的方法
public static boolean isLeap(int year)

(2)编写一个判断输入的某年的某月有多少天的方法
public static int days(int year,int mouth)
先判断输入的年份是否闰年,调用判断闰年方法,如果是闰年,则2月有29天,否则2月28天,其余月份1、3、5、7、8、10、12有31天,其余30天。

(3)编写一个计算输入的某年某月距1900年1月1日有多少天(判断输入的某年的某月的第一天是星期几)的方法
public static int totalDays(int year ,int mouth)
从1900开始,直到输入的年份,每一年一次进行判断是否闰年,“是”天数day+366,“否“”day+365,一直加到输入的那年,再加上输入的月份之前所有月份的天数,例如输入1月,则天数day加0,输入2月,则天数day加1月的31,输入3月,则天数day加上一月的31和2月的29或28,以此类推。再判断输入的那个月的第一天是星期几week=1+totalDays(year,mouth)%7;

(4)编写一个输出某年某月日历的方法
public static void printCalender(int year,int mouth)
判断输入的年份月份是否闰年,是几月,确定天数28、29、30、31再格式化输出日历。

问题1.计算输入的某年某月距1900年1月1日有多少天

解决方案
从1900开始,直到输入的年份,每一年一次进行判断是否闰年,“是”天数day+366,“否“”day+365,一直加到输入的那年,再加上输入的月份之前所有月份的天数,例如输入1月,则天数day加0,输入2月,则天数day加1月的31,输入3月,则天数day加上一月的31和2月的29或28,以此类推。

public static int totalDays(int year ,int mouth){/*输入的某年某月距1900年1月1日有多少天*/
	int i=1900,j=0,num=0;
	for(;i<year;i++){                  /* 从1900开始循环,每年依次相加,直到输入的那年*/
		if(isLeap(i))            /*判断是否闰年,天数加366或365*/
			num=num+366;
		else
			num=num+365;
	}
	for(;j<mouth;j++){            /*年份的循环结束,再从输入的那年1月开始,每月依次相加,天数加该月份的天数*/
			switch(j){
			case 0:
			    num=num+0;
				break;
			case 1:
			case 3: 
			case 5:
			case 7:
			case 8:
			case 10:
				num=num+31;
				break;
			case 2:
				if(isLeap(year)){
					num=num+29;
				}
				else{
					num=num+28;
				}
				       break;
			case 4:
			case 6:
			case 9:
			case 11:
				num=num+30;
				break;	
			}
		}
		return num;                    /*输入的某年某月距1900年1月1日的天数*/
}
...... 
week=1+totalDays(year,mouth)%7;      /*判断该月第一天是星期几*/
......
	

问题2.格式化输出日历

解决方案
先根据该月第一天是星期几,输入空格,使得数字与星期对齐,再输入每7个字符一换行,使之格式化。

public static void printCalender(int year,int mouth){/*输出该年月日历*/
		int week,n=0;
		week=1+totalDays(year,mouth)%7;      /*判断该月第一天是星期几*/
		System.out.printf("%d年,%d月\n",year,mouth);
		System.out.println("日\t一\t二\t三\t四\t五\t六");
		if(week!=7){              /*首先在第一天输出空格,周日不输出,周一输出1个空格,周二2个,以此类推*/
			for(int k=0;k<week;k++){
				System.out.print("\t");
				n++;           /*每输入一个空格,计数+1*/
			}
		}
		for(int m=1;m<=days(year,mouth);m++){
			System.out.printf(String.format("%02d\t",m));/*再输出日期,从1到当月的天数28、29、30、31*/
			n++;/*每输入一个数字,计数+1*/
		if(n%7==0)
			System.out.print("\n");	/*每输入7个字符,换一行*/
		}
	
	}

(三)代码托管

项目链接:http://git.oschina.net/hebau_cs15/Java-CS02lxl

(四)学习进度条

-------- 代码行数(新增/累积) 学习时间(新增/累积) 本周学习内容
目标 5000行 300小时
第2周 205/205 10/10 java的基本语法、random方法、math方法、方法的使用.
第3周
第4周

posted on 2017-03-05 13:25  押沙龙  阅读(359)  评论(2)    收藏  举报