Java程序小设计

目录

设计要求

1、设计疫苗类Vaccines,其属性有疫苗总针数、接种日期、疫苗批号、生产企业、接种单位,有一个带有属性相应类型5个参数的构造方法,可以实现在实例化对象的时候直接赋值。

2、设计个人类Person,其属性有姓名、身份证号、电话号码、工作单位、户籍地址、现居住地址、接种的疫苗,其中接种的疫苗为一个Vaccines类型的数组,因现今已有疫苗最多需接种3针,故可指定此数组长度为3。此类具有以下方法:

(1)录入个人信息方法inputInfo(),此方法包含与Person的6个属性类型一致的6个参数,可以实现类相应属性的值设定。
(2)输出个人信息方法outputInfo(),用于显示个人的姓名、身份证号、电话号码、工作单位、户籍地址、现居住地址信息,以及个人的性别和出生日期。
(3)根据身份证号生成性别方法genSex(),根据身份证号码的第十七位判断性别,如果为奇数则为男性,偶数则为女性。
(4)根据身份证号计算年龄方法genAge(),提示可用substring(int,int)方法获取身份证相应位数字,可用Integer.parseInt()方法将其转化为整数进行计算。
(5)根据身份证号生成出生日期方法genBirthDate(),18位身份证号码:第7、8、9、10位为出生年份(四位数),第11、第12位为出生月份,第13、14位代表出生日。
(6)接种疫苗方法haveVac(Vaccines vac),此方法首先需对未满18岁人群进行限制,并给出提示信息。然后按照所接种疫苗的总针数循环遍历接种的疫苗数组,找到对应的空位进行赋值、提示接种信息并打印接种凭证信息。最后还需要判断如果已打够总针数要求,则提示无需再次接种。
(7)打印接种凭证方法showProof(Vaccines vac),显示接种日期、疫苗批号、生产企业、接种单位和疫苗需接总针数。
3、设计测试类TestVac,实例化Person对象,提示并接收键盘输入的姓名、身份证号、电话号码、工作单位、户籍地址和现居住地址,然后输出显示个人信息。可以多次进行提示并接收键盘输入的疫苗总针数、疫苗批号、生产企业和接种单位,然后完成接种。

3.设计测试类完成调用测试。

按照上面的要求,和实际代码,大致整理可以得到如下关系。
Java程序小设计

这样一来一个完整的关系就理清楚了。
我们发现疫苗类,只需要负责数据属性的保存即可。
而我们的Person类,则需要对自己的信息写入,同时写入疫苗的信息,并进行绑定为到实例出的对象。
这里的绑定我们通过一个数组来完成。

Vaccine类

这个就是单纯的数据记录,设置属性就好了。

package Vaccines;


public class Vaccines {

    public Vaccines(){

    }

    /*疫苗总针数、接种日期、疫苗批号、生产企业、接种单位 */


    public Vaccines(int vaccines_ZhenShu, String jieZhong_Time, String vaccines_PiHao, String making_Com,
            String jieZhong_Dan_Wei) {
        //构造方法,传入五个参数
        
        
        Vaccines_ZhenShu = vaccines_ZhenShu;
        JieZhong_Time = jieZhong_Time;
        Vaccines_PiHao = vaccines_PiHao;
        Making_Com = making_Com;
        JieZhong_Dan_Wei = jieZhong_Dan_Wei;

    }

    private int Vaccines_ZhenShu;

    private String JieZhong_Time ;

    private String Vaccines_PiHao;

    private String Making_Com;

    private String JieZhong_Dan_Wei;


    public int getVaccines_ZhenShu() {

        return this.Vaccines_ZhenShu;

    }

    public void setVaccines_ZhenShu(int vaccines_ZhenShu) {

        this.Vaccines_ZhenShu = vaccines_ZhenShu;
    }

    public String getJieZhong_Time() {
        //获取时间,算了,不需要自动获取时间是吧
        // if (this.JieZhong_Time !=null){

        // }else{
        //     Date date = new Date();
        //     this.JieZhong_Time = "接种日期:"+date;

        // }
        return this.JieZhong_Time;

    }

    public void setJieZhong_Time(String jieZhong_Time) {

        this.JieZhong_Time = jieZhong_Time;

    }


    public String getVaccines_PiHao() {

        return this.Vaccines_PiHao;
    }

    public void setVaccines_PiHao(String vaccines_PiHao) {

        this.Vaccines_PiHao = vaccines_PiHao;

    }

    public String getMaking_Com() {

        return this.Making_Com;

    }

