前言:其实学习Java已经有挺长一段时间,但是每次看完就忘,记不住重点,一被问问题就game over。一个偶然机会接触到掘金网站,没错,俺是刚加入的新人朋友。然后想,通过写文章打卡,记录自己的学习。
ps:俺的内容不一定是最好的也不一定是正确的,但是确实是俺的个人感受。因为从今天才开始,就复习一下俺今天的学习吧。
今天做了一个小demo吧
图书管理系统
这个大家都很熟悉了 第一步,开始分析。 首先,图书类,管理类需要,然后需要测试类 所以俺们画类图
第二步,按照类图写程序; 图书类最容易。不过因为定义是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前面的不能是空,否则会空指针异常,这个就是为什么我要先找到第一个不是空的位置),拜拜