基于线性表的图书管理系统(java)

    

目录

    

1、简介 

2、代码

(1)ManageSystem类

(2)book类 

3、测试程序运行结果截图

(1)登录和创建

(2)输出

(3)查找

(4)插入

(5)删除

(6)修改

(7)排序

(8)计数

(9)导出

(10)读入

(11)菜单

4、存在的问题与思考


基于线性表的图书管理系统

1、项目简介 

       顺序表是线性表的顺序存储结构,是指用一组连续的存储单元依次存放线性表的数据元素。在顺序存储结构下,逻辑关系相邻的两个元素在物理位置上也相邻,这是顺序表的特点。

       顺序表适宜于做查找这样的静态操作,顺序存储的优点是存储密度大,存储空间利用率高。缺点是插入或删除元素时不方便,需要移动大量元素o(n),预先分配空间需按最大空间分配,利用不充分,表容量难以扩充。

       要完成这个题目,主要是建立图书信息的存储。本项目采用线性表的顺序存储结构。以图书信息为例,本项目的数据是一组图书信息,每条图书信息由图书ISBN号、图书名称、作者名称、出版社名称等信息组成,这组图书信息具有相同特性,属于同一数据对象,相邻元素之间存在序偶关系,这些数据具有线性表中数据元素的性质,所以该系统的数据采用线性表来存储。本图书管理系统分为两个结构体,一个是图书结构体,用于存放图书的基本信息,另一个是图书管理结构体,实现管理图书的功能。图书的存储结构用ArrayList实现。

       具体存储操作:在ManageSystem类中获取一本书籍的具体信息,通过book类初始化方法实例化为一个book实例,然后存入ManageSystem类中的ArrayList列表中。

2、项目代码

(1)ManageSystem类

package dataStructure;

import java.io.*;
import java.util.*;

public class ManageSystem {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        ArrayList<book> library = new ArrayList<>();

        // 判断登录是否成功
        String LibName = null;
        boolean login = false;
        String[] admin = {"a","b","c","d"};
        String[] password = {"a","b","c","d"};
        while (!login){
            System.out.print("请输入图书管理系统名字:");
             LibName = sc.nextLine();
            System.out.print("请输入图书管理系统密码:");
            String LibPW = sc.nextLine();
            for (String s: admin){
                if (s.equals(LibName) && password[Arrays.binarySearch(admin,s)].equals(LibPW)){
                    library=create();
                    System.out.println("登录成功!当前图书管理系统:"+LibName);
                    System.out.println();
                    login=true;
                }
            }
            if (!login) System.out.println("登录失败!账号或密码有误,请重新输入!");
        }

