Java第一次实验作业

时间:2022-10-08 23:19:07

一.学习总结
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");
}
}
}

...

Java第一次实验作业
原因:浮点数类型在运算时有极小误差。
改正:
...

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 \n", 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("一\t二\t三\t四\t五\t六\t日\t") ;
    for(int i=1;i<s;i++) {
    System.out.print("\t") ;
    n++;
    }
    int j=days(year,month);
    for(int k=1;k<=j;k++) {
    System.out.print(k+"\t") ;
    n++;
    if(n%7==0) {
    System.out.println( ) ;
    }
    }
    }

}
(三)代码托管
Java第一次实验作业