实现功能
- 管理会员:增加、删除、查找、充值、输出
- 管理CD:增加、删除、查找、输出
- 主要功能:出租、归还、销售、统计收入
实现思路
- Disk类:存储每个CD的信息,如ID、名字、价格、种类、库存等。
- DiskBook类:作为一个CD仓库,实现CD的整体调度。
- User类:存储每个会员的信息,如ID、名字、存款、VIP等级等。注意,每一个会员有一个DiskBook,用来存储会员借的CD。
- UserBook类:作为一个会员登记本,实现与会员有关的功能的整体调度。
- Owner类:作为商店的主人,拥有一个DiskBook和UserBook,来实现各种功能。用户使用该程序时,是通过Owner类来调用各种功能。
- 注意:Disk和User类需要重载equals和toString方法。
Disk.java
import java.util.Objects;
public class Disk {
private int id;
private String name;
private double price;
private int stock; //CD的库存
private Genre genre; //CD的音乐种类
public Disk(int i,String n,double p,int s,Genre g) {
id=i;
name=n;
price=p;
stock=s;
genre=g;
}
public int getId() {
return id;
}
public double getPrice() {
return price;
}
public int getStock() {
return stock;
}
public void setStock(int s) {
stock+=s;
}
public Genre getGenre() {
return genre;
}
@Override
public int hashCode() {
return Objects.hash(id,name,stock,price);
}
@Override
public boolean equals(Object obj) { //判断两个CD是否相等
if(this==obj) //如果就是自己
return true;
if(obj==null) //如果CD不存在
return false;
if(getClass()!=obj.getClass()) //如果CD和自己类不同
return false;
Disk d=(Disk) obj; //向下转型
return id==d.id&&Objects.equals(name, d.name)&&price==d.price&&Objects.equals(genre, d.genre); //每个成员都分别相等才可以
}
@Override
public String toString() {
return "CD "+name+" "+id+" price: "+price+" stock: "+stock;
}
}
DiskBook.java
import java.util.*;
public class DiskBook {
private int maxSize=10000; //CD库最大存储量
private Disk[] data=new Disk[maxSize];
private int capacity=0; //CD库真实容量
public void addDisk(Disk d) {
for(int i=0;i<capacity;i++) {
if(data[i]==d) { //如果CD已经存在库存里
data[i].setStock(d.getStock()); //增加该CD的库存量
return;
}
}
//如果CD没有在库存中
if(capacity<maxSize) { //如果仓库还有容量
data[capacity]=d; //增加新的CD
capacity++;
}
else //如果仓库没有容量了
System.out.println("Too many CDs!");
}
public Disk findDisk(int id) { //寻找CD
for(int i=0;i<capacity;i++) {
if(data[i].getId()==id&&data[i].getStock()!=0)
return data[i];
}
return null;
}
public boolean removeDisk(int id) { //删除CD
for(int i=0;i<capacity;i++) { //遍历所有用户
if(findDisk(id)!=null) { //找到要删除的用户
for(int j=i;j<capacity-1;j++) //将后面所有的用户往前移一格
data[j]=data[j+1];
data[capacity]=new Disk(0,null,0,0,Genre.JAZZ);
capacity--;
return true;
}
}
//如果找不到该用户
System.out.println("Disk doesn't exist!");
return false;
}
public void rent(int id,int num) { //出租CD
Disk d=findDisk(id);
if(d==null) { //如果找不到该CD
System.out.println("Can't find the disk!");
return;
}
if(d.getStock()<num) { //如果该CD的库存量不够
System.out.println("Only "+d.getStock()+" disk(s) left!");
num=d.getStock(); //将该CD剩余的全部出租
}
d.setStock(-num); //更新库存
if(d.getStock()==0)
capacity--;
System.out.println("User rent "+num+" disk(s)!");
}
public void returnBack(int id,int num) { //还CD
Disk d=findDisk(id);
if(d==null) { //如果找不到该CD
System.out.println("Can't find the disk!");
return;
}
if(d.getStock()==0) //这步判断一定要在更新库存之前
capacity++;
d.setStock(num); //更新库存
System.out.println("User returned "+num+" disk(s)!");
}
public void buy(int id,int num) { //出售CD
Disk d=findDisk(id);
if(d==null) { //如果找不到该CD
System.out.println("Can't find the disk!");
return;
}
if(d.getStock()<num) { //如果该CD库存不够
System.out.println("Only "+d.getStock()+" disk(s) left!");
num=d.getStock(); //将该CD剩余的全部出售
}
d.setStock(-num); //更新库存
if(d.getStock()==0)
capacity--;
System.out.println("User bought "+num+" disk(s)!");
}
public void searchDisk(Genre g) { //根据音乐种类寻找并输出CD
for(int i=0;i<capacity;i++) {
if(data[i].getGenre()==g)
System.out.println(data[i]);
}
}
public boolean isEmpty() { //判断CD库是否为空
return capacity==0;
}
@Override
public String toString() { //重载输出,打印CD库中的每一个CD信息
String output="DiskBook"+'\n';
for(int i=0;i<capacity;i++) {
output+=data[i];
output+='\n';
}
return output;
}
}
User.java
import java.util.Objects;
public class User {
private int id;
private String name;
private double deposit; //会员账户里的存款
private VIPClass vipClass; //VIP等级
private double[] discount={0.9,0.8,0.7,0.6}; //不同VIP等级有不同的折扣
private final double rentDiscount=0.5; //租借CD是CD售价的五折
private DiskBook rentRecord=new DiskBook(); //记录用户租借的CD
User(int i,String n,double d){
id=i;
name=n;
deposit=d;
if(deposit>10000) //根据充值金额不同决定会员的等级
vipClass=VIPClass.DIAMOND;
else if(deposit>6000)
vipClass=VIPClass.GOLD;
else if(deposit>3000)
vipClass=VIPClass.SILVER;
else
vipClass=VIPClass.BRONZE;
}
public int getId() {
return id;
}
public double getDeposit() {
return deposit;
}
public void setDeposit(double d) {
deposit+=d;
}
public double rent(Disk d, int num) { //租借CD
rentRecord.addDisk(d); //加到会员的租借本上
double pay=d.getPrice()*num*rentDiscount; //计算应付的钱
switch(vipClass) {
case BRONZE:
pay*=discount[0];
break;
case SILVER:
pay*=discount[1];
break;
case GOLD:
pay*=discount[2];
break;
case DIAMOND:
pay*=discount[3];
break;
}
if(deposit<pay) { //如果存款不够付钱
System.out.println("RENT FAILURE: Not enough deposit! Please recharge!");
return 0;
}
setDeposit(-pay); //付钱
System.out.println("RENT SUCCESS: You have "+getDeposit()+" left in your account!");
return pay; //返回收入
}
public void returnBack(Disk d, int num) { //还CD
Disk temp=rentRecord.findDisk(d.getId());
if(temp!=null&&num>0&&num<=temp.getStock())
rentRecord.returnBack(d.getId(), num); //从会员的租借本上删除
}
public double buy(Disk d, int num) { //购买CD
double pay=d.getPrice()*num; //计算应付的钱
switch(vipClass) {
case BRONZE:
pay*=discount[0];
break;
case SILVER:
pay*=discount[1];
break;
case GOLD:
pay*=discount[2];
break;
case DIAMOND:
pay*=discount[3];
break;
}
if(deposit<pay) { //如果存款不够付钱
System.out.println("BUY FAILURE: Not enough deposit! Please recharge!");
return 0;
}
setDeposit(-pay); //付钱
System.out.println("BUY SUCCESS: You have "+getDeposit()+" left in your account!");
return pay;
}
public boolean rentRecordEmpty() { //返回是否将租借的CD全部还完
return rentRecord.isEmpty();
}
public void printRentRecord() { //输出租借的CD的信息
System.out.println("You haven't returned all the following CD(s)!");
System.out.println(rentRecord);
}
@Override
public String toString() {
return "User "+id+" "+name+" VIP class: "+vipClass+" deposit: "+deposit;
}
}
UserBook.java
public class UserBook {
private int maxSize=10000; //会员库的最大存储量
private User[] data=new User[maxSize];
private int capacity=0; //会员库的真实容量
public void addUser(User u) { //增加会员
if(capacity<maxSize&&findUser(u.getId())==null) { //如果用户不事先存在且数组容量足够
data[capacity]=u;
capacity++;
}
else //如果容量不够
System.out.println("Too many users!");
}
public User findUser(int id) { //寻找会员
for(int i=0;i<capacity;i++) {
if(data[i].getId()==id)
return data[i];
}
return null;
}
public boolean removeUser(int id) { //删除会员
for(int i=0;i<capacity;i++) { //遍历所有用户
if(findUser(id)!=null) { //找到要删除的用户
if(data[i].rentRecordEmpty()) { //如果租的CD都还完了
for(int j=i;j<capacity-1;j++) //将后面所有的用户往前移一格
data[j]=data[j+1];
data[capacity]=new User(0,null,0);
capacity--;
return true;
}
else { //如果租的CD还没还完
data[i].printRentRecord();
return false;
}
}
}
//如果找不到该用户
System.out.println("User doesn't exist!");
return false;
}
public double rent(int account,Disk d,int num) { //租借CD
User u=findUser(account);
if(u==null) {
System.out.println("Can't find the user!");
return 0;
}
return u.rent(d,num); //返回收入
}
public void returnBack(int account,Disk d,int num) { //还CD
User u=findUser(account);
if(u==null) {
System.out.println("Can't find the user!");
return;
}
u.returnBack(d,num);
}
public double buy(int account,Disk d,int num) { //购买CD
User u=findUser(account);
if(u==null) {
System.out.println("Can't find the user!");
return 0;
}
return u.buy(d,num); //返回收入
}
public void deposit(int id, int money) { //会员充值
User u=findUser(id);
if(u==null) {
System.out.println("Can't find the user!");
return;
}
u.setDeposit(money); //更新充值
}
@Override
public String toString() { //重载输出,打印会员库中的每一个会员信息
String output="UserBook"+'\n';
for(int i=0;i<capacity;i++) {
output+=data[i];
output+='\n';
}
return output;
}
}
Owner.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Owner {
private UserBook ub=new UserBook(); //记录会员的信息
private DiskBook db=new DiskBook(); //记录CD的信息
private double income=0; //记录总收入
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
public void addIncome(double m) { //增加收入
income+=m;
}
public void getIncome() { //输出总收入
System.out.println("You have earned "+income+"yuan(s) in total!");
}
public void begin() throws IOException {
while(true) {
printMainMenu(); //输出主菜单
int choice=readUserInput(); //获取用户操作
switch(choice) {
case 1:
manageUser(); //管理会员
break;
case 2:
manageDisk(); //管理CD
break;
case 3:
rentDisk(); //出租CD
break;
case 4:
returnDisk(); //还CD
break;
case 5:
buyDisk(); //购买CD
break;
case 6:
getIncome(); //输出收入
break;
case 7:
return; //退出程序
}
}
}
private void printMainMenu() { //输出主菜单
System.out.println("Welcome! Please input what you want to do!");
System.out.println("1: Manage User");
System.out.println("2: Manage Disk");
System.out.println("3: Rent Disk");
System.out.println("4: Return Disk");
System.out.println("5: Buy Disk");
System.out.println("6: Print Income");
System.out.println("7: Quit");
}
private int readUserInput() { //获取用户的输入
try {
String line;
line=in.readLine();
return Integer.parseInt(line);
} catch (IOException e) {
e.printStackTrace();
}
return 0;
}
private void manageUser() throws IOException { //管理会员
while(true) {
printUserMenu(); //输出会员菜单
int choice=readUserInput(); //获取用户输入
switch(choice) {
case 1:
addUser(); //增加会员
break;
case 2:
removeUser(); //删除会员
break;
case 3:
findUser(); //寻找会员
break;
case 4:
deposit(); //会员充值
break;
case 5:
printAllUsers(); //输出所有的会员信息
break;
case 6:
return; //退出会员菜单
}
}
}
private void manageDisk() throws IOException { //管理CD
while(true) {
printDiskMenu(); //输出CD菜单
int choice=readUserInput(); //获取用户输入
switch(choice) {
case 1:
addDisk(); //增加CD
break;
case 2:
removeDisk(); //删除CD
break;
case 3:
findDisk(); //寻找CD
break;
case 4:
searchDisk(); //根据音乐种类寻找CD
break;
case 5:
printAllDisks(); //输出所有CD信息
break;
case 6:
return; //退出CD菜单
}
}
}
public void printUserMenu() { //输出用户菜单
System.out.println("Managing User: Please input what you want to do!");
System.out.println("1: Add User");
System.out.println("2: Remove User");
System.out.println("3: Find User");
System.out.println("4: Deposit");
System.out.println("5: Print All Users");
System.out.println("6: Quit");
}
public void addUser() { //增加会员
try {
System.out.println("Please input user's name!");
String name=in.readLine();
System.out.println("Please input user's id!");
int id=Integer.parseInt(in.readLine());
System.out.println("Please input user's deposit!");
double deposit=Double.parseDouble(in.readLine());
User u=new User(id,name,deposit);
ub.addUser(u);
} catch (IOException e) {
e.printStackTrace();
}
}
public void removeUser() throws IOException { //删除会员
System.out.println("Please input user's id!");
try {
int id=Integer.parseInt(in.readLine());
ub.removeUser(id);
} catch(NumberFormatException e) {
e.printStackTrace();
}
}
public void findUser() throws IOException { //寻找会员
System.out.println("Please input user's id!");
try {
int id=Integer.parseInt(in.readLine());
System.out.println(ub.findUser(id));
} catch(NumberFormatException e) {
e.printStackTrace();
}
}
public void deposit() throws IOException { //用户充值
try {
System.out.println("Please input user's id!");
int id=Integer.parseInt(in.readLine());
System.out.println("Please input the money!");
int money=Integer.parseInt(in.readLine());
ub.deposit(id,money);
} catch(NumberFormatException e) {
e.printStackTrace();
}
}
public void printAllUsers() { //输出所有的会员信息
System.out.println(ub);
}
public void printDiskMenu() { //输出管理CD菜单
System.out.println("Managing Disk: Please input what you want to do!");
System.out.println("1: Add Disk");
System.out.println("2: Remove Disk");
System.out.println("3: Find Disk");
System.out.println("4: Search Disk");
System.out.println("5: Print All Disks");
System.out.println("6: Quit");
}
public void addDisk() { //增加CD
try {
System.out.println("Please input disk's name!");
String name=in.readLine();
System.out.println("Please input disk's id!");
int id=Integer.parseInt(in.readLine());
System.out.println("Please input disk's price!");
double price=Double.parseDouble(in.readLine());
System.out.println("Please input disk's stock!");
int stock=Integer.parseInt(in.readLine());
System.out.println("Please input disk's genre!");
System.out.println("1: Jazz");
System.out.println("2: Hip-hop");
System.out.println("3: Rock");
System.out.println("4: Soft");
System.out.println("5: Classic");
int genre=Integer.parseInt(in.readLine());
Genre g=Genre.JAZZ;
switch(genre) {
case 1:
g=Genre.JAZZ;
break;
case 2:
g=Genre.HIPHOP;
break;
case 3:
g=Genre.ROCK;
break;
case 4:
g=Genre.SOFT;
break;
case 5:
g=Genre.CLASSIC;
break;
}
db.addDisk(new Disk(id,name,price,stock,g));
} catch (IOException e) {
e.printStackTrace();
}
}
public void removeDisk() throws IOException { //删除CD
try {
System.out.println("Please input disk's id!");
int id=Integer.parseInt(in.readLine());
db.removeDisk(id);
} catch(NumberFormatException e) {
e.printStackTrace();
}
}
public void findDisk() throws IOException { //寻找CD
try {
System.out.println("Please input disk's id!");
int id=Integer.parseInt(in.readLine());
System.out.println(db.findDisk(id));
} catch(NumberFormatException e) {
e.printStackTrace();
}
}
public void searchDisk() throws IOException { //根据音乐种类寻找CD
try {
System.out.println("Please input disk's genre!");
System.out.println("1: Jazz");
System.out.println("2: Hip-hop");
System.out.println("3: Rock");
System.out.println("4: Soft");
System.out.println("5: Classic");
int genre=Integer.parseInt(in.readLine());
Genre g=Genre.JAZZ;
switch(genre) {
case 1:
g=Genre.JAZZ;
break;
case 2:
g=Genre.HIPHOP;
break;
case 3:
g=Genre.ROCK;
break;
case 4:
g=Genre.SOFT;
break;
case 5:
g=Genre.CLASSIC;
break;
}
db.searchDisk(g);
} catch(NumberFormatException e) {
e.printStackTrace();
}
}
public void printAllDisks() { //输出所有CD信息
System.out.println(db);
}
public void rentDisk() { //出租CD
try {
System.out.println("Please input disk's id!");
int cd=Integer.parseInt(in.readLine());
System.out.println("Please input how many disks you want to rent!");
int num=Integer.parseInt(in.readLine());
Disk d=db.findDisk(cd);
if(d==null)
return;
db.rent(cd,num); //从CD本中出租
System.out.println("Please input user's id!");
int account=Integer.parseInt(in.readLine());
double money=ub.rent(account,d,num); //在会员本增加出租CD的信息,并返回收入
addIncome(money); //增加收入
} catch (IOException e) {
e.printStackTrace();
}
}
public void returnDisk() { //归还CD
try {
System.out.println("Please input disk's id!");
int cd=Integer.parseInt(in.readLine());
System.out.println("Please input how many disks you want to return!");
int num=Integer.parseInt(in.readLine());
db.returnBack(cd,num); //归还到CD本中
Disk d=db.findDisk(cd);
if(d==null)
return;
System.out.println("Please input user's id!");
int account=Integer.parseInt(in.readLine());
ub.returnBack(account,d,num); //把会员租借CD的信息勾掉
} catch (IOException e) {
e.printStackTrace();
}
}
public void buyDisk() { //购买CD
try {
System.out.println("Please input disk's id!");
int cd=Integer.parseInt(in.readLine());
System.out.println("Please input how many disks you want to buy!");
int num=Integer.parseInt(in.readLine());
Disk d=db.findDisk(cd);
if(d==null)
return;
db.buy(cd,num); //从CD本中删除
System.out.println("Please input user's id!");
int account=Integer.parseInt(in.readLine());
double money=ub.buy(account,d,num); //会员购买CD,并返回收入
addIncome(money); //增加收入
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws IOException {
Owner o=new Owner();
o.begin();
}
}