迷你DVD管理器

1、开发环境

①开发语言②开发工具

2、案例覆盖的技能点

①理解程序的基本概念-----程序、变量、数据类型
②会使用顺序、选择、循环、跳转语句编写程序
③会使用数组,操作数据
④会使用方法
⑤会定义类、创建和使用对象

3、项目需求

(1) 数据初始化
① 创建项目DVDMgr,创建类DVDSet类,添加四个属性DVD名称 (name),DVD状态(state),借出日期(time),借出次数(count)注:0表示已借 1:表示可借
(2) 实现菜单切换
① 执行程序,输出系统主菜单。用户根据提示的主菜单,输入功能编号实现菜单显示和菜单的切换,具体要求如下:

  1. 当输入0-6时,输出相关的菜单项信息,如果输入的不是0-6则重复输入
  2. 显示“输入0返回”。输入0,则返回主菜单,否则退出系统,终止程序的运行,输出提示信息“谢谢使用,欢迎下次光临”。
  3. 实现借出排行榜
    ① 对所有的DVD按照借出次数进行降序排序,并显示排序后的结果,内容包括序号、DVD名称、借出次数

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

欢 迎 使 用 迷 你 DVD 管 理 器
******************************************************************
0. 借出排行榜
1. 新 增 DVD
2. 查 看 DVD
3. 删 除 DVD
4. 借 出 DVD
5. 归 还 DVD
6. 退         出 
******************************************************************
请选择: 2
---> 查看DVD
序号			状 态				名称					借出日期
1				已借出				<<罗马假日>> 			2019-7-1
2				可 借				<<风声鹤唳>>
3				可 借				<<浪漫满屋>>
******************************************************************
输入0返回:0

(4) 实现新增DVD

① 为用户显示系统中提供的DVD信息,获取新增DVD名称
② 要求用户输入DVD名称
③ 如果DVD名称已存在,则输出该DVD已存在,如果DVD名不存在,则将该DVD信息添加到数组中

欢 迎 使 用 迷 你 DVD 管 理 器
******************************************************************
0. 借出排行榜
1. 新 增 DVD
2. 查 看 DVD
3. 删 除 DVD
4. 借 出 DVD
5. 归 还 DVD
6. 退      出 
******************************************************************
请选择: 1
---> 新增DVD
请输入DVD名称: 私人定制
新增《私人定制》成功!
**************************
输入0返回:0
欢 迎 使 用 迷 你 DVD 管 理 器
******************************************************************
0. 借出排行榜
1. 新 增 DVD
2. 查 看 DVD
3. 删 除 DVD
4. 借 出 DVD
5. 归 还 DVD
6. 退         出 
******************************************************************
请选择: 3
---> 删除DVD

请输入DVD名称: <<私人定制>>
没有找到匹配信息!
******************************************************************
输入0返回:0

(6) 实现删除DVD

可以删除处于“可借”状态的DVD,具体要求如下

  1. 获取要删除的DVD名称
  2. 如果DVD不存在,则显示“没有找到匹配信息!”
  3. 如果要删除的DVD名称存在,则判断是否为可借状态,如果是可借状态则可以删除DVD信息,如果是已借状态,则显示“该DVD已借出,不能删除”
欢 迎 使 用 迷 你 DVD 管 理 器
******************************************************************
0. 借出排行榜
1. 新 增 DVD
2. 查 看 DVD
3. 删 除 DVD
4. 借 出 DVD
5. 归 还 DVD
6. 退     出 
******************************************************************
请选择: 3
---> 删除DVD

请输入DVD名称: 私人定制
删除《私人定制》成功!
******************************************************************
输入0返回:0

(7) 实现借出DVD

① 可以借出处于“可借”状态的DVD,具体要求如下:

  1. 获取要借出的DVD名称
  2. 判断该DVD是否存在,如果DVD不存在,则显示“没有找到匹配信息”
  3. 如果DVD存在,则判断借出状态,如果是可借状态,则获取借出日期,并将该DVD的状态修改为“已借”
  4. 如果DVD的状态为“已借”状态,则显示“该DVD已借出”
欢 迎 使 用 迷 你 DVD 管 理 器
******************************************************************
0. 借出排行榜
1. 新 增 DVD
2. 查 看 DVD
3. 删 除 DVD
4. 借 出 DVD
5. 归 还 DVD
6. 退     出 
******************************************************************
请选择: 4
---> 借出DVD

请输入DVD名称: 浪漫满屋
请输入借出日期(年-月-日):2019-01-07
借出《浪漫满屋》成功!
******************************************************************
输入0返回:0

