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

news2025/1/17 9:02:35

    

目录

    

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类进行记录。但这样不利于后期的改进,对于一些时间记录上的处理也会更麻烦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/117112.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何用乐高积木式操作让 ChatGPT 变得更强大?

需求这些日子&#xff0c;很多小伙伴儿玩儿 ChatGPT 不亦乐乎&#xff0c;甚至陷入了沉迷。他们尝试了各种 ChatGPT 的功能。不少功能强悍到不可思议&#xff1b;当然&#xff0c;也有些功能尝试因遇到障碍无法完成。于是很多用户非常失望&#xff0c;觉得 ChatGPT 好像啥都干不…

20221227:Rockchip-RK模型转换

Tips: 不同芯片对应的NPU和toolkit是不同的,注意区分! 平台 RK1808/RK1806 RV1109/RV1126 RKNPU:本工程主要为Rockchip NPU提供驱动、示例等。 GitHub - rockchip-linux/rknpuContribute to rockchip-linux/rknpu development by creating an account on GitHub.https://gi…

小程序项目开发

目录 一&#xff0c;flex弹性布局 1.什么是flex布局&#xff1f; 2.flex属性 3.视图层 View WXML 1数据绑定 2.列表渲染 3.条件渲染 4.模板 5. 数据处理 二&#xff0c;轮播图--组件的使用 1.WXSS 样式导入 内联样式 选择器 全局样式与局部样式 WXS 页面渲染 三&…

zabbix常用监控项解读

CPU来源模板&#xff1a;Template Module Linux CPU by Zabbix agent 内存&#xff08;memory&#xff09;来源模板&#xff1a;Template Module Linux memory by Zabbix agent 磁盘空间&#xff08;disk&#xff09; 数据来源&#xff1a;Get /proc/diskstats 监控项原型&am…

【小5聊】ElementUI-Vue3-TS项目简单创建

vue2升级到vue3&#xff0c;不管任何框架&#xff0c;升级总有它改进的地方和原因&#xff0c;否则升级就毫无意义&#xff0c;技术变化日新月异&#xff0c;必须保持与时俱进&#xff0c;否则就很容易在技术的浪潮中被淘汰&#xff01; vue3相比以前版本&#xff0c;最大一个变…

PyTorch笔记 - Normalization Layer (Batch\Layer\Instance\Group\Weight)

欢迎关注我的CSDN:https://blog.csdn.net/caroline_wendy 本文地址:https://blog.csdn.net/caroline_wendy/article/details/128416962 Normalization in NN: Batch Normalization: per channel across mini-batchtorch.nn.BatchNorm1d / torch.nn.BatchNorm2dLayer Normaliz…

Hive+Spark离线数仓工业项目--数仓维度层DWS层构建(1)

维度建模回顾&#xff1a;建模流程 目标&#xff1a;掌握维度建模的建模流程 实施 step1-需求调研&#xff1a;业务调研和数据调研 - 了解整个业务实现的过程 - 收集所有数据使用人员对于数据的需求 - 整理所有数据来源 step2-划分主题域&#xff1a;面向业务将业务…

盘点五款免费在线进销存系统

本文将介绍&#xff1a;1、五款好用的免费在线进销存系统&#xff1b;2、如何选择进销存软件 免费进销存是企业尝试使用进销存软件的开端&#xff0c;只有尝试之后&#xff0c;才能知道这款软件是否适合本企业的发展。然而&#xff0c;免费购买、销售和库存管理软件并不能用几个…

华为开源自研AI框架昇思MindSpore数据处理:性能优化

目录一、环境准备1.进入ModelArts官网2.使用CodeLab体验Notebook实例二、下载数据集三、数据加载性能优化四、shuffle性能优化五、数据增强性能优化六、操作系统性能优化七、自动数据加速八、数据异构加速数据是整个深度学习中最重要的一环&#xff0c;因为数据的好坏决定了最终…

基于C语言学生信息教务管理系统编程设计含科目、总分、平均分

一.实现功能 1.从键盘添加学生信息 2.从文件添加学生信息 3.显示学生信息到屏幕 4.显示学生信息到文件 5.删除学生信息 6.插入学生信息 7.查找学生信息 8.成绩排名 选1录信息 输入五个人信息 选3 选7查找信息 选2&#xff0c;导入文件 导完显示信息&#xff0c;但是中文有…

