图书管理系统

目录

1.book包

1.1BOOK类

1.2bookshelf类(书架类)

2.user包

2.1User类

2.2Adminuser类

2.3Normaluser类

3.主包

3.1Main类

4.function包

4.1Function接口

4.2Addbook类

4.3Borrowbook类

4.4Deletebook类

4.5Exitbook类

4.6Findbook

4.7Lookbook

4.8Returnbook


1.book包

我们需要创建一个包存的是与书相关的类

1.1BOOK类

储存的是一些关于书的属性比如书名 作者   价格  等等的成员变量

注意:成员变量一般用private修饰

用get  and  set  进行访问

构造函数时可以省略状态的初始化(如果没有初始化时默认值为false,没必要多此一举)

代码实现

package Book;
import function.Addbook;
public class Book {
    //创建书的属性书名  作者
     private String name;//书名
    private String author;//作者
    private  int price;//价格
    private boolean state;//状态

    //初始化,state的默认值为false,所以初始化省略掉state的
    public Book(String name, String author, int price) {
        this.name = name;
        this.author = author;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public String getAuthor() {
        return author;
    }

    public int getPrice() {
        return price;
    }

    public boolean isState() {
        return state;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public void setState(boolean state) {
        this.state = state;
    }

    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +" "+
                //", state=" + state +
               "state="+ ((state==true)?"已借出":"未借出")+
                '}';
    }

    public static void main(String[] args) {

    }
}

1.2bookshelf类(书架类)

可以先在书架上初始化几本书

//问题一:怎么解决书架上放若干本书       用数组

问题 2:而且还要定义一个数来记录书籍的个数

实现功能需要访问数组等成员变量受到了限制

创建方法用于访问

代码实现

package Book;
//书架
public class bookshelf {
    //问题一:怎么解决书架上放若干本书       用数组

   private Book []books=new Book[10];//书架数组
   private int usesize;//书架数的个数

    public int getUsesize() {
        return usesize;
    }

    public void setUsesize(int usesize) {
        this.usesize = usesize;
    }

    //属于bookshelf的构造方法,这个类中没有成员变量,只有其他类中调用这个类就会初始化对象
    public bookshelf(){
        books[0]=new Book("红楼梦","曹雪芹",11);
        books[1]=new Book("三国演义","罗贯中",14);
        books[2]=new Book("西游记","吴承恩",22);
        this.usesize=3;

    }

    //对查找书籍
    public Book getBooks(int sop) {
        return books[sop];
    }

    //对进行增加书籍的时候有用
    public void setBooks(int sop,Book book) {
        this.books[sop]=book;
    }

    //对进行判满的时候有用
    public Book [] setlong(){
        return books;
    }

    public static void main(String[] args) {

    }


}

2.user包

这里图书管理系统的用户群体分为普通用户管理员用户

所以可以设置三个类 1.User类(抽象类)2.Adminuser类(管理员类)3.Normaluser类(普通类),并且后面两个类都要继承抽象类

2.1User类

第一点

包括其他两个类的共性比如name成员变量

注意用p'rotected修饰

第二点

在不同用户是所展现的的功能也是不一样的

所以可以把功能建成一个数组

这时候接口的作用体现出来了

所有的功能类都要继承这个接口,

第三点

关键点:连接功能区和主系统的节点

调用菜单功能的方法

从主函数中传过来的choice和bookshelf1

function:代表的是数组(功能数组)

最后就会传到function包中实现功能操作

第四点

代码实现

package user;
import Book.*;
import function.Function;

//用户是个代表,所以设置为抽象方法
public abstract class  User {

    protected String naem;

    //此时这个数组没有初始化
    //调用构造方法的时候,就对数组进行了初始化,所以在抽象类中是可以调用到已经初始化好的数组
    protected Function[] functions;


    public User(String name){

        this.naem=name;
    }

    //不能被static修饰,会影响重写
    public abstract int mune();


    //  定义一个调用菜单功能的方法
    public void func(int choice ,bookshelf bookshelf1){

        functions[choice].work(bookshelf1);
        //调用对象的work方法
    }
}

2.2Adminuser类

第一点

User类中有构造方法,子类也需要进行j

第二点

第三点

把抽象类中的功能数组成员变量放进子类中的构造方法中,只要你选择好用户,用户的功能就初始化好了

注意:有个小小的注意点 ,我们可以把退出系统放在数组下标为0的位置,可以和菜单下标进行相呼应

第四点

代码实现

package user;
import function.*;
import java.util.Scanner;

public class Adminuser extends User {


    public Adminuser(String name) {

        super(name);
        //对数组进行初始化,因为选择好什么用户这个用户的功能就要初始化好
        this.functions=new Function[]{
                new Exitbook(),
                new Finebook(),
                new Addbook(),
                new Deletebook(),
                new Lookbook()
        };

    }


