Java:迷你DVD管理器
系统概述
为某音像店开发一个迷你DVD管理器,实现DVD碟片的管理,包括如下功能:
1、新增DVD
2、查看DVD
3、删除DVD
4、借出DVD
5、归还DVD
开发计划
系统开发步骤
1、明确需求
2、设计对象保存DVD信息
3、设计技术框架:采用Java技术
编码顺序
1、数据初始化
2、菜单切换
3、完成各种DVD管理操作
4、测试
界面交互设计的原则
统一性原则
界面风格统一:用相同方式展现相同类型的数据,如:日期类型
交互风格统一:用相同方式完成相同类型的操作,如:录入日期
美观性原则
界面美观大方
易用性原则
操作方式自然、易理解
理解业务
1、如何保存DVD信息 ?
使用数组对象保存DVD信息 !
每张DVD的信息都包括名称、是否可借的状态以及借出的日期
包含多张DVD。
2、如何访问DVD信息?
创建DVD对象数组dvd后,访问第i+1张DVD信息
名称:dvd.name[i]
状态:dvd.state[i]
借出日期:dvd.date[i]
3、如何计算租金 ?
租金=日期差(租金/每天)
- 计算日期差:
借出日期利用“年-月-日”的字符串形式保存。
可利用类SimpleDateFormat对字符串进行日期格式化。
设计阶段
1、初始化DVD信息
思路分析
- 创建项目MiniDvd
- 创建类DVDSet,添加相应属性
- 创建类DVDMgr,添加方法initial(),初始化三张DVD碟片信息
2、实现菜单切换
-
需求说明
编写程序入口,实现菜单显示和切换 -
思路分析
创建方法startMenu(),实现菜单切换
创建方法returnMain() ,返回主菜单
编写类Start,实现程序入口 -
难点提示
使用switch语句实现菜单切换
3、实现查看DVD信息
-
需求说明
遍历dvd,获取数组元素信息,并进行显示 -
思路分析
在类DVDMgr中创建方法search(),完成功能要求
根据状态值输出“已借出”或“可借”
4、实现新增DVD信息
-
需求说明
向dvd数组增加一条DVD信息,实现新增DVD信息 -
思路分析
在类DVDMgr中创建方法add(),完成功能要求
定位新增位置
插入DVD信息,状态值为1 -
难点提示
定位新增位置:第一个name为null的位置
5、实现删除DVD信息
-
需求说明
按照输入的名称,删除指定DVD信息 -
思路分析
查找要删除元素
通过把后面的元素依次前移一位,实现删除;
最后一个不为空元素置空 -
难点提示
不允许删除借出状态的DVD
不存在指定DVD,给出提示
6、实现借出DVD业务处理
- 需求说明
按照输入的名称,借出指定DVD
-
思路分析
查找要借出的DVD
判断是否存在
判断是否已借出
如果可借,修改state值 -
难点提示
各种情况的判断条件
7、实现归还DVD业务处理
-
需求说明
编写方法 returnDvd(),实现归还DVD,并计算租金 -
思路分析
查找要归还的DVD
判断是否存在
判断是否未借出
如果已借出,修改state值,并计算和输出租金 -
难点提示
字符串-日期转换
代码阶段
以下代码均写入DVD类里,
因此,粘贴代码时,要粘贴到类名为DVD的项目里
1、菜单模块
public void menu() throws ParseException {
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("======================");
System.out.println("请选择:");
int index=input.nextInt();
switch (index){
case 1:
case01();//添加DVD
break;
case 2:
case02();//查看DVD
break;
case 3:
case03();//删除DVD
break;
case 4:
case04();//借出DVD
break;
case 5:
case05();//归还DVD
break;
case 6:
System.out.println("感谢使用本系统!");
System.exit(1);
}
}
//下面是返回菜单的代码
public void getReturn() throws ParseException {
System.out.println("输入0返回");
int i = input.nextInt();
if (i == 0) {
menu();
}
}
2、初始化模块
int[] indexs=new int[50];//用来存储DVD的索引
String[] states=new String[50];//用来存储DVD的状态,比如"已借出"或"可借"
String[] names=new String[50];//用来存储DVD的名称
String[] dates=new String[50];//用来存储DVD的借出日期
Scanner input=new Scanner(System.in);//创建了一个名为 input 的Scanner对象,用于接收用户的输入
Date date=new Date();
public void init(){
indexs[0]=1;
indexs[1]=2;
indexs[2]=3;
states[0]="已借出";
states[1]="可借";
states[2]="可借";
names[0]="罗马假日";
names[1]="风声鹤唳";
names[2]="浪漫满屋";
dates[0]="2010-7-7";
dates[1]="";
dates[2]="";
}
3、主函数模块
public static void main(String[] args) throws ParseException {
DvD dvd=new DvD();
dvd.init(); //1.加载初始化数据
dvd.menu(); //2.启动菜单
}
4、添加DVD模块
private void case01() throws ParseException {
for (int i=0;i<names.length;i++){//这是一个for循环,用于遍历一个存储DVD信息的数组:names数组。
if (names[i]==null){//在每次迭代中,代码检查names[i]是否为null,以确定数组中是否有空闲位置可以新增DVD信息。
System.out.println("--->新增DVD");
System.out.println("输入DVD信息:名称");
String mc=input.next();
indexs[i]=i+1;//该行代码将当前DVD的索引存储在indexs数组中,索引的值为i+1。因为索引是从1开始的,而不是从0开始。
states[i]="可借";
names[i]=mc;
dates[i]="";
break;
}
}
System.out.println("添加成功");
System.out.println("==============");
getReturn();
}
5、查看DVD模块
public void case02() throws ParseException {
System.out.println("---->查看DVD");
System.out.println("序号\t状态\t 名称\t 借出日期");
for (int i=0;i<names.length;i++ ){
if(names[i]==null){
break;
}
System.out.println(indexs[i]+"\t"+states[i]+"\t"+names[i]+"\t\t"+dates[i]);
}
System.out.println("=========");
getReturn();
}
6、删除DVD模块
private void case03() throws ParseException {
System.out.println("---->删除DVD");
System.out.println("输入要删除的名称:");
String num=input.next();
//这行代码从用户输入中读取一个字符串,并将其存储在名为num的变量中,用于表示用户想要删除的DVD名称或索引。
int i;int j;
for (i=0;i<indexs.length;i++){//这是一个for循环,用于遍历存储DVD索引的indexs数组。
if (num.equals(names[i]) && "可借".equals(states[i])){
//如果用户输入的名称与names数组中的某个名称相匹配,并且该DVD的状态是“可借”,则执行以下操作:
for (j=i;j<indexs.length-1;j++)
{//该循环从匹配的索引i开始,将数组中该位置后的元素向前移动一个位置,以覆盖当前位置的DVD信息
states[j]=states[j+1];
names[j]=names[j+1];
dates[j]=dates[j+1];
}
System.out.println("删除成功");
break;
}
//如果用户输入的是DVD的索引,并且对应索引的DVD状态是“已借出”,则打印“DVD已借出,无法删除”的消息
if (num.equals(indexs[i])&&"已借出".equals(states[i])){
System.out.println("DVD已借出,无法删除");
break;
}
//如果循环到达数组的末尾仍然没有找到匹配的DVD记录,则打印“未找到该DVD”的消息。
if (i==indexs.length-1){
System.out.println("未找到该DVD");
}
}
getReturn();
}
7.借出DVD模块
private void case04() throws ParseException {
System.out.println("--->借出DVD");
System.out.println("选择你要借的dvd名称:");
String borrow=input.next();//通过输入流对象 input 获取用户输入的 DVD 名称,并将其存储在字符串变量 borrow中。
boolean boo=false;//声明一个布尔变量 boo,用于标记 DVD 是否已经被借走。
for (int i=0;i<indexs.length;i++){
if(borrow.equals(names[i])&& "可借".equals(states[i])){
//如果用户输入的 DVD 名称与当前遍历到的 DVD 名称相匹配,并且状态为 "可借",则执行以下操作
states[i] = "已借出";//状态变为已借出
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");//获取当前日期,并将其格式化为字符串
String date2 = sdf.format(date);
dates[i] = date2;
System.out.println("成功借出");
break;
}
//如果用户输入的 DVD 名称与当前遍历到的 DVD 名称相匹配,并且状态为 "已借出",则执行以下操作
if(borrow.equals(names[i]) && "已借出".equals(states[i])){
boo=true;//DVD已经被借走
break;
}
if (i==indexs.length-1){//如果遍历到数组的最后一个元素仍然没有匹配的 DVD,则执行以下操作
System.out.println("未找到该DVD");
}
}
if (!boo){
System.out.println("已被借走");
}
getReturn();
}
8、归还DVD模块
private void case05() throws ParseException {
System.out.println("--->归还DVD");
System.out.println("输入归还DVD的名字:");
String name=input.next();
boolean boo=false;
for (int i=0;i<indexs.length;i++){
if (name.equals(names[i]) && "已借出".equals(states[i])) {
// 如果用户输入的书籍名字与当前遍历到的 DVD 名称相匹配,并且状态为 "已借出",则执行以下操作
System.out.println("请输入归还日期,如2024-1-1");
String date2=input.next();//获取归还时间的信息
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");//创建一个日期格式化对象,用于解析日期字符串
//输入sdf.parse(date1).var变成下面这个↓
Date parse1 = sdf.parse(dates[i]);//归还日期
Date parse2 = sdf.parse(date2);//借出日期是date2
long time2 = parse2.getTime();//parse2.getTime.var(一定要输入.var)
// 得到一个毫秒数,距离1900.1.1的毫秒数
long time1 =parse1.getTime();
long money=(time2-time1)/(1000*60*60*24);//单位原本是毫秒,除1000就是秒,再除分钟,小时,就是一天。
System.out.println("需要支付"+money+"元");
System.out.println("DVD已退还");
boo=true;
states[i]="可借";
dates[i]="";
break;
}
if (name.equals(names[i]) && "可借".equals(states[i]) ){
System.out.println("DVD不存在");
boo=true;
}
}//如果 boo 仍然为 false,表示未找到对应的 DVD,则输出 "未找到对应DVD" 消息。
if (!boo){
System.out.println("DVD Not Found");
}
getReturn();
}
整体代码
package com.jr.dz13b;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Scanner;
import java.util.Date;
public class DvD {
int[] indexs=new int[50];//用来存储DVD的索引
String[] states=new String[50];//用来存储DVD的状态,比如"已借出"或"可借"
String[] names=new String[50];//用来存储DVD的名称
String[] dates=new String[50];//用来存储DVD的借出日期
Scanner input=new Scanner(System.in);//创建了一个名为 input 的Scanner对象,用于接收用户的输入
Date date=new Date();
public void init(){
indexs[0]=1;
indexs[1]=2;
indexs[2]=3;
states[0]="已借出";
states[1]="可借";
states[2]="可借";
names[0]="罗马假日";
names[1]="风声鹤唳";
names[2]="浪漫满屋";
dates[0]="2010-7-7";
dates[1]="";
dates[2]="";
}
public static void main(String[] args) throws ParseException {
DvD dvd=new DvD();
dvd.init(); //1.加载初始化数据
dvd.menu(); //2.启动菜单
}
public void menu() throws ParseException {
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("======================");
System.out.println("请选择:");
int index=input.nextInt();
switch (index){
case 1:
case01();
break;
case 2:
case02();
break;
case 3:
case03();
break;
case 4:
case04();
break;
case 5:
case05();
break;
case 6:
System.out.println("感谢使用本系统!");
System.exit(1);
}
}
private void case01() throws ParseException {
for (int i=0;i<names.length;i++){//这是一个for循环,用于遍历一个存储DVD信息的数组:names数组。
if (names[i]==null){//在每次迭代中,代码检查names[i]是否为null,以确定数组中是否有空闲位置可以新增DVD信息。
System.out.println("--->新增DVD");
System.out.println("输入DVD信息:名称");
String mc=input.next();
indexs[i]=i+1;//该行代码将当前DVD的索引存储在indexs数组中,索引的值为i+1。因为索引是从1开始的,而不是从0开始。
states[i]="可借";
names[i]=mc;
dates[i]="";
break;
}
}
System.out.println("添加成功");
System.out.println("==============");
getReturn();
}
public void case02() throws ParseException {
System.out.println("---->查看DVD");
System.out.println("序号\t状态\t 名称\t 借出日期");
for (int i=0;i<names.length;i++ ){
if(names[i]==null){
break;
}
System.out.println(indexs[i]+"\t"+states[i]+"\t"+names[i]+"\t\t"+dates[i]);
}
System.out.println("=========");
getReturn();
}
private void case03() throws ParseException {
System.out.println("---->删除DVD");
System.out.println("输入要删除的名称:");
String num=input.next();
//这行代码从用户输入中读取一个字符串,并将其存储在名为num的变量中,用于表示用户想要删除的DVD名称或索引。
int i;int j;
for (i=0;i<indexs.length;i++){//这是一个for循环,用于遍历存储DVD索引的indexs数组。
if (num.equals(names[i]) && "可借".equals(states[i])){
//如果用户输入的名称与names数组中的某个名称相匹配,并且该DVD的状态是“可借”,则执行以下操作:
for (j=i;j<indexs.length-1;j++)
{//该循环从匹配的索引i开始,将数组中该位置后的元素向前移动一个位置,以覆盖当前位置的DVD信息
states[j]=states[j+1];
names[j]=names[j+1];
dates[j]=dates[j+1];
}
System.out.println("删除成功");
break;
}
//如果用户输入的是DVD的索引,并且对应索引的DVD状态是“已借出”,则打印“DVD已借出,无法删除”的消息
if (num.equals(indexs[i])&&"已借出".equals(states[i])){
System.out.println("DVD已借出,无法删除");
break;
}
//如果循环到达数组的末尾仍然没有找到匹配的DVD记录,则打印“未找到该DVD”的消息。
if (i==indexs.length-1){
System.out.println("未找到该DVD");
}
}
getReturn();
}
private void case04() throws ParseException {
System.out.println("--->借出DVD");
System.out.println("选择你要借的dvd名称:");
String borrow=input.next();//通过输入流对象 input 获取用户输入的 DVD 名称,并将其存储在字符串变量 borrow中。
boolean boo=false;//声明一个布尔变量 boo,用于标记 DVD 是否已经被借走。
for (int i=0;i<indexs.length;i++){
if(borrow.equals(names[i])&& "可借".equals(states[i])){
//如果用户输入的 DVD 名称与当前遍历到的 DVD 名称相匹配,并且状态为 "可借",则执行以下操作
states[i] = "已借出";//状态变为已借出
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");//获取当前日期,并将其格式化为字符串
String date2 = sdf.format(date);
dates[i] = date2;
System.out.println("成功借出");
break;
}
//如果用户输入的 DVD 名称与当前遍历到的 DVD 名称相匹配,并且状态为 "已借出",则执行以下操作
if(borrow.equals(names[i]) && "已借出".equals(states[i])){
boo=true;//DVD已经被借走
break;
}
if (i==indexs.length-1){//如果遍历到数组的最后一个元素仍然没有匹配的 DVD,则执行以下操作
System.out.println("未找到该DVD");
}
}
if (!boo){
System.out.println("已被借走");
}
getReturn();
}
private void case05() throws ParseException {
System.out.println("--->归还DVD");
System.out.println("输入归还DVD的名字:");
String name=input.next();
boolean boo=false;
for (int i=0;i<indexs.length;i++){
if (name.equals(names[i]) && "已借出".equals(states[i])) {
// 如果用户输入的书籍名字与当前遍历到的 DVD 名称相匹配,并且状态为 "已借出",则执行以下操作
System.out.println("请输入归还日期,如2024-1-1");
String date2=input.next();//获取归还时间的信息
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");//创建一个日期格式化对象,用于解析日期字符串
//输入sdf.parse(date1).var变成下面这个↓
Date parse1 = sdf.parse(dates[i]);//归还日期
Date parse2 = sdf.parse(date2);//借出日期是date2
long time2 = parse2.getTime();//parse2.getTime.var(一定要输入.var)
// 得到一个毫秒数,距离1900.1.1的毫秒数
long time1 =parse1.getTime();
long money=(time2-time1)/(1000*60*60*24);//单位原本是毫秒,除1000就是秒,再除分钟,小时,就是一天。
System.out.println("需要支付"+money+"元");
System.out.println("DVD已退还");
boo=true;
states[i]="可借";
dates[i]="";
break;
}
if (name.equals(names[i]) && "可借".equals(states[i]) ){
System.out.println("DVD不存在");
boo=true;
}
}//如果 boo 仍然为 false,表示未找到对应的 DVD,则输出 "未找到对应DVD" 消息。
if (!boo){
System.out.println("DVD Not Found");
}
getReturn();
}
public void getReturn() throws ParseException {
System.out.println("输入0返回");
int i = input.nextInt();
if (i == 0) {
menu();
}
}
}