国产软件不背黑锅,4款强大又实用的电脑软件,用了舍不得卸载

国产软件常背黑锅“流氓、付费、广告多”&#xff0c;然而有些小众软件却非常良心强大&#xff0c;实在不该被牵连。 1、电脑图像工具箱 这是一个极其好用的图片处理百宝工具箱&#xff0c;完全免费无广告&#xff0c;集成工具超百个&#xff0c;功能包括&#xff1a;图像处理、…

洛谷千题详解 | P1027 [NOIP2001 提高组] Car 的旅行路线【C++语言】

博主主页&#xff1a;Yu仙笙 专栏地址&#xff1a;洛谷千题详解 目录 题目描述 输入格式 输出格式 输入输出样例 解析&#xff1a; 0.0.题意: 1.1.建图 2.2.最短路 C源码&#xff1a; C源码2&#xff1a; C源码3&#xff1a; ------------------------------------------------…

离散数学实践二编程判断关系R的性质【java实现】

文章目录实验要求思路完整代码结果展示实验要求 判断关系 R 是否为自反关系 实验类型&#xff1a;设计性实验目的 通过算法设计并编程实现对给定集合上的关系是否为自反关系的判断&#xff0c;加深学生对关系性质的理解&#xff0c;掌握用矩阵来判断关系性质的方法。 实验内容…

【Python】沃罗诺伊图 | KNN 最邻近算法 | Voronoi 函数

猛戳&#xff01;跟哥们一起玩蛇啊 &#x1f449; 《一起玩蛇》&#x1f40d; 写在前面&#xff1a;上一章我们介绍了介计算几何领域的德劳内三角剖分&#xff0c;我们提到过关于点集的很多种几何图都与德劳内三角剖分密切相关&#xff0c;其中最具代表的就是我们本章要介绍的 …

运营商展望来年再提2B市场,然而拯救4G/5G业务的都是手机用户

2022年即将结束&#xff0c;各个行业都开始进行年终盘点并对来年的业务进行规划&#xff0c;三大运营商也对此进行了展望&#xff0c;媒体报道指运营商对来年的发展偏向于2B市场&#xff0c;这已不是它们第一次提偏重企业市场了&#xff0c;然而现实来看拯救这些运营商的其实一…

详解SpringBean的作用域(Scopes)

文章目录一、SpringBean作用域总览二、"singleton" Bean作用域三、"prototype" Bean作用域1、验证singleton、prototype类型的Bean2、总结四、"request" Bean作用域1、配置2、简介五、"session" Bean作用域1、配置2、简介3、总结sessi…

《哈希表》

【一】哈希概念 顺序结构以及平衡树中&#xff0c;元素关键码与其存储位置之间没有对应的关系&#xff0c;因此在查找一个元素时&#xff0c;必须要经过关键码的多次比较&#xff0c;顺序查找时间的复杂度为O(N),平衡树中为树的高度&#xff0c;即O(log2N),搜索的效率取决于搜…

JavaWeb技术栈概述

1.1 Web概述 Web是全球广域网&#xff0c;也称为万维网&#xff08;www&#xff09;&#xff0c;能够通过浏览器访问的网站。 在我们日常的生活中&#xff0c;经常会使用浏览器去访问百度、京东、传智官网等这些网站&#xff0c;这些网站统称为Web网站。如下就是通过浏览器访问…

实验三 第四章 MongoDB 副本集

一、实验目的&#xff1a; 了解MongoDB副本集 熟悉MongoDB副本集成员 掌握MongoDB副本集部署 掌握MongoDB副本集操作 理解副本集机制 二、实验环境&#xff1a; 一台win10系统的笔记本电脑 三、实验内容&#xff1a; 4.3部署副本集 4.3.1环境准备 创建的三台虚拟机配置如下&a…

python中的split()、rsplit()、splitlines()用法比较

1 split() 从左向右切割2 rsplit() 从右向左分割3 splitlines() 根据换行符切割4 rsplit()妙用split(分隔符&#xff0c;分割几次)从左向右寻找&#xff0c;分割元素并放入列表中&#xff0c;该分隔符丢弃&#xff1b; rsplit(分隔符&#xff0c;分割几次)从右向左寻找&#x…