Java第一次实验作业

一.学习总结
1.在java中通过Scanner类完成控制台的输入,查阅JDK帮助文档,Scanner类实现基本数据输入的方法是什么?
Scanner in =new Scanner(System.in);
int input =in.nextln;
输入的数据保存在in中,要用Scanner,需要提前声明import java.util.Scanner,Scanner对于输入的类型没有限制(在java允许的范围内),对这些数据进行输出就要对以储存的数据进行转换后才能输出。
获取基本类型数据的方法是:
nextInt() :读取整型数据
nextDouble() :读取双精度数据
next():读取输入的下一个单词(空格作为分隔符)
nextLine():读取输入的 下一行内容
实例:
...

package suiti;
import java.util.Scanner;
public class suiyi {
 public static void main(String[] args) {
	 Scanner in =new Scanner(System.in);
	 int input=in.nextInt();
	 System.out.print("请输入数据:");
	 System.out.println("请输出数据:"+input);
	// TODO Auto-generated method stub

}
}

...

2.Random类和Math类的random()方法都能产生随机数,这两种方式有什么区别,各有什么特点呢?
Random类给定一个范围,就可以产生几到几之间的随机数。例如:nextInt(100)就是产生一个0~100之间的整形的数(包括0,不包括100),nextFloat()就是产生从0.0到1.0之间的小数。
产生0至100之间的整数:
...

package random;
import java.util.Random;
public class L2 {

public static void main(String[] args) {
	Random rand=new Random();
	int x=rand.nextInt(100);
	System.out.println(x);
	// TODO Auto-generated method stub

}

}

...

Math类的random()产生0~1之间double类的随机数。
产生0至100之间的整数:
...

package random;

public class L1 {

public static void main(String[] args) {
	int x=(int)(Math.random()*100);
			System.out.println(x);
	// TODO Auto-generated method stub

}

}

...

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");
}
}
}

...


原因:浮点数类型在运算时有极小误差。
改正:
...

import java.math.BigDecimal;
public class Test {
public static void main(String[] args) {
	BigDecimal a=new BigDecimal(0.1);
	BigDecimal b=new BigDecimal(0.1);
	BigDecimal c=new BigDecimal(0.1);
	if(a.add(b).add(c).divide(new BigDecimal(1),2,BigDecimal.ROUND_HALF_UP).doubleValue()==0.3){
		 System.out.println("等于0.3");
    }else {
        System.out.println("不等于0.3");
    }
}

}

...

4.本次学习要点中其他需要总结的内容:
(1)定义Scanner类是前面需要声明import java.util.Scanner;
(2)类名称需要大写,并且有意义;
(3)类中所有的方法最好不要输出;
(4)输出语句中字符串的链接用“+”;
(5) System.out.println输出后不用换行, System.out.print输出后需要换行;

(二)实验总结
实验内容:
1.看商品猜价格

程序设计思路:(1)最多猜5次,所以要用到for循环(i作为控制变量),每次需要给出是猜大了还是猜小了,所以要用if来进行判断,还有几次猜数机会,可以用5-i来控制;
(2)第几次猜中得多少分,可以用switch case来得到;
(3)一轮游戏结束后,让用户自己选择是继续还是退出,要用到字符串的比较,字符串的比较用到的是equals方法;
(4)游戏整个结束后,显示猜了几次,总得分,用到求和运算;
(5)把以上整个小步骤整合到一起就ok了。
package 猜数2;
import java.util.Scanner;
import java.util.Random;
public class Caishu2 {

public static void main(String[] args) {
Scanner input=new Scanner(System.in);
String str1="yes";
System.out.println("是否开始游戏?yes or no");
int zongfen=0;
while(true) {

String str=input.next();
if(str1.equals(str)) {
Random suiji=new Random();
int suiji2=suiji.nextInt(100)+1;
int i;
for(i=1;i<=5;i++) {
int price=input.nextInt();
int n=5-i;
if(price>suiji2) {
System.out.println("猜大了,你还有"+n+"次猜数的机会");
}
else if(price<suiji2) {
System.out.println("猜小了,你还有"+n+"次猜数的机会");
}
else {
System.out.println("猜中了");
break;
}
}
int score=0;
switch(i){
case 1:score=100;break;
case 2:score=80;break;
case 3:score=60;break;
case 4:score=40;break;
case 5:score=20;break;
case 6:score=0;break;
}
System.out.println("score="+score+" 正确的价格为:"+suiji2);
zongfen+=score;
}
else {
break;
}
System.out.println("是否继续游戏?yes or no?");
}
System.out.println("总分="+zongfen);
// TODO Auto-generated method stub

}

}

出现的问题:字符串的比较,还有循环中有一些小问题,不过拿上就改正了。

2.万年历

程序设计思路:(1)编写一个方法判断闰年:就是结余4等于0并且结余100不等于0或者结余400等于0;
(2)编写方法判断某年某月有多少天:switch case语句,闰年的2月有29天,平年的2月有28天;
(3)编写方法计算某年某月之前距离1900.1.1有多少天:比如输入2018.3,求出1900到2017年的天数,再加上2018年的1月和2月的天数。用for循环;
(4)打印一个月的日历:总天数结余7再加1就等于下一月的第一天是周几,每7天就要有回车输出;

问题:(1)switch case运用不熟练---查书之后解决;
(2)打印的时候没有思路---问同学解决;
import java.util.Scanner;
public class Shiyan1 {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
System.out.println("请输入年份和月份:");
int year=in.nextInt();
int month=in.nextInt();
int s;
s=totalDays(year,month);
System.out.println("总天数为:"+s);
System.out.printf("此年此月的天数 %d ", days(year,month));
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 day=0;
	switch(month){
	case 2:if(isleap(year)){day=29;}
	        else{day=28;}break;
	case 1:
	case 3:
	case 5:
	case 7:
	case 8:
	case 10:
	case 12:day=31;break;
	case 4:
	case 6:
	case 9:
	case 11:day=30;break;
	}
	return day;
}
public static int totalDays(int year,int month){
	int zyear=0,i,x,zday=0;
	int zmonth=0;
	for(i=1900;i<year;i++){
		if(isleap(i)){
			x=366;
		}
		else{
			x=365;
		}
		zyear+=x;
	}
	for(i=1;i<month;i++){
		
		zmonth+=(days(year,i));
	}
	zday=zyear+zmonth;
	return zday;
}
public static void printCalender(int year,int month) {
	int x=totalDays(year,month);
	int s=1+x%7;
	int n=0;
	System.out.println("一	二	三	四	五	六	日	") ;
	for(int i=1;i<s;i++) {
	System.out.print("	") ;
	n++;
	}
	int j=days(year,month);
	for(int k=1;k<=j;k++) {
	System.out.print(k+"	") ;
	n++;
	if(n%7==0) {
	System.out.println( ) ;
	}
	}
	}

}
(三)代码托管

原文地址:https://www.cnblogs.com/zrx--/p/8578675.html