需求概述
为某音像店开发一个迷你DVD管理器,实现DVD碟片的管理,主要包括如下功能。
1.新增DVD。
2.查看DVD。
3.删除DVD。
4借出DVD。
5.归还DVD。
项目的运行结果如图所示。
项目需求
用例1:数据初始化
1. 创建项目MiniDvd,创建类DVDSet,添加三个属性:DVD名称(name)、DVD借出状态(state)、DVD借出时间(date),参考问题分析1。
2.创建类 DVDMgr,创建 DVDSet 对象 dvd,实现初始化数据的方法initial(),初始化 三章DVD碟片信息。例如下表表所示的数据。
提示:
public class DVDMgr{
// 创建DVD对象
DVDSet dvd = new DVDSet();
// 初始化三张DVD信息
public void initial(){ //
dvd.name[0]= "罗马假日";
dvd.state[0]=0;
dvd.date[0]= "2012-2-1";
dvd.name[1]="风声鹤唳";
dvd.state[1]=1;
dvd.name[2]= "浪漫满屋";
dvd.state[2]=1;
}
}
用例2:实现菜单切换
编写程序入口,实现菜单显示和菜单的切换,如图所示。
提示:
基本操作步骤如下。
(1) 在类DVDMgr中创建方法startMenu(),利用switch选择结构实现菜单的切换。switch(choice){
case 1:
System.out.println("此处实现新增DVD"); System.out.println("*******************************"); returnMain(); break;
// ......
}
(2) 在类DVDMgr中创建returnMain()方法,实现返回主菜单。
public void returnMain(){
Scanner input = new Scanner(System.in);
System.out.print("输入0返回");
if(input.nextInt()==0){
startMenu();
}else{
System.out.println("输入错误,异常终止!");
}
}
(3) 编写类Start,实现程序入口。
DVDMgr dm = new DVDMgr(); dm.initial(); dm.startMenu();
用例3:实现查看DVD信息
编写方法search(),遍历dvd对象数组,获取数组元素信息,并进行显示,如图所示。
提示:
利用for循环遍历dvd数组,根据对状态的判断,显示借出与否的状态。
for(int i=0;i<dvd.name.length;i++){
if(dvd.name[i]==null){
break;
}else if(dvd.state[i]==0){
System.out.println((i+1)+"\t已借出\t"+"<<"+dvd.name[i]+">> \t"+dvd.date[i]);
}else if(dvd.state[i]==1){
System.out.println((i+1)+"\t可借\t"+"<<"+dvd.name[i]+">>");
}
}
用例4:实现新增DVD信息
编写方法add(),向dvd数组增加一条DVD信息,实现新增DVD信息,如图所示。
提示:
利用for循环遍历dvd数组,获取dvd数组中第一个name为null的位置并运行添加。
用例5:实现删除DVD信息
编写方法delete(),业务要求如下。
1. 根据用户要删除的 DVD 名称,遍历 dvd 数组进行查找并删除。删除该元素后,后面的元 素依次前移一位,如图15.5所示。
2. 如果DVD为借出状态,不允许删除,如图所示。
提示:
利用for循环遍历dvd数组,进行查找。
//遍历数组,查找匹配信息
for(int i = 0 ; i < dvd.name.length; i++){
//查找到,每个元素前移一位
if(dvd.name[i]!=null &&dvd.name[i].equalsIgnoreCase(name)&&dvd.state[i]==1){
int j=i;
while(dvd.name[j+1]!=null){
dvd.name[j]=dvd.name[j+1];
dvd.state[j]=dvd.state[j+1];
dvd.date[j]=dvd.date[j+1];
j++;
}
//最后一个不为空的元素置空
dvd.name[j]=null;
dvd.date[j]=null;
System.out.println("删除《"+name+"》成功!");
flag=true;//置位,表示删除成功
break;
}elseif(dvd.name[i]!=null&&dvd.name[i].equalsIgnoreCase (name)&&dvd.state[i]==0){
System.out.println("《"+name+"》为借出状态,不能删除!"); flag=true;//置位
break;
}
}
用例6:实现借出DVD的业务处理
编写方法lend(),实现借出DVD,如图所示。
提示:
首先利用for循环遍历dvd数组,查找是否存在该dvd,根据状态进行相应的业务处理。
for(int i = 0; i < dvd.name.length; i++){
if(dvd.name[i] == null){
//无匹配
System.out.println("没有找到匹配信息!");
break;
}else if(dvd.name[i].equals(want)&& dvd.state[i]==1){
//找到匹配可借
dvd.state[i] = 0;
System.out.print("请输入借出日期(年-月-日):");
dvd.date[i]=input.next();
System.out.println("借出《"+want+"》成功!");
break;
}else if(dvd.name[i].equals(want)&& dvd.state[i]==0){
//找到匹配已被借出
System.out.println("《"+want+"》已被借出!");
break;
}
}
用例7:实现归还DVD的业务处理
编写方法returnDvd(),实现归还DVD,并计算租金(1元/天),
提示:
借出日期利用“年-月-日”的字符串形式保存,计算两个此种形式的日期差参考如下代码。
/**
* 计算日期差
* @param dstr1 第一个日期
* @param dstr2 第二个日期
*
*/
public long charge(String dstr1,String dstr2){
long charge=0;
SimpleDateFormat sd=new SimpleDateFormat("yyyy-MM-dd");
try {
Date d1=sd.parse(dstr1);
Date d2=sd.parse(dstr2);
charge=(d2.getTime()-d1.getTime())/(24*60*60*1000);
} catch (ParseException e) {
e.printStackTrace();
}
return charge;
}
用例8:实现借出排行榜
此功能为扩展功能。要求增加菜单项“借出排行榜”,实现借阅次数以从大到小的顺序显示借 出排行榜,如图所示。
提示: 实现思路及参考如下。
(1) 在DVDSet中添加一个属性count,用来记录借出次数。
(2) 在方法initial()中增加初始化数据。
(3) 编写方法 list(),定义两个数组,将name 和count 的值赋予新数组,利用排序算法 是吸纳排行榜。
(4) 修改方法lend(),每次借出成功后,count次数增加1。