(5) 实现查看DVD

① 遍历系统中已有的DVD信息,并逐条显示输出,内容包括:序号、状态、名称、借出日期
② 如果是借出状态则显示借出日期,如果是可借状态则不显示借出日期

欢 迎 使 用 迷 你 DVD 管 理 器
******************************************************************
0. 借出排行榜
1. 新 增 DVD
2. 查 看 DVD
3. 删 除 DVD
4. 借 出 DVD
5. 归 还 DVD
6. 退         出 
******************************************************************
请选择: 2
---> 查看DVD
序号	状 态	名称		借出日期
1	已借出	<<罗马假日>>		2019-7-1
2	可 借	<<风声鹤唳>>
3	已借出	<<浪漫满屋>>		2019-01-07
******************************************************************
输入0返回:0
欢 迎 使 用 迷 你 DVD 管 理 器
-------------------------------------
0. 借出排行榜
1. 新 增 DVD
2. 查 看 DVD
3. 删 除 DVD
4. 借 出 DVD
5. 归 还 DVD
6. 退         出 
******************************************************************
请选择: 2
---> 查看DVD

序号	状 态	名称		借出日期
1	已借出	<<罗马假日>>		2019-7-1
2	可 借	<<风声鹤唳>>
3	可 借	<<浪漫满屋>>
4	可 借	<<私人定制>>
******************************************************************
输入0返回:0

(8) 实现归还DVD

可以归还处于“已借”状态的DVD,具体要求如下:

  1. 获取归还的DVD名称
  2. 判断DVD是否存在,如果DVD不存在,则显示“没有找到匹配信息”
  3. 如果DVD存在,判断DVD状态,如果是“可借”状态,则显示“该DVD没有借出”
  4. 如果DVD的状态为“已借”状态,则获取“归还日期(年-月-日)”并显示“归还成功”、借出时间、归还时间
  5. 计算租金:5元/1天
欢 迎 使 用 迷 你 DVD 管 理 器
******************************************************************
0. 借出排行榜
1. 新 增 DVD
2. 查 看 DVD
3. 删 除 DVD
4. 借 出 DVD
5. 归 还 DVD
6. 退         出 
******************************************************************
请选择: 5
---> 归还DVD

请输入DVD名称: 浪漫满屋
请输入归还日期(年-月-日):2019-01-10
归还《浪漫满屋》成功!
借出日期为:2014-01-07
归还日期为:2014-01-10
******************************************************************
输入0返回:0
欢 迎 使 用 迷 你 DVD 管 理 器
******************************************************************
0. 借出排行榜
1. 新 增 DVD
2. 查 看 DVD
3. 删 除 DVD
4. 借 出 DVD
5. 归 还 DVD
6. 退         出 
******************************************************************
请选择: 2
---> 查看DVD
序号	状 态	名称		借出日期
1	已借出	<<罗马假日>>		2019-7-1
2	可 借	<<风声鹤唳>>
3	可 借	<<浪漫满屋>>
******************************************************************
输入0返回:0
欢 迎 使 用 迷 你 DVD 管 理 器
******************************************************************
0. 借出排行榜
1. 新 增 DVD
2. 查 看 DVD
3. 删 除 DVD
4. 借 出 DVD
5. 归 还 DVD
6. 退     出 
******************************************************************
请选择:6
谢谢使用!

DVD管理器实现代码如下

