《Java技术》第一次作业
(一)学习总结
1.在java中通过Scanner类完成控制台的输入,查阅JDK帮助文档,Scanner类实现基本数据输入的方法是什么?不能只用文字描述,一定要写代码,通过具体实例加以说明。
JDK帮助文档里对Scanner类的定义为“一个可以使用正则表达式来解析基本类型和字符串的简单文本扫描器”。
Scanner通常会和new还有不同的next方法匹配,基本语句为
Scanner 变量名1=new Scanner([要读取的地方]);
变量类型 变量名2=变量名1.next类型名();
也可以定义其他字符为分隔符(我用day作为分隔符)
String character="1 day 2 day Sunday Monday";
Scanner c =new Scanner(character).useDelimiter("\\s*day\\s*");
System.out.println(c.nextInt());
System.out.println(c.nextInt());
System.out.println(c.next());
System.out.println(c.next());
c.close();
运行结果为
如果不像上面一样再自行定义分隔符的话,默认空白符为分隔符,就是空格、Tab和回车,输入的数据通过分隔符进行区分。Scanner类实现基本数据输入的方法就是通过扫描器进行扫描,然后通过各种程序中的方法进行操作和判断从而完成输入。
2.Random类和Math类的random()方法都能产生随机数,这两种方式有什么区别,各有什么特点呢?查阅JDK帮助文档,并举例加以说明。
(1)关于Random类
有一个seed参数为初始种子,可以使用它创建一个新的随机数生成器。例:
public Random(long seed)
是使用单个 long 种子创建一个新的随机数生成器。该种子是伪随机数生成器的内部状态的初始值,该生成器可通过方法 next(int) 维护。
其中也可以使用next方法生成下一个伪随机数。例:
public int nextInt() {
return next(32);
}
该程序作用是随机生成一个int类型的数并返回,其中32是指2的32次方。Random类可以产生指定类型和大小的随机数。
(2)关于Math类的random()方法
Math类包含的是执行基本数学运算的方法,其中的Random方法返回带正号的double值,该值大于等于 0.0 且小于 1.0。第一次调用该方法时,它将创建一个新的伪随机数生成器,就是下式:
new java.util.Random
这就使得Math.random()方法更易于使用。但它仅等同于Random.nextDouble(),若要生成0.0到1.0范围以外的随机数,还是要使用Random中的其他方法。
3.本次学习要点中其他需要总结的内容:因人而异,根据自己的学习情况,记录难掌握或难理解的内容,以及学有心得的内容。还存在哪些问题,也可以提出来,对于同学在博客中提出的问题,大家可以积极讨论,互帮互学。
查阅JDK帮助手册中关于Scanner类内容的时候,关于输入阻塞我不太理解,为什么输入也有可能阻塞呢?阻塞时会出现什么样的状况?如果有大神愿意帮忙解答我会很高兴。
还有Scanner类用到了正则表达式,空余时间我也会多多学习的。
(二)实验总结
1.猜数游戏
- 程序设计思路:先写好猜一次的程序,执行没问题后,加for循环
- 实验问题分析:
问题:没太熟练掌握Scanner和Random的用法
解决方案:查了查资料,记住了。没什么其他的问题
问题:完成了基础要求后不知道要怎么样添加循环,还想过用goto,还有就是字符串的比较
解决方案:查了帮助文档后又问了度娘,字符串A和B的比较为A.equals(B)若相等则为true,不相等为false
2.万年历(我没有用老师给出的函数调用的方法)
程序设计思路:
①判断输入是否合法
②分别判断这一年的第一天、这个月的第一天、这一天是星期几
实验问题分析:
问题1:算星期几的数学公式要怎么列
原因:总列错
解决方案:首先算输入年份与1900年的年份差,然后算这些年里的闰年个数,年份差乘365加上闰年个数就是距离输入年份1月1号的总天数,然后再算输入月份1号的星期,输入日期的星期
问题2:日历格式要怎么输出
原因:总是搞错Tab键的个数,使得日期和星期合不上
解决方案:
刚开始用了switch处理,后来发现没必要就删掉了,用一个循环就能搞定,根本原因还是因为思路不清晰,没想明白
(三)[代码托管]
- 码云commit历史截图
(四)学习进度条
代码行数(新增/累积) | 学习时间(新增/累积) | 本周学习内容 | |
---|---|---|---|
目标 | 5000行 | 300小时 | |
第2-4周 | 300/202 | 30/ | 学习了Scanner类的使用方法,Random类、Math类里的random方法,写了两个完整程序 |
第5周 | |||
第6周 |
程序如下:
1、猜数游戏
package com.text;
import java.util.Random;
import java.util.Scanner;
public class Guess {
public static void main(String[] args){
Random rand = new Random();
int randNum = rand.nextInt(101);
int num=9;
for(int tip=1;tip!=0&&num>=0;num--){
System.out.println("请输入你猜的价格:");
Scanner input=new Scanner(System.in);
int inputNum=input.nextInt();
if(inputNum==randNum){
System.out.println("恭喜你猜对了!价格为"+randNum);
System.out.println("你猜的次数为"+(10-num));
tip=0;
}
if(inputNum>randNum){
System.out.print("猜大了,你还有"+num);
System.out.println("次机会");
}
if(inputNum<randNum){
System.out.print("猜小了,你还有"+num);
System.out.println("次机会");
}
}
if(num==-1){
System.out.println("很遗憾你没猜对,商品的价格为:"+randNum);
}
}
}
拓展题目:
package com.text;
import java.util.Random;
import java.util.Scanner;
import java.lang.String;
public class Guess2 {
public static void main(String[] args){
boolean judge=true; int grade = 0;
//循环判断是否要继续游戏
do{
//生成随机数
Random rand = new Random();
int randNum = rand.nextInt(101);
//判断价格
int num=9;int tip;
for(tip=1;tip!=0&&num>=0;num--){
System.out.println("请输入你猜的价格:");
Scanner input=new Scanner(System.in);
int inputNum=input.nextInt();
if(inputNum==randNum){
System.out.println("恭喜你猜对了!价格为"+randNum);
System.out.println("你猜的次数为"+(10-num));
System.out.println("你本次的分数为"+(num20));
tip=0; grade=grade+(num20);
}
if(inputNum>randNum){
System.out.print("猜大了,你还有"+num);
System.out.println("次机会");
}
if(inputNum<randNum){
System.out.print("猜小了,你还有"+num);
System.out.println("次机会");
}
}
if(num==-1&&tip==1){
System.out.println("很遗憾你没猜对,商品的价格为:"+randNum);
}
//判断是否要继续游戏
System.out.println("请问你还要继续玩么?要请输入'是',不要请输入'否'");
Scanner choice=new Scanner(System.in);
String ch=choice.next();
String choi="否";
String cho="是";
if(ch.equals(cho)){
System.out.println("游戏将继续");
}
else if(ch.equals(choi)){
System.out.println("您的最终得分为"+grade+"分");
judge=false;
}
else{
System.out.println("输入非法!");
}
}while(judge);
}
}
2、万年历
package com.text;
import java.util.Scanner;
public class calender {
public static void main(String[] args){
int daymax=0;
//判断年份输入是否非法
System.out.println("请输入年份:");
Scanner inyear=new Scanner(System.in);
int year=inyear.nextInt();
if(year<1900||year>2100)
System.out.println("非法输入!");
if(year%100!=0&&year%4==0||year%400==0)
daymax=29;
else
daymax=28;
//判断月份输入是否非法
System.out.println("请输入月份:");
Scanner inmonth=new Scanner(System.in);
int month=inmonth.nextInt();
if(month<1||month>12)
System.out.println("非法输入!");
switch(month){
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
daymax=31;
break;
case 4: case 6: case 9: case 11:
daymax=30;
break;
}
//判断日期输入是否非法
System.out.println("请输入日期:");
Scanner inday=new Scanner(System.in);
int day=inday.nextInt();
if(day<1||day>daymax){
System.out.println("非法输入!");
}
//判断这一年第一天是星期几
int extra=0;
extra=(year-1900)/4;
int totalday=0;
totalday=365*(year-1900)+extra;
int weekday=0;
weekday=totalday%7+1;
if(year%100!=0&&year%4==0||year%400==0){
if(month<3)
weekday-=1;
}
//判断某一天是星期几
int weekdayday=-1; int dayweek=-1; int weekd=0;
switch(month){
case 1: dayweek=weekday%7;
weekd=weekday%7;
weekdayday=(day-1+weekd)%7; break;
case 2: dayweek=(3+weekday)%7;
weekd=(3+weekday)%7;
weekdayday=(3+weekday+day-1)%7; break;
case 3: dayweek=(3+weekday)%7;
weekd=(3+weekday)%7;
weekdayday=(3+weekday+day-1)%7;
break;
case 4: dayweek=(6+weekday)%7;
weekd=(6+weekday)%7;
weekdayday=(6+weekday+day-1)%7;
break;
case 5: dayweek=(1+weekday)%7;
weekd=(1+weekday)%7;
weekdayday=(1+weekday+day-1)%7;
break;
case 6: dayweek=(4+weekday)%7;
weekd=(4+weekday)%7;
weekdayday=(4+weekday+day-1)%7;
break;
case 7: dayweek=(6+weekday)%7;
weekd=(6+weekday)%7;
weekdayday=(6+weekday+day-1)%7;
break;
case 8: dayweek=(2+weekday)%7;
weekd=(2+weekday)%7;
weekdayday=(2+weekday+day-1)%7;
break;
case 9: dayweek=(5+weekday)%7;
weekd=(5+weekday)%7;
weekdayday=(5+weekday+day-1)%7;
break;
case 10: dayweek=weekday%7;
weekd=weekday%7;
weekdayday=(0+weekday+day-1)%7;
break;
case 11: dayweek=(3+weekday)%7;
weekd=(3+weekday)%7;
weekdayday=(3+weekday+day-1)%7;
break;
case 12: dayweek=(5+weekday)%7;
weekd=(5+weekday)%7;
weekdayday=(5+weekday+day-1)%7;
break;
}
//System.out.println("这个月第一天是星期"+weekd);
System.out.println("这一天是星期"+weekdayday);
//输出日历
System.out.println("该月日历为:");
System.out.println(" 星期日 星期一 星期二 星期三 星期四 星期五 星期六");
int dweek=weekd;
for(day=1;day<=daymax;day++){
for(;dweek>0;dweek--){
System.out.print("\t");
}
System.out.print("\t"+day);
if((day+weekd-1)%7==6)
System.out.println();
}
}
}