数据结构-基于线性表的图书借阅管理系统|青训营

185 阅读5分钟

一、运行效果

1.jpg

2.jpg

3.jpg

4.jpg

二、源代码

import java.util.*;
public class Test {
	public static void main(String[] args) {
		Storage1 s1=new Storage1();
		Storage2 s2=new Storage2();
		Storage3 s3=new Storage3();
		System.out.println("--------欢迎来到图书借阅管理系统!--------");
		System.out.println("*         1.管理员                   *");
		System.out.println("*         2.用户                     *");
		System.out.print("请选择身份:");
		Scanner sc=new Scanner(System.in);
		int f=sc.nextInt();
		if (f==1)
		{
			adminmenu();
			while(true) {
				System.out.print("请选择:");
				int flag=sc.nextInt();
				switch(flag) {
				case 1:s1.storageInit();break;
				case 2:s1.storageDelete();break;
				case 3:s1.storageUpdate();break;
				case 4:s1.storageFind();break;
				case 5:s1.storagePrint();break;
				case 6:s2.storageInit();break;
				case 7:s2.storageDelete();break;
				case 8:s2.storageUpdate();break;
				case 9:s2.storageFind();break;
				case 10:s2.storagePrint();break;
				case 11:s3.storageInit();break;
				case 12:s3.storageDelete();break;
				case 13:s3.storageUpdate();break;
				case 14:s3.storageFind();break;
				case 15:s3.storagePrint();break;
				case 16:System.exit(0);System.out.println("退出成功!");
				}
			}
		}
		if (f==2)
		{
			usermenu();
			while(true) {
				System.out.print("请选择:");
				int flag=sc.nextInt();
				switch(flag) {
				case 1:s2.storageInit();break;
				case 2:s2.storageUpdate();break;
				case 3:s2.storageFind();break;
				case 4:s1.storageFind();break;
				case 5:s1.storagePrint();break;
				case 6:s3.storageInit();break;
				case 7:s3.storageDelete();break;
				case 8:s3.storageFind();break;
				case 9:System.exit(0);System.out.println("退出成功!");
				}
			}
		}
	}
	private static void adminmenu() {
		System.out.println("--------------------------------------");
		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.添加读者信息             *");
		System.out.println("*         7.删除读者信息             *");
		System.out.println("*         8.修改读者信息             *");
		System.out.println("*         9.查询读者信息             *");
		System.out.println("*         10.显示读者信息            *"); 
		System.out.println("*         11.添加借阅记录            *");
		System.out.println("*         12.删除借阅记录            *");
		System.out.println("*         13.修改借阅记录            *");
		System.out.println("*         14.查询借阅记录            *");
		System.out.println("*         15.显示借阅记录            *");
		System.out.println("*         16.退出                    *");
		System.out.println("*                                    *");
		System.out.println("*                                    *");
		System.out.println("--------------------------------------");
	}
	private static void usermenu() {
		System.out.println("--------------------------------------");
		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.借书                     *");
		System.out.println("*         7.还书                     *");
		System.out.println("*         8.查询借阅记录             *");
		System.out.println("*         9.退出                     *");
		System.out.println("*                                    *");
		System.out.println("*                                    *");
		System.out.println("--------------------------------------");
	}
}
class Storage1 <T>  {
	static SeqList<Book> list =new SeqList<Book>();
	Scanner sc=new Scanner(System.in);	
	public void storageInit() {               //添加信息
		list.insert(0,addBook());
		System.out.println("添加完毕!");
	}
	public void storagePrint() {            //显示所有信息
		for(int i=0;i<list.size();i++) {
			System.out.println(i+"\t"+list.get(i));
		}
		System.out.println("共"+list.size()+"个信息!");
	}	
	public void storageUpdate() {            //修改
		System.out.print("输入要修改图书的编号:");
		int index=sc.nextInt();
		list.set(index, addBook());
		System.out.println("修改完毕!");				
	}	
	public void storageDelete() {                //删除
		System.out.print("输入要删除的图书编号:");
		int index=sc.nextInt();
		list.remove(index);
		System.out.println("删除成功!");
	}
	