    //管理员界面菜单
    public   int  mune(){
        System.out.println("**********管理员用户菜单**************");
        System.out.println("1.查找书籍");
        System.out.println("2.新增书籍");
        System.out.println("3.删除书籍");
        System.out.println("4,显示书籍");
        System.out.println("0.退出系统");
        System.out.println("***********************************");
        System.out.println("请选择你的操作");
        Scanner sc=new Scanner(System.in);
        int choice=sc.nextInt();
        return choice ;
    }
}

2.3Normaluser类

第一点

User类中有构造方法,子类也需要进行构造

第二点

第三点

把抽象类中的功能数组成员变量放进子类中的构造方法中,只要你选择好用户,用户的功能就初始化好了

注意:有个小小的注意点 ,我们可以把退出系统放在数组下标为0的位置,可以和菜单下标进行相呼应

第四点

代码实现

package user;

import function.*;

import java.util.Scanner;

//普通用户
public class Normaluser extends User{


    //构造方法
    public Normaluser(String name) {
        super(name);
        //对数组进行初始化,因为选择好什么用户这个用户的功能就要初始化好
        this.functions=new Function[]{
                new Exitbook(),
                new Finebook(),
                new Borrowbook(),
                new Returnbook()
        };
    }


    //普通用户操作界面
    public   int mune(){
        System.out.println("**********普通用户菜单**************");
        System.out.println("1.查找书籍");
        System.out.println("2.借阅书籍");
        System.out.println("3.归还书籍");
        System.out.println("0.退出系统");
        System.out.println("***********************************");
        System.out.println("请选择你的操作");
        Scanner sc=new Scanner(System.in);
        int choice=sc.nextInt();
        return choice;
    }
}

3.主包

3.1Main类

进入图书管理系统需要界面

第一点

User的好处就体现出来了

这里(返回值的不同)使用了向上转型来接受

第二点

选好身份后,普通用户和管理员用户的菜单界面是不同的

调用菜单时就可以在User中写mune方法,然后在子类中中进行重写

使用了多态

第三点

另外一开始就需要对建立一个书架的对象(因为功能的实现需要在书架上完成)

第四点

选择完用户身份后进行功能的调用

choice:代表的是从用户菜单传回的的值

bookshelf1:因为功能的实现需要在书架上完成所以要穿一个书架给方法

第五点

代码实现

import user.Adminuser;
import user.Normaluser;
import user.User;
import Book.bookshelf;

import java.util.Scanner;

public class Main {
    //进入界面系统
    public static User lonin(){
        System.out.println("请输入你的姓名");
        Scanner sc=new Scanner(System.in);
        String name=sc.nextLine();
       // next:
        System.out.println("请输入您的身份  1:普通用户  2:管理员用户");
        int tmp=sc.nextInt();
        if(tmp==1){
            return new Normaluser(name);
        }
        //有一个问题如果输入的既不是1也不是2也会进入这里面,但如果改成else if就会检测成无返回值
        else {
            return new Adminuser(name);
        }
//        else{
//            System.out.println("输入错误请重新输入");
//           // goto next;
//        }


    }
    public static void main(String[] args) {
        //一开始书架就要初始化好
        bookshelf bookshelf1=new bookshelf();
        while(true){
            User user=lonin();
            int choice= user.mune();
            //choice代表的是第几个操作

            //开始调用用户功能kk

            user.func(choice,bookshelf1);
        }



    }
}

4.function包

储存的是普通用户和管理员用户的功能菜单

因为都是功能所以我们可以设计成接口,再对接口进行具体重写,

4.1Function接口

注意:接口的成员变量还是成员方法都是由public abstra修饰的

package function;
import Book.*;

public interface Function  {
    void work(bookshelf bookshelf1);
}

4.2Addbook类

增加书籍

第一步

对书架进行判满

第二步

创建增加书籍对象

第三步

查看书架上是否已经有这本书

第四步

把书增加到书籍上

注意点:

//加之后需要有效书籍加一

代码实现

package function;

import Book.Book;
import Book.bookshelf;

import java.util.Scanner;

//新增book
public class Addbook  implements Function{



    @Override
    public void work(bookshelf bookshelf1) {
        System.out.println("新增书籍");

        //1.需要进行判满

        if(bookshelf1.getUsesize()==bookshelf1.setlong().length){
            System.out.println("书架已满,无法增加");
            return;
        }

        //2.创建增加书籍对象

        System.out.println("请输入要增加的书名");
        Scanner sc=new Scanner(System.in);
        String name=sc.nextLine();

        System.out.println("请输入要增加书名的作者");
        String author=sc.nextLine();

        System.out.println("请输入书的价钱");
        int price =sc.nextInt();

        Book newbook=new Book(name,author,price);

        //3.查看书架上是否已经有这本书

        for (int i = 0; i <bookshelf1.getUsesize() ; i++) {
            if(bookshelf1.getBooks(i).getName().equals(name)){
                System.out.println("已经有这本书了"+bookshelf1.getBooks(i));
                return ;
            }
            System.out.println("没有这本书,可以增加");
        }

        //4.增加书
        int sop=bookshelf1.getUsesize();
        bookshelf1.setBooks(sop,newbook);
        //加之后需要有效书籍加一
        bookshelf1.setUsesize(sop+1);
        System.out.println("增加成功");
    }

