提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
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=