Java_实验二

1、编写MyDate类,完善上次实验中的人员信息录入,实现日期合法性判断,包括大小月和闰年。
实验一的student类,此处复用

package Ex1.Firstquestion;

public class Student{
    private String name;
    private int age;
    private double marksOfJava;
    private int year;
    private int month;
    private int day;

    public Student(String name,int age,int year,int month,int day,double marksOfJava){
        this.name = name;
        this.age = age;
        this.year = year;
        this.month = month;
        this.day = day;
        this.marksOfJava = marksOfJava;
    }
    public void show(){
        System.out.printf("name: %15s  age: %3d  year: %5d  month: %3d  day: %3d  markOfJava: %6.2f",
                this.name,this.age, this.year,this.month,this.day,this.marksOfJava);
    }
}
package Ex2.Firstquestion;

import java.util.Scanner;
import Ex1.Firstquestion.Student;

/**
 * @author 15328
 * 1、编写MyDate类,完善上次实验中的人员信息录入,
 * 实现日期合法性判断,包括大小月和闰年。
 */
public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String name;
        int age, year, month, day;
        double markOfJava;
        int numOfStudent;
        System.out.println("请输入学生数量: ");
        numOfStudent = input.nextInt();
        input.nextLine();
        System.out.printf("请输入这%d个学生的信息:\n", numOfStudent);
        System.out.println("将依次是:名字、年龄、出生年月日、Java成绩");


        String[] names = new String[numOfStudent];
        int[] ages = new int[numOfStudent];
        int[] years = new int[numOfStudent];
        int [] months = new int[numOfStudent];
        int [] days = new int[numOfStudent];
        double [] markOfJavas = new double[numOfStudent];
        int numOfTrue = 0;


        for(int i = 0; i < numOfStudent; i++) {
            name = input.next();
            age = input.nextInt();
            year = input.nextInt();
            month = input.nextInt();
            day = input.nextInt();
            markOfJava = input.nextDouble();
            input.nextLine();
            if(MyDate.judgeOfMonth(year,month,day)){
                names[numOfTrue]=name;
                ages[numOfTrue]=age;
                years[numOfTrue]=year;
                months[numOfTrue]=month;
                days[numOfTrue]=day;
                markOfJavas[numOfTrue]=markOfJava;
                numOfTrue++;
            }
        }


        System.out.println("有效学生信息的人数: " + numOfTrue);
        Student[] students = new Student[numOfTrue];
        for(int j = 0; j < numOfTrue; j++){
            students[j] = new Student(names[j], ages[j], years[j], months[j], days[j], markOfJavas[j]);
        }
        System.out.println("有效学生信息如下:");
        for(Student x:students){
            x.show();
            if(x!=students[students.length-1]){
                System.out.println();
            }
        }
    }
}

class MyDate{
    public static int isLeapYear(int year){
        if(year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
            return 1;
        }
        else{
            return 0;
        }
    }
    
    public static boolean judgeOfDay1(int month,int day,boolean isTrue){
        if(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
            if(day < 1 || day > 31){
                System.out.printf("非法输入日期,%d月没有第%d天\n",month,day);
                isTrue = false;
            }
        }
        else if(month == 4 || month == 6 || month == 9 || month == 11) {
            if(day < 1 || day > 30){
                System.out.printf("非法输入日期,%d月没有第%d天\n",month,day);
                isTrue = false;
            }
        }
        return isTrue;
    }
    
    public static boolean judgeOfMonth(int year,int month,int day){
        boolean isTrue = true;
        if(month < 0 || month > 12) {
            System.out.printf("非法输入日期,没有第%d个月\n",month);
            isTrue = false;
        }
        else {
            if(month == 2) {
                if(isLeapYear(year) == 1) {
                /*如果使用LocalDate类,也可以直接调用其类中的方法isLeapYear
                     * 来判断是否是闰年,但是也会出现一个问题:
                     * 当输入年份为闰年的时候,如果2月的日期输入错误,
                     * 在构造date对象的时候就会检测到并抛出异常:
                     * Exception in thread "main" java.time.DateTimeException: Invalid date 'FEBRUARY 30'
                     * 	at java.base/java.time.LocalDate.create(LocalDate.java:461)
                     * 	at java.base/java.time.LocalDate.of(LocalDate.java:273)
                     * 	at Ex2.Firstquestion.MyDate.judgeOfMonth(MyDate.java:42)
                     * 	at Ex2.Firstquestion.Main.main(Main.java:39)
                     *
                     *
                     * LocalDate date = LocalDate.of(year, month, day);
                     * if(date.isLeapYear()){
                     **/
                    if(day < 0 || day > 29) {
                        System.out.printf("非法输入日期,闰年%d月没有第%d天\n", month, day);
                        isTrue = false;
                    }
                }
                else {
                    if(day < 0 || day > 28) {
                        System.out.printf("非法输入日期,非闰年%d月没有第%d天\n", month, day);
                        isTrue = false;
                    }
                }
            }
            else{
                isTrue = judgeOfDay1(month,day,isTrue);
            }
        }
        return isTrue;
    }
}

在这里插入图片描述

