DVD各个功能的实现,带讲解

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

DVD各个功能的实现

  • 前言
  • 一、准备工作
    • (1)管理器中的DVD具有哪些属性
    • (2)DVD的这些属性需要用什么类型的数组来储存
    • (3)创建类,将以上数组写到类里
  • 二、各个功能的实现
    • 1.将Dvd类实例化,使用Dvd类中的数据
    • 2.书写第一个功能---菜单
    • 3.数据初始化
    • 4.输入0返回首页
    • 5.查看DVD
    • 6.新增DVD
    • 7.给定元素和目标数组,在目标数组中查找该元素,返回下标
    • 8.借出DVD
    • 9.计算日期差
    • 10.归还DVD
    • 11.热度排行榜
  • 总结


前言

为某音像店开发一个迷你DVD管理器,实现DVD碟片的管理,包括如下功能:
1.新增DVD
2.查看DVD
3.删除DVD
4.借出DVD
5.归还DVD(归还并计算租金)
6.热度排行榜
7.退出


一、准备工作

需求分析:音像店如果要使用这个系统,一定是有很多张DVD需要储存,所以应该使用数组来存储DVD的各个属性

(1)管理器中的DVD具有哪些属性

序号,名称,日租金,当前状态,出街日期,出借次数

(2)DVD的这些属性需要用什么类型的数组来储存

    int[] num = new int[50];				//存储序号
    String[] name = new String[50];			//存储名称
    int[] money = new int[50];				//存储日租金
    String[] state = new String[50];		//存储当前状态
    String[] date = new String[50];			//存储借出日期
    int[] times = new int[50];				//存储出借次数

(3)创建类,将以上数组写到类里

public class Dvd {
    int[] num = new int[50];
    String[] name = new String[50];
    int[] money = new int[50];
    String[] state = new String[50];
    String[] date = new String[50];
    int[] times = new int[50];
}

二、各个功能的实现

1.将Dvd类实例化,使用Dvd类中的数据

public class DvdMar {
    Dvd d = new Dvd();
    

}

2.书写第一个功能—菜单

思路:将以上含有的功能展示给用户,让用户进行选择,等值选择,用到switch选择结构,调用Scanner类获取用户在键盘上输入的值进行判断

public class DvdMar {
    Dvd d = new Dvd();
    Scanner input = new Scanner(System.in);
}

将Scanner实例化写到类里,接下来都要与用户交互,要多次使用,这样可以省时省力

 //菜单:
    public void menu() {
        System.out.println("欢迎使用迷你DVD管理系统");
        System.out.println("-------------------------");
        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("--------7.退    出---------");
        System.out.println("----------------------------");
        System.out.print("请选择(1-7):");
        int id = input.nextInt();
        switch (id) {
            case 1:
                System.out.println("----->新增DVD");
                add();
                break;
            case 2:
                System.out.println("----->查看DVD");
                look();
                break;
            case 3:
                System.out.println("----->删除DVD");
                delete();
                break;
            case 4:
                System.out.println("----->借出DVD");
                lend();
                break;
            case 5:
                System.out.println("----->归还DVD");
                try {
                    returnDvd();
                } catch (ParseException e) {
                    e.printStackTrace();
                }
                break;
            case 6:
                System.out.println("----->热度排行榜");
                topDVD();
                break;
            case 7:
                System.out.println("-----谢谢使用!-------");
                break;
            default:
                System.out.println("选择错误,请重新选择!!!");
                menu();
        }

    }

如果对一个崭新的项目不熟悉,不建议直接写方法名,先将各个部分用输出语句代替,再将一个个方法都实现后,将方法名补全到选择里

3.数据初始化

 //数据初始化:
    public void init() {
        d.num[0] = 1;
        d.name[0] = "三国演义";
        d.money[0] = 6;
        d.state[0] = "可借";
        d.date[0] = "          ";
        d.times[0] = 15;

        d.num[1] = 2;
        d.name[1] = "西游记";
        d.money[1] = 3;
        d.state[1] = "不可借";
        d.date[1] = "2024-1-1";
        d.times[1] = 65;

        d.num[2] = 3;
        d.name[2] = "红楼梦";
        d.money[2] = 4;
        d.state[2] = "可借";
        d.date[2] = "          ";
        d.times[2] = 33;

        d.num[3] = 4;
        d.name[3] = "水浒传";
        d.money[3] = 4;
        d.state[3] = "不可借";
        d.date[3] = "2024-4-1";
        d.times[3] = 34;
    }

4.输入0返回首页

public void back() {
        System.out.println("----输入0返回首页----");
        if (input.nextInt() == 0) {
            menu();
        } else {
            System.out.println("输入错误请重新输入!!!");
            back();
        }
    }

这里没什么好说的,与用户交互引导用户输入0返回菜单,用在我们每一个功能实现之后,这里我做的效果是,如果你输入的不是0,那你就一直重新输入

5.查看DVD

public void look() {
        System.out.println("序号\t\t名称\t\t日租金\t\t状态\t\t借出日期\t\t出借次数");
        for (int i = 0; i < d.num.length; i++) {
            if (d.name[i] != null) {
                System.out.println(d.num[i] + "\t\t" + d.name[i] + "\t\t" + d.money[i] + "\t\t"
                        + d.state[i] + "\t\t" + d.date[i] + "\t" + d.times[i]);
            }
        }
        back();
    }

这里面需要注意,我用了一个if-else语句来判断一下DVD名是不是空的,如果是空的不输出,这样就实现了隐藏那些还没有写数据的空位置