package dvd;
public class DvdTest {
    public static void main(String[] args) {
        DvdManager m=new DvdManager();//创建对象用的是无参构造
        m.init();//在执行菜单之前要执行初始方法,为数组赋值,不执行的话里面什么都没有
        m.menu();
        DVD d1= new DVD ("罗马假日",1, null,2);
        DVD d2 = new DVD("骨语",0, "2022-1-15",5);
        DVD[]ds = new DVD[10];//由于d1,d2设置的类型为DVD类型,所以数组用的也是DVD类型,数组中想要存储什么类型的数据就把数组定义成什么类型的
    }
}
package dvd;
//这个.java文件是用来做框架的
import java.util.Scanner;
public class DvdManager {
    //用于存储DVD类型的数据
    private DVD[] ds = new DVD[10];//为数组添加几个初始数据,将对象存储在数组中
    Scanner sc = new Scanner(System.in);//下面有好多要用直接定义成成员变量
    /*public DvdManager () {//可以用这个构造方法来替代下面初始化,在main中不用写DvdManager()
        ds [0]= new DVD("罗马假日",1,null,13);
        ds [1]= new DVD("奥特曼",0,"2022-10-10",23);
        ds [2]= new DVD("天线宝宝",1,null,15);
        ds [3]= new DVD("花园宝宝",0,"2022-10-9",25);
    }*/
    public void init(){//初始化
        //创建对象
        DVD d1 = new DVD("罗马假日", 1, null, 13);
        DVD d2 = new DVD("奥特曼", 0, "2022-10-10", 23);
        DVD d3 = new DVD("天线宝宝", 1, null, 15);
        DVD d4 = new DVD("花园宝宝", 0, "2022-10-9", 15);
        //把数据放到数组中
        ds[0] = d1;
        ds[1] = d2;
        ds[2] = d3;
        ds[3] = d4;
    }
    public void menu(){
        int back;
        do {
            System.out.println("欢迎使用迷你DVD 管理器");
            System.out.println("*****************");
            System.out.println("0、借出排行榜");
            System.out.println("1、新增DVD");
            System.out.println("2、查看DVD");
            System.out.println("3、删除DVD");
            System.out.println("4、借出DVD");
            System.out.println("5、归还DVD");
            System.out.println("6、退出");
            System.out.println("******************");
            System.out.println("请选择:");
            Scanner sc = new Scanner(System.in);
            int choise = sc.nextInt();//选择功能序号
            while (choise > 6 || choise < 0) {//如果不是0-6从新输入
                System.out.println("请输入0-6之间的选项");
                choise = sc.nextInt();
            }
            switch (choise) {//根据选择的序号执行对应的功能
                case 0:
                    rank();
                    break;
                case 1:
                    addDvd();
                    break;
                case 2:
                    query();
                    break;
                case 3:
                    delete();
                    break;
                case 4:
                    lend();
                    break;
                case 5:
                    back();
                    break;
            /*case 6:
                System.out.println("谢谢使用,欢迎下次光临");
                System.exit(0);//结束整个程序
                */
            }
            if (choise == 6) {
                System.out.println("谢谢使用,欢迎下次光临");
                break;//这个break退出的是do...while循环,不结束整个程序
            }
            System.out.println("输入0返回");
            back = sc.nextInt();
        } while (back == 0);//如果back的值为0则继续循环
        /*System.out.println("欢迎下次光临");//如果用的是case6,输出结果为谢谢使用,欢迎下次光临
         * 如果用的是if(choise==6,输出结果为,谢谢使用,欢迎下次光临,
         *                                   欢迎下次光临)*/
    }
    public void rank() {//借出排行
        int count = 0;//遍历出dvd数组中有多少个对象
        for (DVD d : ds) {
            if (d != null) {
                count++;//如果有值,count加一
            }
        }
        DVD[] dvd = new DVD[count];//根据dvd对象的个数创建一个新数组,用于数组排序,由于[count]所以不存在空数组
        System.arraycopy(ds, 0, dvd, 0, count);//将ds数组中的数据复制到新数组中
        for (int i = 0; i < dvd.length - 1; i++) {//选择排序
            for (int j = i + 1; j < dvd.length; j++) {
                dvd[i].getCount();
                if (dvd[i].getCount() < dvd[j].getCount()) {//比较的对象的借出次数
                    DVD a = dvd[i];//数据交换位置,升序
                    dvd[i] = dvd[j];
                    dvd[j] = a;
                }
            }
        }
        System.out.println("序号\t名称\t\t借出次数");//遍历排序后的数组,将数据输出
        for (int c = 0; c < dvd.length; c++) {
            System.out.println(" " + (c + 1) + "\t《" + dvd[c].getName() + "》\t" + dvd[c].getCount());
        }
    }
    public void addDvd(){//新增dvd
        System.out.println("--->新增DVD\n");
        System.out.println("请输入DVD名称:");
        String name = sc.next();
        int index = exits(name);
        if (index != -1) {
            System.out.println("该《" + name + "》已存在");
        } else {
            DVD d = new DVD(name, 1, null, 0);
            for (int i = 0; i < ds.length; i++) {
                if (ds[i] == null) {
                    ds[i] = d;
                    break;
                }
            }
            System.out.println("新增《" + name + "》成功! ");
            System.out.println("****************************");

        }
    }
    public void query(){//查询dvd
        System.out.println("--->查看DVD\n");
        System.out.println("序号\t\t状态\t\t\t名称\t\t\t日期");//遍历数组,读取数据
        for (int i = 0; i < ds.length; i++) {
            if (ds[i] != null) {//非空判断,否则出现空指针异常
            /*if(ds [i].getState()==1) {//如果状态为1可借,则没有借出日期
                System.out.println(" "+(i+1)+"\t"+"可借\t《"+ds[i].getName()+"》");
            }else{
                System.out.println(" "+(i+1)+"\t"+"己借\t《"+ds[i].getName()+"》"+ds [i].getDate ());
            }*/
                //也可以用下面的方法来查看DVD
                System.out.println(" " + (i + 1) + "\t\t" + (ds[i].getState() == 1 ? "可借" : "已借") + "\t\t《" + ds[i].getName() + "》"
                        + "\t\t" + (ds[i].getState() == 1 ? "" : ds[i].getDate()));//三元运算符
                //用ds[i]太麻烦,可以定义个变量接受DVD d=ds[i];
            }
        }
        System.out.println("*******************");
    }
    public void delete(){//删除dvd
        System.out.println("--->删除DVD\n");
        System.out.println("请输入DVD名称: ");
        String name = sc.next();
        int index = exits(name);
        if (index != -1){//判断DVD是否存在
            if (ds[index].getState() == 1){//判断状态是否是可借状态
                for (int i=index; i<ds.length-1; i++){//ds.length-1,否则越界
                    ds[i] = ds[i+1];//数据向前移动一位
                }
                ds[ds.length-1] = null;//将最后的那个数据赋值为null
                System.out.println("《"+name + "》删除成功!");
            }else{
                System.out.println("该《" + name + "》已借出,不能删除");
            }
        }else{
            System.out.println("没有找到匹配信息! ");
        }
    }
    public void lend(){//借出
        System. out.println (" --->借出DVD\n");
        System.out.println ("请输入DVD名称:Ⅰ ");
        String name = sc.next ();
        int index = exits(name);
        if(index != -1){
            if(ds [index].getState ()==1) {
                System. out.println ("请输入借出日期(年-月-日): ");
                String date = sc.next ();
                ds [index].setState (0) ;
                ds [index] .setDate (date) ;
                int count = ds [index].getCount ( )+1;
                ds [index] .setCount (count) ;
                System. out.println ("借出《"+name+"》成功!");
            }else {
                System.out.println("该《" + name + "》已借出,不能借出");
            }
        }
    }
    public void back(){//归还
        System.out.println ( "--->归还DVD\n" ) ;
        System. out.println ("请输入DVD名称: ");
        String name = sc.next ();
        int index = exits (name) ;
        if (index != -1) {//如果dvd存在,判断dvd的借出状态
            if(ds [index].getState( )==1) {
                System.out.println ("该《"+name+"》未借出,不能归还");
            }else{
                System.out.println ("请输入归还日期(年-月-日): ");
                String backDate = sc.next ( ) ;
                ds [index].setState (1);
                String lendDate = ds [index].getDate();//在借出日期初始化之前先保存
                ds [index].setDate(null);//归还后将借出日期删除,初始化
                System.out.println("《"+name+"》归还成功");
                System.out.println("借出日期为:"+lendDate);
                System.out.println("归还日期为:"+backDate);
            }
        }else{
            System.out.println ("没有找到匹配信息!");
        }
    }
        /**
         * @param name:传入的DVD名称//这是什么意思?????????????怎么弄出来的?????????
         * @return如果DVD存在,返回该DVD对应的下标,如果不存在返回-1//对应的数组练习题中有
         */
    public int exits (String name){
        int index = -1;//表示找到的下标
        for (int i = 0; i < ds.length; i++) {
            if (ds[i] != null && ds[i].getName().equals(name)) {//非空判断,否则出现空指针异常
                index = i;
                break;
            }
        }
        return index;
    }
}
package dvd;
/*
 *1、添加私有变量。2、提供get/ set方法。3、提供构造方法
 */
//对于这种只有成员变量,get/set方法,构造方法的类成为实体类
public class DVD {
    private String name;
    private int state;//dvd状态0∶已借1;可借
    private String date;
    private int count;
    public void setName(String name) {
        this.name = name;
    }
    public String getName(){
        return name;
    }
    public void setState(int state) {
        this.state = state;
    }
    public int getState(){
        return state;
    }
    public void setDate(String date){
        this.date= date;
    }
    public String getDate(){
        return date;
    }
    public void setCount(int count){
        this.count = count;
    }
    public int getCount(){
        return count;
    }
    public DVD(){}
    public DVD(String name ,int state,String date,int count) {
        this.name = name;
        this.state = state;
        this.date = date;
        this.count = count;
    }
}