    public void setMaking_Com(String making_Com) {

        this.Making_Com = making_Com;

    }

    public String getJieZhong_Dan_Wei() {

        return this.JieZhong_Dan_Wei;

    }

    public void setJieZhong_Dan_Wei(String jieZhong_Dan_Wei) {

        this.JieZhong_Dan_Wei = jieZhong_Dan_Wei;
    }


    
}

Person类成员属性

    private String sex;
    private int age;
    private String Name;
    private String ID;
    private String Phone_number;
    private String Working_place;
    private String Birt_place;
    private String Living_place;
    private List<Vaccines> Vaccines_real = new ArrayList<Vaccines>();//已经接种的疫苗这里使用泛型的列表
    //private Vaccines[] Vaccines_real;使用疫苗组也行


    int JieZHong_num; //接种次数,接种三次需要


/**---------------------get/set方法-------------------------------*/
    public String getName() {
        return Name;
    }
    public void setName(String name) {
        this.Name = name;
    }
    public String getID() {
        return ID;
    }
    public void setID(String iD) {
        this.ID = iD;
    }
    public String getPhone_number() {
        return Phone_number;
    }
    public void setPhone_number(String phone_number) {
        Phone_number = phone_number;
    }
    public String getWorking_place() {
        return Working_place;
    }
    public void setWorking_place(String working_place) {
        Working_place = working_place;
    }
    public String getBirt_place() {
        return Birt_place;
    }
    public void setBirt_place(String birt_place) {
        Birt_place = birt_place;
    }
    public String getLiving_place() {
        return Living_place;
    }
    public void setLiving_place(String living_place) {
        Living_place = living_place;
    }
    public List<Vaccines> getVaccines_real() {
        return Vaccines_real;
    }
    public void setVaccines_real(List<Vaccines> vaccines_real) {
        Vaccines_real = vaccines_real;
    }

    public String getSex() {
        return this.sex;
    }
    public void setSex(String sex) {

        this.sex = sex;
    }
    public int getAge() {
        return this.age;
    }
    public void setAge(int age) {
        this.age = age;
    }

我们注意到一个JieZHong_num这个是用来记录当前,这个人扎了多少针的。

Person的信息录入

public void inputInfo(){

        Scanner in = new Scanner(System.in);
        //接下来按照顺序录入个人信息。
        //姓名、身份证号、电话号码、工作单位、户籍地址、现居住地址、接种的疫苗
        System.err.println("请依次输入姓名、身份证号、电话号码、工作单位、户籍地址、现居住地址、接种的疫苗");
        for(int i=0; i<50;i++){
            System.out.print("--");

        }
        System.err.println("");

        System.out.print("请输入姓名:");
        this.setName(in.next());
        
        this.ID_setting();

        System.out.print("请输入电话号码:");
        this.setPhone_number(in.next());
        System.out.print("请输入工作单位:");
        this.setWorking_place(in.next());
        System.out.print("请输入户籍地址:");
        this.setBirt_place(in.next());
        System.out.print("请输入现居住地址");
        this.setLiving_place(in.next());
        // in.close();
        for(int i=0;i<50;i++){
            System.out.print("-");
        }
        System.out.println("");
        this.outputInfo();

    }

这里注意到一个方法
Java程序小设计
这方法就是用来限制身份证输入的,用来检测身份证输入长度。

  public void ID_setting(){
        //录入身份证号码,这个必须要18为数字,所以特地限制一下
        Scanner in = new Scanner(System.in);
        System.out.print("请输入身份证号码:");
        String ID = in.next();
        if (ID.length()!=18){
            System.out.println("身份证号码输入异常,请重新输入!");
            this.ID_setting();
        }
        else{
            this.setID(ID);
        }
    

    }

年龄与出生日期与性别的获取

这个主要就是根据身份证号码来的,所以我说那个号码必须要限制。
年龄获取

    public void genAge(){

        
        Date date = new Date();//获取当前日期
        int birth_year = Integer.parseInt(this.getID().substring(6,10));//截取出生日期[6,10)
        int this_yes = Integer.parseInt(date.toString().substring(24, 28));//截取当前年份
        this.setAge(this_yes-birth_year);
    }

出生日期获取

    public String genBirthDate(){

        //获得出生日期,直接返回一个出生日期值
        String BirthDate = this.getID().substring(6,10)+"年"+this.getID().substring(10,12)
        +"月"+this.getID().substring(12,14)+"日";

        return BirthDate;

    }

