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周 |
浙公网安备 33010602011771号