4、定义接口Shape及其抽象方法getArea()和getPerimeter()用于计算图形和面积和周长。定义类Rectangle(矩形)、类Circle(圆形)、类Triangle(三角形),要求这些类继承点类Coordinates()并实现接口的抽象方法。
提示:
class Coordinates
{
long x;
long y;
Coordinate(long x, long y)
{
this.x=x;
this.y=y;
}
}

package Ex2.forthquestion;

import java.util.Scanner;

/**
 * @author 15328
 * 4、定义接口Shape及其抽象方法getArea()和getPerimeter()用于计算图形和面积和周长。
 * 定义类Rectangle(矩形)、类Circle(圆形)、类Triangle(三角形),
 * 要求这些类继承点类Coordinates()并实现接口的抽象方法。
 */
public class Main {
    public static void showOfSelect(){
        System.out.println("选择一种图形形状:");
        System.out.println("****1、矩形****");
        System.out.println("****2、圆形****");
        System.out.println("****3、三角形****");
    }
    public static boolean judgeOfData(long x){
        if(x < 0) {
            System.out.printf("非法输入,其首个非法值为:%4d\n",x);
            return false;
        }
        else{
            return true;
        }
    }
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        long x,y,r,z;
        System.out.println("请输入要计算的图形的数量:");
        int num = input.nextInt();
        Coordinate [] coordinates = new Coordinate[num];
        int judgeOfShape = 0;
        for(int i = 0; i < num; i++){
            showOfSelect();
            judgeOfShape = input.nextInt();
            input.nextLine();
            switch(judgeOfShape){
                case 1:{
                    System.out.println("请输入长和宽:");
                    x = input.nextLong();
                    y = input.nextLong();
                    input.nextLine();
                    if(!judgeOfData(x) || !judgeOfData(y)) {
                        // 如果第一个为FALSE,第二个则不再执行,所以如果两个输入都非法,
                        // 那么只会显示第一个非法值的数值
                        break;
                    }
                    coordinates[i] = new Rectangle(x, y);
                    System.out.printf("矩形面积:%4.2f\n",coordinates[i].getArea());
                    System.out.printf("矩形周长:%4.2f\n",coordinates[i].getPerimeter());
                    break;
                }
                case 2: {
                    System.out.println("请输入圆心x坐标、y坐标、半径r: ");
                    x = input.nextLong();
                    y = input.nextLong();
                    r = input.nextLong();
                    input.nextLine();
                    if(!judgeOfData(r)) {
                        break;
                    }
                    coordinates[i] = new Circle(x,y,r);
                    System.out.printf("圆形面积:%4.2f\n",coordinates[i].getArea());
                    System.out.printf("圆形周长:%4.2f\n",coordinates[i].getPerimeter());
                    break;
                }
                case 3: {
                    System.out.println("请输入边长x、边长y、边长z: ");
                    x = input.nextLong();
                    y = input.nextLong();
                    z = input.nextLong();
                    input.nextLine();
                    if(!judgeOfData(x) || !judgeOfData(y) || !judgeOfData(z)) {
                        // 如果第一个为FALSE,第二个则不再执行,所以如果两个输入都非法,
                        // 那么只会显示第一个非法值的数值
                        break;
                    }
                    if(x + y > z && x - y < z && y - x < z && x + z > y && x - z < y
                            && z - x < y && y + z > x && y - z < x && z - y < x) {
                        coordinates[i] = new Triangle(x,y,z);
                        System.out.printf("三角形面积:%4.2f\n",coordinates[i].getArea());
                        System.out.printf("三角形周长:%4.2f\n",coordinates[i].getPerimeter());
                        break;
                    }
                    else{
                        System.out.printf("边%d、 %d、 %d、不能组成三角形\n",x,y,z);
                        break;
                    }
                }
                default: {
                    System.out.printf("%d为非法输入\n",judgeOfShape);
                }
            }
        }
    }
}
class Coordinate implements Shape {
    long x;
    long y;
    Coordinate(long x, long y) {
        this.x=x;
        this.y=y;
    }

    @Override
    public double getArea() {
        return 0;
    }

    @Override
    public double getPerimeter() {
        return 0;
    }
}

interface Shape{
    double getArea();//面积
    double getPerimeter();//周长
}

class Rectangle extends Coordinate implements Shape{
    /**矩形类用xy做长和宽*/
    Rectangle(long x,long y){
        super(x,y);
    }
    @Override
    public double getArea(){
        return (double)(this.x*this.y);
    }

    @Override
    public double getPerimeter() {
        return (double)(2*(this.x+this.y));
    }
}

class Circle extends Coordinate implements Shape{
    /**圆形类,xy表示圆心坐标,另外设radius表示半径长度*/
    private long radius;
    Circle(long x,long y,long radius){
        super(x,y);
        this.radius = radius;
    }

    @Override
    public double getArea() {
        return  Math.PI * (double)this.radius * (double)this.radius;
    }

    @Override
    public double getPerimeter() {
        return Math.PI * 2.0 * (double)this.radius;
    }
}
class Triangle extends Coordinate implements Shape{
    /**三角形类,xyz三条边长度*/
    private long z;
    Triangle(long x,long y,long z){
        super(x,y);
        this.z = z;
    }