        boolean exist = true;
        while(exist){
            System.out.println("当前图书管理系统:"+LibName);
            System.out.println(
                    "1、输出图书信息表\n"+
                            "2、查找图书\n"+
                            "3、插入图书信息\n"+
                            "4、删除图书信息\n"+
                            "5、修改指定图书信息\n"+
                            "6、图书排序\n"+
                            "7、图书数量统计\n"+
                            "8、导出图书信息\n"+
                            "9、读入图书信息\n");
            System.out.print("请输入你的选择(输入-1退出系统):");
            if (!sc.hasNextInt()) {
                String string = sc.next();
                System.out.println("输入有误!");
                System.out.println();
            }else {
                int how = sc.nextInt();
                switch(how){
                    case -1:
                        exist = false;
                        break;
                    case 1://显示:输出
                        output(library);
                        break;
                    case 2: //根据ISBN或书名查找图书
                        search(library);
                        break;
                    case 3: //插入
                        book insert = insert();
                        library.add(insert);
                        break;
                    case 4: //根据ISBN号删除图书信息
                        library = delete(library);
                        break;
                    case 5: //根据ISBN修改价格
                        change(library);
                        break;
                    case 6://按照价格排序
                        compare(library);
                        break;
                    case 7: //计数
                        System.out.println("图书馆内一共有" + calculate(library) + "册图书。");
                        break;
                    case 8: //导出
                        try{
                            outputData(library);
                        } catch (IOException e){}
                        break;
                    case 9: //读入
                        try{
                            library=importData(library);
                        } catch (IOException e){}
                        break;
                }
                System.out.println();
            }
        }
    }

    public static ArrayList<book> create(){
        ArrayList<book> library = new ArrayList<>();
        printTitle();
        return library;
    }

    public static void output(ArrayList<book> library){
        printTitle();
        for(book b: library){
            printContent(b);
        }
    }

    public static void search(ArrayList<book> library){
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入您想查询的书籍的ISBN号或名称:");
        String search = sc.nextLine();
        boolean flag = false;
        for(book b : library) {//原本判断条件里面有break,但是考虑到可能有多本相同的图书入库,需要全部输出,因而删除break
            if (search.equals(b.getISBN()) || search.equals(b.getName())) {
                if (!flag){
                    System.out.println("您所查询的图书信息为:");
                    printTitle();
                    flag=true;
                }
                printContent(b);
            }
        }
        if (!flag){
            System.out.println("抱歉!未能找到您想查询的图书。");
        }
    }

    // 0000000010 微观经济学 王陆 中国人民出版社 2003-04-28 54.00 经济类 在架上
    public static book insert(){
        Scanner sc = new Scanner(System.in);
        printTitle();
        System.out.println("请输入新增的书籍的具体信息:");
        String all = sc.nextLine();
        String[] content = all.split(" ");
        book a = new book(content[0],content[1],content[2],content[3],content[4],Double.parseDouble(content[5]),content[6],content[7]);
        System.out.println("书籍加入成功!");
        return a;
    }

    public static ArrayList<book> delete(ArrayList<book> library) {
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入您想删除的书籍的ISBN号:");
        String delete = sc.nextLine();
        boolean flag = false;
        for (int i = 0; i < library.size(); i++) {
            book b = library.get(i);
            if (delete.equals(b.getISBN()) && b.getIson().equals("在架上")) {
                printTitle();
                printContent(b);
                library.remove(i);
                flag = true;
                System.out.println("删除成功!");
                break;
            }
        }
        if (!flag) {
            System.out.println("删除失败!失败原因可能有:1、未能找到您想删除的图书;2、该书不在架上。");
        }
        return library;
    }

    public static ArrayList<book> change(ArrayList<book> library){
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入您想修改价格的图书的ISBN号:");
        String ISBN = sc.nextLine().trim();
        double c = 0;
        boolean right = true;
        for(book a: library){
            if(ISBN.equals(a.getISBN())){
                if (right){
                    System.out.print("请输入修改的价格:");
                    c = sc.nextDouble();
                    right = false;
                }
                a.setPrice(c);
            }
        }
        if(right){
            System.out.println("对不起,找不到您想修改的图书。");
        }
        else {
            System.out.println("修改成功!");
        }
        return library;
    }
    public static void compare(ArrayList<book> library){
        ArrayList<book> cpLibrary = new ArrayList<>(library.size());
        for (book o:library) cpLibrary.add(o);
        cpLibrary.sort(book::compareTo);
        output(cpLibrary);
    }

    public static int calculate(ArrayList<book> library){
        return library.size();
    }

    public static void outputData(ArrayList<book> library) throws IOException {
        File file = new File("book.txt");
        if (file.exists()){
            file.delete();
        }
        file.createNewFile();
        OutputStream fos = new FileOutputStream(file);
        for (book a:library) {
            String str = a.getISBN()+"\t"+a.getName()+"\t"+a.getAuthor()+"\t"+a.getPublish()+"\t"+a.getDate()+"\t"+a.getPrice()+"\t"+a.getType()+"\t"+a.getIson()+"\n";
            fos.write(str.getBytes("UTF-8"));
        }
        fos.close();
        System.out.println("已成功输出至book.txt文件。");
    }

    public static ArrayList<book> importData(ArrayList<book> library) throws IOException {
        File file = new File("book.txt");
        FileInputStream fis = new FileInputStream(file);
        InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
        BufferedReader br = new BufferedReader(isr);
        String len;
        while((len = br.readLine()) != null) {
            String[] content = len.split("\t");
            book a = new book(content[0],content[1],content[2],content[3],content[4],Double.parseDouble(content[5]),content[6],content[7]);
            library.add(a);
        }
        fis.close();
        System.out.println("已成功导入。");
        return library;
    }
    public static void printTitle(){
        String[] title = {"ISBN","书籍名称","作者","出版社","出版日期","价格","类型","状态"};
        for(int i=0;i<title.length;i++){
            System.out.print("|");
            System.out.printf("%-18s",title[i]);
        }
        System.out.println();
        System.out.println("----------------------------------------------------------------------------------------" +
                "-------------------------------------------------------------------------");
    }
    public static void printContent(book b){
        String[] content = {b.getISBN(),b.getName(),b.getAuthor(),b.getPublish(),b.getDate(),String.valueOf(b.getPrice()),b.getType(),b.getIson()};
        for (int j=0;j<content.length;j++){
            System.out.print("|");
            System.out.printf("%-18s",content[j]);
        }
        System.out.println();
        System.out.println("----------------------------------------------------------------------------------------" +
                "-------------------------------------------------------------------------");
    }
}