性别获取

    public void genSex(){
        //获得性别没有返回值,要先调用一下
        
        int sex_num=Integer.parseInt(this.getID().substring(16,17));
        if(sex_num % 2==0){
            this.setSex("女");
        }
        else{
            this.setSex("男");
        }

    }

Integer.parseInt()方法可以把string转化为int类型,当然你可以强制类型转换(int)this.getID().substring(16,17)

疫苗注射次数限制

这个其实和先前的那个身份证的限制的类似。
Java程序小设计

显示剩余需要注射次数

这个就和疫苗注射的次数有关了,代码如下:
Java程序小设计

Person类完整代码

package Person;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Scanner;
import Vaccines.Vaccines;


/**
 * 
 * 所有的scanner类共享一个输入流,当其中一个调用关闭函数的时候,所有的scanner对象都关闭了。
 * 所以,那个关闭scanner的警告不要理会他,
 */




public class Person {
    
    //姓名、身份证号、电话号码、工作单位、户籍地址、现居住地址、接种的疫苗

    private String sex;
    private int age;
    private String Name;
    private String ID;
    private String Phone_number;
    private String Working_place;
    private String Birt_place;
    private String Living_place;
    private List<Vaccines> Vaccines_real = new ArrayList<Vaccines>();//已经接种的疫苗这里使用泛型的列表
    //private Vaccines[] Vaccines_real;使用疫苗组也行

    int JieZHong_num; //接种次数,接种三次需要

    public String getName() {
        return Name;
    }
    public void setName(String name) {
        this.Name = name;
    }
    public String getID() {
        return ID;
    }
    public void setID(String iD) {
        this.ID = iD;
    }
    public String getPhone_number() {
        return Phone_number;
    }
    public void setPhone_number(String phone_number) {
        Phone_number = phone_number;
    }
    public String getWorking_place() {
        return Working_place;
    }
    public void setWorking_place(String working_place) {
        Working_place = working_place;
    }
    public String getBirt_place() {
        return Birt_place;
    }
    public void setBirt_place(String birt_place) {
        Birt_place = birt_place;
    }
    public String getLiving_place() {
        return Living_place;
    }
    public void setLiving_place(String living_place) {
        Living_place = living_place;
    }
    public List<Vaccines> getVaccines_real() {
        return Vaccines_real;
    }
    public void setVaccines_real(List<Vaccines> vaccines_real) {
        Vaccines_real = vaccines_real;
    }

    public String getSex() {
        return this.sex;
    }
    public void setSex(String sex) {

        this.sex = sex;
    }
    public int getAge() {
        return this.age;
    }
    public void setAge(int age) {
        this.age = age;
    }


    public void ID_setting(){
        //录入身份证号码,这个必须要18为数字,所以特地限制一下
        Scanner in = new Scanner(System.in);
        System.out.print("请输入身份证号码:");
        String ID = in.next();
        if (ID.length()!=18){
            System.out.println("身份证号码输入异常,请重新输入!");
            this.ID_setting();
        }
        else{
            this.setID(ID);
        }
    

    }


    //录入个人信息方法inputInfo(),此方法包含与Person的6个属性类型一致的6个参数,可以实现类相应属性的值设定。
    
    public void inputInfo(){

        Scanner in = new Scanner(System.in);
        //接下来按照顺序录入个人信息。
        //姓名、身份证号、电话号码、工作单位、户籍地址、现居住地址、接种的疫苗
        System.err.println("请依次输入姓名、身份证号、电话号码、工作单位、户籍地址、现居住地址、接种的疫苗");
        for(int i=0; i<50;i++){
            System.out.print("--");

        }
        System.err.println("");

        System.out.print("请输入姓名:");
        this.setName(in.next());
        
        this.ID_setting();

        System.out.print("请输入电话号码:");
        this.setPhone_number(in.next());
        System.out.print("请输入工作单位:");
        this.setWorking_place(in.next());
        System.out.print("请输入户籍地址:");
        this.setBirt_place(in.next());
        System.out.print("请输入现居住地址");
        this.setLiving_place(in.next());
        // in.close();
        for(int i=0;i<50;i++){
            System.out.print("-");
        }
        System.out.println("");
        this.outputInfo();

    }

    public void outputInfo(){
        //显示个人的姓名、身份证号、电话号码、工作单位、户籍地址、现居住地址信息,以及个人的性别和出生日期。
        System.out.println("姓名:"+this.getName());
        this.genSex();
        System.out.println("性别:"+this.getSex());
        System.out.println("出生日期:"+this.genBirthDate());
        System.out.println("身份证号:"+this.getID());
        System.out.println("工作单位:"+this.getWorking_place());
        System.out.println("户籍地址:"+this.getBirt_place());
        System.out.println("现居住地址:"+this.getLiving_place());

    }


