java项目之图书管理系统----day01

211 阅读4分钟

前言:其实学习Java已经有挺长一段时间,但是每次看完就忘,记不住重点,一被问问题就game over。一个偶然机会接触到掘金网站,没错,俺是刚加入的新人朋友。然后想,通过写文章打卡,记录自己的学习。
ps:俺的内容不一定是最好的也不一定是正确的,但是确实是俺的个人感受。因为从今天才开始,就复习一下俺今天的学习吧。
今天做了一个小demo吧

图书管理系统

这个大家都很熟悉了 第一步,开始分析。 首先,图书类,管理类需要,然后需要测试类 所以俺们画类图

image.png

image.png

第二步,按照类图写程序; 图书类最容易。不过因为定义是private所以需要提供set/get方法


import java.util.Date;

public class Book {
   private int id;//1001
   private String name;
   private int state;//在库还是被借 0在
   private Date borrowDate;//被借日期
   private int borrowCount;//被借次数
public int getBorrowCount() {
	return borrowCount;
}
public void setBorrowCount(int borrowCount) {
	this.borrowCount = borrowCount;
}
public int getId() {
	return id;
}
public void setId(int id) {
	this.id = id;
}
public String getName() {
	return name;
}
public void setName(String name) {
	this.name = name;
}
public int getState() {
	return state;
}
public void setState(int state) {
	this.state = state;
}
public Date getBorrowDate() {
	return borrowDate;
}
public void setBorrowDate(Date borrowDate) {
	this.borrowDate = borrowDate;
}
   
}

然后是管理类: 先按照类图搭结构,因为需要键盘输入,这里把Scanner定义全局。这里我们用数组存图书,把该数组定义为全局

/*删除借风云帮还都需要找到第一个不是空的位置,用循环book[i]==null;
 * i表示第一个为空地方。
 * 
 */
import java.util.Date;
import java.util.Scanner;

public class BookManager {
        Scanner sc=new Scanner(System.in);
	private Book[] books;
//初始化方法
public void init() {
	
}

//菜单
public void menu() {
	
		
	}
}
//添加书
private void addBook() {
	System.out.println("增加图书");
	
}
//删除书
private void deleteBook() {
	
}
//还书
private void returnBook() {
	System.out.println("归还图书");
	}
//借书
private void borrowBook() {
	System.out.println("借阅图书");
	
}

public void iscontiue() {
	System.out.println("是否回到主菜单 y/其他");

}
private void showbooks() {

	
}
}

然后开始填写内容 我们先写菜单项

        System.out.println("=====欢迎来到图书管理系统=====");
	System.out.println("请根据提示选择");
	System.out.println("1.增加图书");
	System.out.println("2.删除图书");
	System.out.println("3.借阅图书");
	System.out.println("4.归还图书");
	System.out.println("5.图书风云榜");
	System.out.println("6.查看图书");
        //有输入,所以new  Scanner对象
        //全局有
	int key=sc.nextInt();
	switch(key) {
	case 1:
		addBook();
		break;
	case 2:
		deleteBook();
		break;
		
	case 3:
		borrowBook();
		break;
		
	case 4:
		returnBook();
		break;
		
	case 5:
		Bookrant();
		break;
	case 6:
		showbooks();
		break;
	default:
		
	}
    这里是初始化,假设我们用数组,初始化4本书
    
       //初始化方法
      public void init() {
   books=new Book[100];
   Book book0=new Book();
   book0.setName("计算机科学");
   book0.setId(1001);
   book0.setState(1);//在
   book0.setBorrowCount(0);//没有被借
   Book book1=new Book();
   book1.setName("python");
   book1.setId(1002);
   book1.setState(1);//在
   Book book2=new Book();
   book2.setName("c++");
   book2.setId(1003);
   book2.setState(1);//在
   Book book3=new Book();
   book3.setName("java");
   book3.setId(1004);
   book3.setState(1);//在
   books[0]=book0;
   books[1]=book1;
   books[2]=book2;
   books[3]=book3;
}
       


    然后开始写添加书的代码,因为我们初始,只有id,name需要输入,其他都是默认情况。
    所以只需要输入id,name;
    需要找到第一个空的位置,然后插入到该位置
    
private void addBook() {
	System.out.println("增加图书");
	Book book=new Book();
	System.out.println("请输入添加书名字");
	String bookname=sc.next();
	System.out.println("请输入添加书id");
	int bookid=sc.nextInt();
        int state=1;
        //下面几个变量可以是默认值,可以定义,可以不定义
	Date date=null;
	int count=0;
        //添加
	book.setBorrowCount(count);
	book.setBorrowDate(date);
	book.setId(bookid);
	book.setName(bookname);
	book.setState(state);
        
//	数组第一个为空的
	int ate=-1;
	for(int i=0;i<books.length;i++) {
		if(books[i]==null) {
			ate=i;
			break;
		}
                }
                
	if(ate>0) {
	books[ate]=book;
	System.out.println("增加成功");
	}else {
		System.out.println("书满了,请扩充图书馆");
	}
	
	iscontiue();
}