    @Override
    public double getArea() {
        //海伦公式
        double p =(double)(this.x+this.y+this.z)/2.0;
        return Math.sqrt(p * (p - (double) this.x) * (p - (double) this.y) * (p - (double) this.z));
    }

    @Override
    public double getPerimeter() {
        return (double)(this.x+this.y+this.z);
    }
}

选择图形的非法输入情况:
在这里插入图片描述

对矩形(包含输入数据的非法输入情况):
在这里插入图片描述

在这里插入图片描述
对圆形(包含输入数据的非法输入情况):
在这里插入图片描述
在这里插入图片描述
对三角形(包含输入数据的非法输入情况):
在这里插入图片描述
5、包的定义和使用
 创建自定义包Mypackage
在存放源程序的文件夹中建立一个子文件夹 Mypackage。例如,在“E:\java\程序”文件夹之中创建一个与包同名的子文件夹 Mypackage(E:\java\程序\Mypackage),并将编译过的 class 文件放入该文件夹中。注意:包名与文件夹名大小写要一致。再添加环境变量 classpath 的路径,例如:E:\j2sdk1.4.2_01\lib; E:\java\程序
 在包中创建类
YMD.java 程序功能:在源程序中,首先声明使用的包名Mypackage,然后创建YMD 类,该类具有计算今年的年份并输出一个带有年月日的字符串的功能。源代码如下:
在这里插入图片描述

编译Test_YMD.java文件,然后将Test_YMD.class文件存放到Mypackage文件夹中。
 编写使用包Mypackage中Test_YMD类的程序
YMD_2.java程序功能:给定某人姓名与出生日期,计算该人年龄,并输出该人姓名,年龄,出生日期。程序使用了Test_YMD的方法来计算年龄。源代码如下:
在这里插入图片描述
编译并运行程序。
在这里插入图片描述

package Ex2.Mypackage;

import java.util.Calendar;

/**
 * @author 15328
 */
public class Test_YMD {
    private int year,month,day;
    public static void main(String[] args) {

    }
    public Test_YMD(int y,int m,int d){
        year = y;
        month = (((m >= 1) & (m <= 12)) ? m : 1);
        day = (((d >= 1) & (d <= 31)) ? d : 1);
    }
    public Test_YMD(){
        this(0,0,0);
    }
    public static int thisyear(){
        return Calendar.getInstance().get(Calendar.YEAR);
        //返回当年的年份
    }
    public int year(){
        return year;
        //返回年份
    }
    @Override
    public String toString(){
        return year + "-" + month + "-" + day;
    }
}

package Ex2.Mypackage;

/**
 * @author 15328
 */
public class YMD_2 {
    private String name;
    private Test_YMD birth;

    public static void main(String[] args) {
        YMD_2 a = new YMD_2("张弛", 1900, 1, 11);
        a.output();
    }
    public YMD_2(String n1,Test_YMD d1){
        name = n1;
        birth = d1;
    }
    public YMD_2(String n1,int y,int m,int d){
        this(n1,new Test_YMD(y,m,d));
        //初始化变量与对象
    }
    public int age(){
        return Test_YMD.thisyear()- birth.year();
        //返回当前年与出生年的差即年龄
    }
    public void output(){
        System.out.println("姓名:" + name);
        System.out.println("出生日期:" + birth.toString());
        System.out.println("今年年龄:" + age());
    }
}

在这里插入图片描述

1.编写MyDate.java 2.该有如下构造方法 2.1 无参数构造方法public MyDate(),以当前的系统时间构造MyDate对象 2.2 public MyDate(int year, int month, int day), 以指定的年日构造MyDate对象 3.该有如下属性 3.1 private int year ;//年 3.2 private int month; // 3.3 private int day; //日 4.该有如下方法 4.1 public String after(int day); //返回当前对象代表的日期之后day天的日期,比如当前对象是2008-8-8,调用after(5)以后,应该返回2008-8-13,格式可自定义 4.2 public String before(int day); //返回当前对象代表的日期之前day天的日期,比如当前对象是2008-8-8,调用before(5)以后,应该返回2008-8-3,格式可自定义 4.3 public void setYear(int year); //设置年为指定值year 4.4 public void setMonth(int month); //设置为指定值month 4.5 public void setDay(int day); //设置日为指定值day 4.6 public int getYear(); //返回当前对象的年 4.7 public int getMonth(); //返回当前对象的 4.8 public int getDay(); //返回当前对象的日 4.9 public void set (int year, int month, int day); //设置年、、日为指定的值year、month、day 4.10 public String toString();//以字符串形式返回当前对象的年日,例如2008年0808日,格式可自定义 4.11 public boolean equals(MyDate mydate);//当前对象与另一个对象比较,如果两个对象的年日均相等,则返回true,反之返回false 5.编写TestMyDate.java,在main方法中对MyDate的各个方法进行测试 6.按照编程规范为MyDate.java编写规范的代码 7.按照java doc API的要求,对代码编写规范的注释,然后利用javadoc.exe命令生成MyDate.java的API doc 8.撰写上机报告
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值