	public void storageFind() {                     //查找
		Boolean flag=true;
		System.out.print("输入要查找的图书号:");
		String id=sc.next();
		for(int i=0;i<list.size();i++) {
			if(list.get(i).getId().equals(id)) {
				System.out.println(i+"\t"+list.get(i));
				flag=false;
			}
		}
		if (flag)
			System.out.println("没有找到");
	}
	private Book addBook() {    //输入信息
		Book s=new Book("123","数据结构","叶核亚",4);		
		System.out.print("输入书号:");
		String id=sc.next();          //next()输入String类型
		s.setId(id);		
		System.out.print("输入书名:");
		String name=sc.next();
		s.setName(name);		
		System.out.print("输入作者:");
		String author=sc.next();
		s.setAuthor(author);
		System.out.print("输入数量:");
		int num=sc.nextInt();
		s.setNum(num);
		return s;
	}
}
class Book {
	private String id;
	private String name;
	private String author;
	public int num;
	public String toString() {
		return id+"\t"+name+"\t"+author+"\t"+num;
	}	
	public void setId(String id) {
		this.id=id;
	}
	public String getId() {
		return this.id;
	}	
	public void setName(String name) {
		this.name=name;
	}
	public String getName() {
		return this.name;
	}	
	public void setAuthor(String author) {
		this.author=author;
	}
	public String getAuthor() {
		return this.author;
	}
	public void setNum(int num) {
		this.num=num;
	}
	public int getNum() {
		return this.num;
	}	
	public Book(){
	}
	public Book(String id,String name,String author,int num) {
		this.id=id;
		this.name=name;
		this.author=author;
		this.num=num;
	}
}
class Storage2 <T>  {
	SeqList<Reader> list =new SeqList<Reader>();
	Scanner sc=new Scanner(System.in);	
	public void storageInit() {               //添加信息
		list.insert(0,addReader());
		System.out.println("添加完毕!");
	}
	public void storagePrint() {            //显示所有信息
		for(int i=0;i<list.size();i++) {
			System.out.println(i+"\t"+list.get(i));
		}
		System.out.println("共"+list.size()+"个信息!");
	}	
	public void storageUpdate() {            //修改
		System.out.print("输入要修改读者的编号:");
		int index=sc.nextInt();
		list.set(index, addReader());
		System.out.println("修改完毕!");				
	}	
	public void storageDelete() {                //删除
		System.out.print("输入要删除的读者编号:");
		int index=sc.nextInt();
		list.remove(index);
		System.out.println("删除成功!");
	}
	
	public void storageFind() {                     //查找
		Boolean flag=true;
		System.out.print("输入要查找的读者号:");
		String id=sc.next();
		for(int i=0;i<list.size();i++) {
			if(list.get(i).getId().equals(id)) {
				System.out.println(i+"\t"+list.get(i));
				flag=false;
			}
		}
		if (flag)
			System.out.println("没有找到");
	}
	private Reader addReader() {    //输入信息
		Reader s=new Reader();		
		System.out.print("输入读者号:");
		String id=sc.next();          //next()输入String类型
		s.setId(id);		
		System.out.print("输入读者名:");
		String name=sc.next();
		s.setName(name);		
		return s;
	}
}
class Reader {
	private String id;
	private String name;
	public String toString() {
		return id+"\t"+name+"\t";
	}	
	public void setId(String id) {
		this.id=id;
	}
	public String getId() {
		return this.id;
	}	
	public void setName(String name) {
		this.name=name;
	}
	public String getName() {
		return this.name;
	}	
	public Reader(){
	}
	public Reader(String id,String name) {
		this.id=id;
		this.name=name;
	}
}
class Storage3 <T>  {
	SeqList<Lend> list =new SeqList<Lend>();
	Scanner sc=new Scanner(System.in);	
	public void storageInit() {               //添加信息
		list.insert(0,addLend());
		System.out.println("添加完毕!");
	}
	public void storagePrint() {            //显示所有信息
		for(int i=0;i<list.size();i++) {
			System.out.println(i+"\t"+list.get(i));
		}
		System.out.println("共"+list.size()+"个信息!");
	}	
	public void storageUpdate() {            //修改
		System.out.print("输入要修改的借阅编号:");
		int index=sc.nextInt();
		list.set(index, addLend());
		System.out.println("修改完毕!");				
	}	
	public void storageDelete() {                //删除
		System.out.print("输入要删除的借阅编号:");
		int index=sc.nextInt();
		String bookid=list.get(index).getBook();
        for(int i=0;i<Storage1.list.size();i++) {
            if(Storage1.list.get(i).getId().equals(bookid)) {
                Storage1.list.get(i).setNum(Storage1.list.get(i).getNum()+1);
            }
        }
		list.remove(index);
		System.out.println("删除成功!");
	}
	