6.新增DVD

 public void add() {
        int index = -1;
        for (int i = 0; i < d.name.length; i++) {
            if (d.name[i] == null) {
                index = i;
                break;
            }
        }

        if (index == -1) {
            System.out.println("内存已满,添加失败!!!");
        } else {
            System.out.println("请输入新增DVD的名字:");
            d.name[index] = input.next();
            System.out.println("请输入新增DVD的日租金:");
            d.money[index] = input.nextInt();
            d.state[index] = "可借";
            d.num[index] = index + 1;
            d.date[index] = "          ";
            System.out.println("添加成功!!!");
        }
        back();
    }

思路:首先我要向里面添加数据,一定得先找到数据为空的那一行,我们就先定义一个index来接收返回的下标,然后遍历数组,用if语句判断,如果为空,返回下标,跳出循环,再利用拿到的下标,向该下标对应的各个属性的位置添加数据,有一个细节,我们在定义index的时候初始值为-1,如果遍历完,index的值还是-1,那么就代表没有空的位置,此时提示用户内存已满,添加不了,否则可以进行添加,最后添加成功之后调用刚写的输入0返回首页方法。

7.给定元素和目标数组,在目标数组中查找该元素,返回下标

public int find(String name, String[] names) {
        int index = -1;
        for (int i = 0; i < names.length; i++) {
            if (name.equals(names[i])) {
                index = i;
                break;
            }
        }
        return index;
    }

思路:后面删除,借出,归还都要通过DVD名称来找到下标,这时候写一个这样的方法,提高代码的简洁程度。

8.借出DVD

public void lend(){
        System.out.println("请输入借出DVD的名称:");
        String lName = input.next();
        int index = find(lName,d.name);
        if (index == -1){
            System.out.println("没有找到此张DVD");
        }else{
            if (d.state[index] == "不可借"){
                System.out.println("这张DVD已经被借走了!");
            }else{
                System.out.println("请输入借出日期(xxxx-YY-zz):");
                d.date[index] = input.next();
                d.times[index]++;
                d.state[index] = "不可借";
                System.out.println("借出登记成功!!!");
            }
        }
        back();
    }

思路:调用find()方法查找用户想要删除DVD的下标,拿到下标后先判断是否有这个DVD,如果是-1就没有,如果不是-1就有,再判断状态,如果是不可借,证明DVD已被借走,否则就是可借,然后添加一系列借出的操作

9.计算日期差

public long mutilDate(String date,String rDate) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date date1 = sdf.parse(date);
        Date date2 = sdf.parse(rDate);
        long time1 = date1.getTime();
        long time2 = date2.getTime();
        long mutil = (time2 - time1) / (1000 * 60 * 60 * 24);

        return mutil;
    }

这里具体的思路,使用步骤,异常处理,本人另发过一篇专门的文章讲解

10.归还DVD

public void returnDvd() throws ParseException {
        System.out.println("请输入归还DVD的名称:");
        String rName = input.next();
        int index = find(rName,d.name);
        if (index == -1){
            System.out.println("这张DVD不是本店的!!!");
        }else{
            if ("可借".equals(d.state[index])){
                System.out.println("这张DVD不是本店的!!!!");
            }else{
                System.out.println("请输入归还日期:");
                String rDate = input.next();
                long cust = mutilDate(d.date[index],rDate) * d.money[index];
                System.out.println("您所需要花费的金额为:" + cust);
                System.out.println("归还成功!!!!!");
                d.date[index] = "          ";
                d.state[index] = "可借";
            }
        }
        back();
    }

思路:归还操作与借出操作大致相同,添加了一块是花费金额的部分,这里需要注意,我写的方法中含有SimpleDateFormat的部位都没先处理,都先抛出去了,在最后的部分菜单的位置处理的

11.热度排行榜

 public void topDVD(){
        String[] newName = new String[d.name.length];
        int[] newTimes = new int[d.times.length];
        for (int i = 0;i < newName.length;i++){
            newName[i] = d.name[i];
            newTimes[i] = d.times[i];
        }

        for (int i = 0;i < newName.length - 1;i++){
            for (int j = 0;j < newTimes.length - 1;j++){
                if (newTimes[j] < newTimes[j + 1]){
                    int temp = newTimes[j];
                    newTimes[j] = newTimes[j + 1];
                    newTimes[j + 1] = temp;

                    String temp1 = newName[j];
                    newName[j] = newName[j + 1];
                    newName[j + 1] = temp1;
                }
            }
        }
        System.out.println("DVD名\t\t\t热度");
        System.out.println("-----------------------");
        for (int i = 0;i < newTimes.length;i++){
            if (newName[i] != null){
                System.out.println(newName[i] + "\t\t\t" + newTimes[i]);
            }
        }
        back();
    }

思路:如果直接排序会打乱原有的数据在数组中的顺序,所以就新建了两个数组,复制过来数据后再进行排序,最后输出排序后的新数组,这样就两不干扰,其中用了冒泡排序,冒泡排序具体的使用也发过一篇专门的文章来讲解,注意如果你跟我一样,也是三个类,再测试类中容易会出现的错误就是排完序之后,排列的都是地址值,并没有数据,这个时候我们在第三个类不仅要实例化这个方法类,还要添加一句Dvd d = dvd.d;,这样就不会将地址值复制过去了,如果有这种错误的可以再温习一下数据结构,堆栈空间分别存储的功能

public class Test {
    public static void main(String[] args) {
        DvdMar dvd = new DvdMar();
        Dvd d = dvd.d;
        dvd.init();
        dvd.menu();
    }
}

总结

以上就是DVD项目所有的代码以及思路,注意,再测试类中运行前,一定要先初始化,项目非固定答案,可以根据自己的想法进行修改,我这种也不是最优解,但是会好理解一点。
还是,如果这篇文章对你有帮助的话,帮忙三连可好 =v=

  • 22
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值