    public static void main(String[] args) {

    }
}

4.3Borrowbook类

借阅书籍

第一步

/第一步输入书籍名称

第二步

//第二步找到书籍

注意事项:

借阅书籍的改变点就是改变书籍的状态

这里改变书籍状态改变了自带的tostring

三目操作符

代码实现

package function;

import Book.bookshelf;

import java.util.Scanner;

//借阅book
public class Borrowbook implements Function{


    @Override
    public void work(bookshelf bookshelf1) {
        System.out.println("借阅书籍");

        //第一步输入书籍名称
        System.out.println("请输入你要借阅书籍的名称");
        Scanner sc=new Scanner(System.in);
        String name=sc.nextLine();

        //第二步找到书籍
        int sop=0;
        for (int i = 0; i <bookshelf1.getUsesize() ; i++) {
            if(bookshelf1.getBooks(i).getName().equals(name)){
                System.out.println("找到了"+bookshelf1.getBooks(i));
                 sop=i;

                if(bookshelf1.getBooks(sop).isState()==true){
                    System.out.println("不好意思,书已经被借出去了");
                    return ;
                }
                else{
                    bookshelf1.getBooks(sop).setState(true);
                    System.out.println("恭喜你借阅成功");
                    return;
                }
            }
        }
        System.out.println("不好意思,没有这本书");
    }
}

4.4Deletebook类

删除书籍

第一步

第二步

注意点:

1.采用向前覆盖的方式进行删除

2.记得将有效个数减一

代码实现

package function;

import Book.bookshelf;

import java.util.Scanner;

//删除book
public class Deletebook implements Function{


    @Override
    public void work(bookshelf bookshelf1) {
        System.out.println("删除书籍");

        //第一步输入需要删除书籍的名称
        System.out.println("请输入你要删除书籍的名字");
        Scanner sc=new Scanner(System.in);
        String name=sc.nextLine();

        //第二部找到书籍
        int sop=0;
        for (int i = 0; i <bookshelf1.getUsesize() ; i++) {
            if(bookshelf1.getBooks(i).getName().equals(name)){
                System.out.println("找到了"+bookshelf1.getBooks(i));
                sop=i;
                break;
            }
        }
        if(sop==0){
            System.out.println("不好意思没有你找的书");
            return;
        }
        else{
            System.out.println("找到了正在删除");
            //采用向前覆盖的方式
            for(int j=sop;j< bookshelf1.getUsesize();j++){
                bookshelf1.setlong()[j]=bookshelf1.setlong()[j+1];
            }
            //将有效书籍个数减一
            bookshelf1.setUsesize(bookshelf1.getUsesize()-1);
            System.out.println("删除成功");

            return;
        }

    }

    public static void main(String[] args) {


    }
}

4.5Exitbook类

退出系统

package function;

import Book.bookshelf;

//退出系统
public class Exitbook implements Function {

    @Override
    public void work(bookshelf bookshelf1) {
        System.out.println("退出系统");
        System.exit(0);
    }

    public static void main(String[] args) {
        
    }
}

4.6Findbook

查找书籍

第一步

第二步

代码实现

package function;

import Book.bookshelf;

import java.util.Scanner;

//查找book
public class Finebook implements Function{


    @Override
    public void work(bookshelf bookshelf1) {
        System.out.println("查找图书");

        //输入
        System.out.println("请输入你要查找书的书名");
        Scanner sc=new Scanner(System.in);
        String name=sc.nextLine();

        //第二步遍历
        for (int i = 0; i <bookshelf1.getUsesize() ; i++) {
            if(bookshelf1.getBooks(i).getName().equals(name)){
                System.out.println("找到了"+bookshelf1.getBooks(i));
                return ;
            }
        }
        System.out.println("没有你找的这本书");
    }
}

4.7Lookbook

显示书籍

遍历数组就行了

package function;

import Book.bookshelf;

//显示book
public class Lookbook implements Function{


    @Override
    public void work(bookshelf bookshelf1) {
        System.out.println("显示图书");
        for(int i=0;i<bookshelf1.getUsesize();i++){
            System.out.println(bookshelf1.getBooks(i));
        }
    }
}

4.8Returnbook

归还书籍

package function;

import Book.bookshelf;

import java.util.Scanner;

//归还book
public class Returnbook implements Function {



    @Override
    public void work(bookshelf bookshelf1) {
        System.out.println("归还书籍");

        System.out.println("请输入你要归还书籍的名称");
        Scanner sc=new Scanner(System.in);
        String name=sc.nextLine();

        for (int i = 0; i <bookshelf1.getUsesize() ; i++) {
            if(bookshelf1.getBooks(i).getName().equals(name)){
                System.out.println("找到了"+bookshelf1.getBooks(i));
                bookshelf1.getBooks(i).setState(false);
                System.out.println("归还成功");

            }

        }
        System.out.println("没有你要归还的图书");
    }
}

  • 13
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值