(2)book类

package dataStructure;

public class book implements Comparable<book> {
    private String ISBN;
    private String name;
    private String author;
    private String publish;
    private String date;
    private double price;
    private String type;
    private String ison;

    public String getISBN() {
        return ISBN;
    }

    public void setISBN(String ISBN) {
        this.ISBN = ISBN;
    }

    public String getName() {
        return name;
    }

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

    public String getAuthor() {
        return author;
    }

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

    public String getPublish() {
        return publish;
    }

    public void setPublish(String publish) {
        this.publish = publish;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public double getPrice() {
        return price;
    }

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

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getIson() {
        return ison;
    }

    public void setIson(String ison) {
        this.ison = ison;
    }

    public book(String ISBN,String name,String author,String publish,String date,double price,String type,String ison){
        this.ISBN = ISBN;
        this.name = name;
        this.author = author;
        this.publish = publish;
        this.date = date;
        this.price = price;
        this.type = type;
        this.ison = ison;
    }

    public int compareTo(book o){
        return Double.compare(getPrice(), o.getPrice());
    }
}

 

3、测试数据集

ISBN

name

author

publish

date

price

type

ison

0000000001

大学计算机基础

陈建勋

高等教育出版社

2007-08-10

58.00

计算机类

在架上

0000000002

C语言

王远林

电子工业出版社

2000-04-12

48.00

计算机类

已借阅

0000000003

组织行为学

刘烨

中国人民出版社

1997-09-28

76.00

管理类

在架上

0000000004

管理学

高敏

清华大学出版社

2020-05-01

57.00

管理类

已借阅

0000000005

统计学

贺天

北京大学出版社

2018-03-23

38.00

数统类

正在订购

0000000006

概率论

李毅

中国工业出版社

2004-05-16

39.00

数统类

在架上

0000000007

糖尿病的正确饮食

钟娅

中国轻工出版社

2020-10-01

89.00

医学类

在架上

0000000008

人体构造

黄远

河北科学出版社

2016-08-13

99.00

医学类

正在订购

0000000009

宏观经济学

刘叶

清华大学出版社

2015-03-10

67.00

经济类

正在订购

0000000010

微观经济学

王陆

中国人民出版社

2003-04-28

54.00

经济类

已借阅

0000000010

微观经济学

王陆

中国人民出版社

2003-04-28

54.00

经济类

已借阅

4、测试程序运行结果截图

(1)登录和创建

(2)输出

 

(3)查找

(4)插入

(5)删除

(6)修改

 


(7)排序

(8)计数

(9)导出

 

(10)读入

 

(11)菜单

5、存在的问题与思考

(1)没有考虑完整异常情况:由于时间原因,在编写代码的时候基本只考虑了输入正确的情况,除了文件导入导出外没有考虑异常情况的处理(try-catch)。但是在代码编写过程中,尽量把可以考虑的情况考虑进去,如在执行功能选择switch语句前,判断输入是否为整数,如果不为整数就输出报错,输入为整数才获取输入,进入switch语句,尽可能保持无异常情况的发生。

(2)功能不够丰富:由于时间原因,完成了基本的要求后只增加了登录功能,其余都是在原有代码基础上进行修改,使得交互更加舒适。

(3)交互效果有待提高:由于没有时间将系统以可视化的方式展现,希望能够在命令行的演示下尽量提高交互效果。在调整交互效果的过程中除了加入很多提示信息,修改图书信息表示方式(尽量模仿表格方式)外,在适当的地方加入了空行以达到分割显示的效果。

(4)没能活用现有类对程序进行简化:我们在考虑“图书出版日期”这一属性时,曾经考虑过采用Date类进行记录,但是由于它的toString方法是转换成一个16进制的数值字符串,不方便在别的方法中进行调用,所以我们直接采用了String类进行记录。但这样不利于后期的改进,对于一些时间记录上的处理也会更麻烦。

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Z-xina

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值