这里我们想当输入某个才退出,其他循环出现菜单选择 书写了iscontiue();

public void iscontiue() {
	System.out.println("是否回到主菜单 y/其他");
String isContinue=sc.next();
if("y".equals(isContinue)) {
	menu();
}
}

删除同理,先输入名字,然后在不是空的里面查找,看有没有这个书,不是空的和上面添加一样,但是我没有把他提出另外写一个方法。

	System.out.println("删除图书");
	Book book=new Book();
	System.out.println("请输入删除书名字");
	String bookname=sc.next();
	int tt=-1;
	for(int i=0;i<books.length;i++) {
		if(books[i]==null) {
			tt=i;
			break;
		}
	}
	if(tt>0) {
	int pos=-1;
	for(int i=0;i<tt;i++) {
		if(books[i].getName().equals(bookname)) {
			pos=i;
			break;
		}
	}
	if(pos>0) {
		
		for(int i=pos+1;i<tt;i++) {
			books[i-1]=books[i];
		}
		}
	}else {
		System.out.println("没有找到该书");
	}
	
	iscontiue();
}

借书:先看有没有,有才借,也同样不需要遍历整个数组,就需要遍历有内容的。同样用了不是空那个方法 借书,书的状态需要改变。书的被借次数需要改变,被借时间需要改变,我们用借那个书的位置.setxx()方法进行修改

        System.out.println("借阅图书");
	Book book=new Book();
	System.out.println("请输入借阅书名字");
	String bookname=sc.next();
	int tt=-1;
//	找到第一个不是空
	for(int i=0;i<books.length;i++) {
		if(books[i]==null) {
			tt=i;
			break;
		}
	}
	if(tt>0) {
	int pos=-1;
	for(int i=0;i<tt;i++) {
		if(books[i].getName().equals(bookname)) {
			pos=i;
			break;
		}
	}
	if(pos>0) {
		System.out.println("借阅成功");
		books[pos].setState(0);
		books[pos].setBorrowCount(book.getBorrowCount()+1);
		Date date=new Date();
		books[pos].setBorrowDate(date);
		}
	}else {
		System.out.println("没有找到该书");
	}
	iscontiue();
        }

归还图书相反,书的状态需要回复。书的被借次数不需要改变,被借时间恢复空,我们用借那个书的位置.setxx()方法进行修改

        System.out.println("归还图书");
	Book book=new Book();
	System.out.println("请输入归还书名字");
	String bookname=sc.next();
	int tt=-1;
	for(int i=0;i<books.length;i++) {
		if(books[i]==null) {
			tt=i;
			break;
		}
	}
	if(tt>0) {
	int pos=-1;
	for(int i=0;i<tt;i++) {
		if(books[i].getName().equals(bookname)) {
			pos=i;
			break;
		}
	}
	if(pos>0) {
		System.out.println("归还成功");
		books[pos].setState(1);
		books[pos].setBorrowDate(null);
		}
	}else {
		System.out.println("没有该书,请进行添加");
	}
	iscontiue();
}
}

风云榜

private void Bookrant() {

	System.out.println("图书风云榜");
	Book book=new Book();
	int tt=-1;
//	找到第一个不是空
	for(int i=0;i<books.length;i++) {
		if(books[i]==null) {
			tt=i;
			break;
		}
	}
	//冒泡排序
	for(int j=0;j<tt;j++) {
		for(int i=0;i<tt-1-j;i++) {
			if(books[i].getBorrowCount()<books[i+1].getBorrowCount()) {
				Book co=books[i];
				books[i]=books[i+1];
				books[i+1]=co;
			}
		}
	}
	showbooks();
	iscontiue();
}

private void showbooks() {

	System.out.println("编号\t书名\t被借次数\t库存\t被借日期");
	for(Book i:books) {
//		String borrowDatestr=i.getBorrowDate()==null?" ":i.getBorrowDate()+"";
		if(i!=null) {
		System.out.println(i.getId()+"\t"+i.getName()+"\t"+i.getBorrowCount()+"\t"+i.getState()+"\t"+i.getBorrowDate());
	
		}
		
	}
	iscontiue();
}

总结:其实这个项目并不难,就是比较琐碎。而且我这个也需要改进 比如,查找第一个不是空的方法代码多次重复,可以改进,还有日期显示问题。
设计知识点:冒泡排序,循环,对象.引用 ( books[i].setXXX 类似这种xx.xx前面的不能是空,否则会空指针异常,这个就是为什么我要先找到第一个不是空的位置),拜拜