    public void genSex(){
        //获得性别没有返回值,要先调用一下
        int sex_num=Integer.parseInt(this.getID().substring(16,17));
        if(sex_num % 2==0){
            this.setSex("女");
        }
        else{
            this.setSex("男");
        }

    }

    public void genAge(){

        //计算年龄没有返回值,要先调用一下
        Date date = new Date();
        int birth_year = Integer.parseInt(this.getID().substring(6,10));
        int this_yes = Integer.parseInt(date.toString().substring(24, 28));
        this.setAge(this_yes-birth_year);
    }

    public String genBirthDate(){

        //获得出生日期,直接返回一个出生日期值
        String BirthDate = this.getID().substring(6,10)+"年"+this.getID().substring(10,12)
        +"月"+this.getID().substring(12,14)+"日";

        return BirthDate;

    }

    public void haveVac(){

                
        for(int i=0;i<50;i++){

            System.out.print('-');

        }
        System.err.println("");


        //注射疫苗,必须要先录入个人信息才能够注射,对未满18岁人群进行限制,并给出提示信息。
        this.genAge();
        if(this.getAge()<18){
            System.out.println("您未满十八岁!请注意接种安全!");
        }
        //开始接种,输入疫苗总针数、接种日期、疫苗批号、生产企业、接种单位

        while(true) {

            if(this.JieZHong_num>=3){
                System.out.println("您已经完成了接种,无需接种了!!!");
                break;
            }



        System.out.println("请依次输入总针数(<=3)、接种日期、疫苗批号、生产企业、接种单位");
        Vaccines vaccines = new Vaccines();
        for(int i=0; i<50;i++){
            System.out.print("--");

        }
        System.out.println("");

        Scanner in = new Scanner(System.in);

        System.out.print("输入总针数:");
        int number = in.nextInt();

        if(number >3 ){
            System.out.println("针数不超过三!");
            this.haveVac();
        }
        else{

        vaccines.setVaccines_ZhenShu(number);}

        System.out.print("请输入接种日期:");
        vaccines.setJieZhong_Time(in.next());
        System.out.print("请输入疫苗批号:");
        vaccines.setVaccines_PiHao(in.next());
        System.out.print("请输入生产企业:");
        vaccines.setMaking_Com(in.next());
        System.out.print("请输入接种单位:");
        vaccines.setJieZhong_Dan_Wei(in.next());
        
        
        for(int i=0;i<50;i++){

            System.out.print('-');

        }
        System.err.println("");

        this.showProof(vaccines);
        this.JieZHong_num +=vaccines.getVaccines_ZhenShu();

        for(int i=0;i<vaccines.getVaccines_ZhenShu();i++){
        //已注射的疫苗
        this.getVaccines_real().add(vaccines);
        }
        
        System.out.println("您还需要接种"+(3-this.JieZHong_num)+"针");



        }
        

    }

    public void showProof(Vaccines vac){

        //打印接种凭证方法showProof(Vaccines vac),显示接种日期、疫苗批号、生产企业、接种单位和疫苗需接总针数。
        
        for(int i=1;i<=vac.getVaccines_ZhenShu();i++){
            System.out.println("第"+this.JieZHong_num+i+"针接种完成");
        }

        System.out.println("接种日期:"+vac.getJieZhong_Time());
        System.out.println("疫苗批号:"+vac.getVaccines_PiHao());
        System.out.println("生产企业:"+vac.getMaking_Com());
        System.out.println("接种单位"+vac.getJieZhong_Dan_Wei());
        System.out.println("接种疫苗数:"+vac.getVaccines_ZhenShu());


    }


}

测试类调用

package TestVac;

import Person.Person;


public class TestVac {

    public static void main(String[] args) {
        Person person = new Person();
        person.inputInfo();
        person.haveVac();


    }
    
}

Scanner不要关闭说明

这个也是我自己的一个问题,当时没有注意到,后面才反应过来。

所有的scanner类共享一个输入流,当其中一个调用关闭函数的时候,所有的scanner对象都关闭了。 所以,在函数里面关闭的话,全部都关闭了。那么应该将这玩意放到外面的,作为成员变量,或者静态属性。

上一篇:2.pytorch中升维度的操作及需要注意的点


下一篇:allegro-2020-11-25