	public void storageFind() {                     //查找
		Boolean flag=true;
		System.out.print("输入要查找的读者号:");
		String readerid=sc.next();
		for(int i=0;i<list.size();i++) {
			if(list.get(i).getReader().equals(readerid)) {
				System.out.println(i+"\t"+list.get(i));
				flag=false;
			}
		}
		if (flag)
			System.out.println("没有找到");
	}
	
	private Lend addLend() {    //输入信息
		Lend s=new Lend();
		Boolean flag=true;
        while (flag) {
            System.out.print("输入书号:");
            String bookid=sc.next();
            for(int i=0;i<Storage1.list.size();i++) {
                if(Storage1.list.get(i).getId().equals(bookid)) {
                    Storage1.list.get(i).setNum(Storage1.list.get(i).getNum()-1);
                    s.setBook(bookid);
                    flag=false;
                }
            }
			if(flag==true)
                System.out.println("书籍不存在,请重新选择!");
        }
        System.out.print("输入读者号:");
        String readerid=sc.next();
        s.setReader(readerid);
        return s;
	}
}
class Lend {
	public String bookid;
	public String readerid;
	public String toString() {
		return bookid+"\t"+readerid;
	}	
	public void setBook(String bookid) {
		this.bookid=bookid;
	}
	public String getBook() {
		return this.bookid;
	}	
	public void setReader(String readerid) {
		this.readerid=readerid;
	}
	public String getReader() {
		return this.readerid;
	}	
	public Lend(){
	}
	public Lend(String bookid,String readerid) {
		this.bookid=bookid;
		this.readerid=readerid;
	}
}

三、算法描述

3.1 项目介绍

项目包括10个文件,Test是主文件,Book, Reader, Lend是实体类,Storage1,Storage2,Storage3是它们分别对应的存储类。

Book的属性有图书号(id),图书名(name),作者(author),数量(num);Reader的属性有读者号(id)和读者名(name);Lend的属性有图书编号(bookid)和读者编号(readerid)。

Storage1, Storage2和Storage3结构类似,都是先声明一个线性表对象,其中Storage1, Storage2声明的是顺序表对象,Storage3声明的是单链表对象,然后在方法storageInit(),storageDelete(),storageUpdate(),storageFind(),storagePrint()中引用相应存储结构类中的方法分别实现图书信息,读者信息和借阅信息的增删改查操作,addBook() /addReader() /addLend()方法用来存放数据信息,返回相应实体类的对象,作为实现数据存储结构的参数。

主类Test中包括main()方法和管理员菜单方法adminmenu()和用户菜单方法usermenu(),分别用来表示管理员界面和用户界面,再在main()方法中结合if分支结构和switch选择结构,直接调用Storage类中方法,实现对应的功能。

系统的UML图如图所示:

微信图片_20230830134230.jpg

3.2难点剖析

3.2.1数据对象的表示和线性存储结构的实现

考虑到图书信息,读者信息和借阅信息有多个属性,顺序表和单链表的数据对象可以是多种类型,因此用对象表示一组数据,创建实体类对象,通过用户输入为每一个属性赋值,该对象可以作为构造函数和增加操作的参数,方法返回值为该对象,因此使用时可以直接调用方法。

线性存储结构在Storage类中实现,在每个Storage类开头声明一个线性表对象list,图4是顺序表对象,图5是单链表对象,线性表存储数据类型是实体类对象,然后用list对象调用顺序表或单链表中的插入、删除、修改等方法实现数据对象的增删改查操作。

3.2.2借阅信息和图书信息的关联

将借阅信息与图书信息和读者信息关联的思路是使某本图书被借走时,Book类中的num变量,也就是这本图书的数量应减少1,当它被归还时,相应图书的数量要增加1,添加借书记录时,若图书信息表中没有用户输入的书籍,应该产生提示,并提醒用户重新输入正确的书号,若读者信息表中没有用户输入的读者时,也应该产生提示,提醒用户重新输入正确的读者号。

这一思路由循环语句实现,如下图所示,先将Storage1中的list改成静态对象,以便在Storage3类中引用,然后在Storage3类的addLend()方法中建立一个while循环结构,用户输入书号后,将用户输入的书号与图书信息表中的所有书号进行一一对比,如果它与某条记录的书号一样,将这条书籍记录中的数量减一,并退出循环,否则提示用户书籍不存在后重新要求用户输入书号,直到输入正确为止,就实现了借书条件的判断和借书时书籍数量减少。

同理,要实现还书时书籍数量增加,可在storageDelete()方法中引入同样的while循环结构,这时图书信息记录中对应书籍的数量要加一。