python实现图书管理系统(课设)

2023-11-09

图书管理系统图书管理系统

某图书馆所藏图书如表1所示:

书号

书名

出版社

作者

价格

库存

10001

C语言程序设计

清华大学出版社

张三

51

5

10002

Python程序设计基础

高等教育出版社

李四

45

6

借阅信息如表2所示:

学号

书号

借阅日期

1001

10001

20190309

1002

10002

20190401

学生信息如表3所示

学号

姓名

性别

班级

1001

张三

化学1801

1002

李四

化学1802

主要实现以下功能:

(1)能分别输入表1和表3的信息,并将其分别保存到两个文件

(2)从分别从文件中读出图书信息和学生信息

(3)实现借阅功能:输入学号和书号,如果借阅成功(学号所对应的学生在表3中并且书号所对应的图书在表1中且库存大于等于1),修改表1和表2,并保存到文件

(4)实现还书功能:从表2中删除该学生的借阅信息,并修改表1的库存信息,并保存到文件

(5)输入某学生姓名,可以查询该生的借阅图书信息

(6)输入某书号,可以查询借阅该书的学生信息

(7)统计某出版社的藏书量,统计某学生当前借书量

(8)利用第三方库matplotlib中的pyplot绘制统计图,如绘制各出版社的藏书量折线图

import time

import pandas as pd
import os
import matplotlib.pyplot as plt

# 先定义一个配置类
from Tools.scripts.treesync import raw_input


class Config:
    # 定义表一
    table1_url = "C:\\Users\\Shinelon\\Desktop\\untitled\\resource\\table1.csv"
    table1_header = ["书号", "书名", "出版社", "作者", "价格", "库存"]
    # 定义表二
    table2_url = "C:\\Users\\Shinelon\\Desktop\\untitled\\resource\\table2.csv"
    table2_header = ["学号", "书号", "借阅日期"]
    # 定义表三
    table3_url = "C:\\Users\\Shinelon\\Desktop\\untitled\\resource\\table3.csv"
    table3_header = ["学号", "姓名", "性别", "班级"]


class library_system(object):
    def __init__(self):
        print("图书馆系统初始化中...")
        self.input_table1_table2()
        self.book_table, self.borrow_table, self.student_table = self.get_info_from_file()
        print("图书馆系统初始化完成!")
        self.menu()

    def input_table1_table2(self):
        print("请输入图书馆藏书表")
        table1 = []
        print("输入藏书表:书号 书名 出版社 作者 价格 库存\n")
        x = raw_input('请输入数据:')
        while x != "exit\n":
            y = x.split()
            if len(y) != 6:
                x = raw_input('列数不一致\n请重新输入:')
            else:
                table1.append(y)
                x = raw_input('下一条记录:')
        print("请输入学生信息表")
        table3 = []
        print("输入学生表:学号 姓名 性别 班级\n")
        x = raw_input('请输入数据:')
        while x != "exit\n":
            y = x.split()
            if len(y) != 4:
                x = raw_input('数据列数不一致\n请重新输入:')
            else:
                table3.append(y)
                x = raw_input('下一条记录:')
        table1 = pd.DataFrame(table1)
        table3 = pd.DataFrame(table3)
        table1.to_csv(Config.table1_url, header=Config.table1_header, index=None)
        table3.to_csv(Config.table3_url, header=Config.table3_header, index=None)

    def get_info_from_file(self):
        book_table = pd.read_csv(Config.table1_url)
        borrow_table = []
        student_table = pd.read_csv(Config.table3_url)
        print("信息读取成功...")
        return book_table, borrow_table, student_table

    def save_file(self):
        self.book_table.to_csv(Config.table1_url, header=Config.table1_header, index=None)
        boo = pd.DataFrame(self.borrow_table)
        boo.to_csv(Config.table2_url, header=Config.table2_header, index=None)
        self.student_table.to_csv(Config.table3_url, header=Config.table3_header, index=None)
        print("保存文件成功")

    # 实现借阅功能:输入学号和书号,如果借阅成功(学号所对应的学生在表3中并且书号所对应的图书在表1中且库存大于等于1),修改表1和表2,并保存到文件
    def borrow(self, student_id, book_id):
        flag1=True
        for i in range(len(self.student_table["学号"])):
            if int(self.student_table["学号"][i])==int(student_id):
                print("查询到该学生")
                flag1=False
                for j in range(len(self.book_table["书号"])):
                    if int(self.book_table["书号"][j])==int(book_id) and int(self.book_table["库存"][j])>0:
                        print("库存充足")
                        self.book_table["库存"][j] = str(int(self.book_table["库存"][j])-1)
                        borrow = [student_id,book_id, time.strftime("%d/%m/%Y")]
                        self.borrow_table .append(borrow)
                        self.save_file()
                        break
            if not flag1:
                break
        if flag1:
            print("未查询到该学生")
        print("借阅图书")

    # 实现还书功能:从表2中删除该学生的借阅信息,并修改表1的库存信息,并保存到文件
    def let_back(self, student_id, book_id):
        for j in range(len(self.book_table["书号"])):
            if int(self.book_table["书号"][j])==int(book_id):
                self.book_table["库存"][j] = str(int(self.book_table["库存"][j])+1)
                for i in range(len(self.borrow_table)):
                    if int(self.borrow_table[i][0])==int(student_id) and int(self.borrow_table[i][1])==int(book_id):
                        del self.borrow_table[i]
                        self.save_file()
                        break
                break

        print("还书")

    # 输入某书号,可以查询借阅该书的学生信息
    def find_by_book_id(self, book_id):
        stu_ids=set()
        #先获取对应人的学号
        for i in range(len(self.borrow_table)):
            if int(self.borrow_table[i][1])==int(book_id):
                stu_ids.add(int(self.borrow_table[i][0]))
        stu=[]
        for i in range(len(self.student_table["学号"])):
            if int(self.student_table["学号"][i]) in stu_ids:
                stu.append(self.student_table.iloc[i])
        print("查询借了某本书的学生信息")
        print(stu)

    def sum_by_student_id(self, student_id):
        sum=0
        for i in range(len(self.borrow_table)):
            if int(self.borrow_table[i][0])==int(student_id):
                sum+=1
        print("统计某学生当前借书量"+str(sum))

    # 统计某出版社的藏书量,统计某学生当前借书量
    def sum_by_publish(self, publish_name):
        book_id = set()
        sum=0
        for i in range(len(self.book_table["出版社"])):
            if  str(self.book_table["出版社"][i])==str(publish_name):
                book_id.add(int(self.book_table["出版社"][0]))
                sum+=int(self.book_table["库存"][i])
        for i in range(len(self.borrow_table)):
            if self.borrow_table[i][1] in book_id:
                sum+=1
        print(str(publish_name)+"统计藏书量"+str(sum))
        return sum

    # 输入某学生姓名,可以查询该生的借阅图书信息
    def find_by_student_name(self, student_name):
        stu_id=set()
        for i in range(len(self.student_table["姓名"])):
            if str(self.student_table["姓名"][i])==str(student_name):
                stu_id.add(int(self.student_table["学号"][i]))
                print("找到")
        book_id=set()
        res=[]
        for i in range(len(self.borrow_table)):
            if int(self.borrow_table[i][0]) in stu_id:
                book_id.add(int(self.borrow_table[i][1]))
        for i in range(len(self.book_table["书号"])):
            if int(self.book_table["书号"][i]) in book_id:
                res.append(self.book_table.iloc[i])
        print("查询某学生的借书信息")
        print(res)
    #获取各出版社的藏书量折线图
    def get_publish(self):
        pub = set()
        for i in range(len(self.book_table["出版社"])):
            pub.add(str(self.book_table["出版社"][i]))
        pubL = list(pub)
        x1 = range(len(pubL))
        numL = []
        for i in range(len(pubL)):
            numL.append(self.sum_by_publish(pubL[i]))
        plt.title('各出版社的藏书量折线图')
        plt.xlabel('出版社名字')
        plt.ylabel('藏书量')
        plt.plot(pubL, numL, 'r', label='藏书量')
        plt.xticks(x1, pubL, rotation=0)
        plt.legend()
        plt.grid()
        plt.show()
        # 利用第三方库matplotlib中的pyplot绘制统计图,如绘制各出版社的藏书量折线图,绘制各学生借书量的饼图等

    def get_stu(self):
        stu_id = set()
        for i in range(len(self.student_table["学号"])):
            stu_id.add(int(self.student_table["学号"][i]))
        stuL = list(stu_id)
        numL = []
        for i in range(len(stuL)):
            numL.append(self.sum_by_student_id(stuL[i]))

        plt.rcParams['font.sans-serif'] = 'SimHei'  # 设置中文显示
        plt.figure(figsize=(6, 6))  # 将画布设定为正方形,则绘制的饼图是正圆
        plt.pie(numL,  labels=stuL, autopct='%1.1f%%')  # 绘制饼图
        plt.title('2018年饼图')  # 绘制标题
        plt.show()
    # 1绘制各出版社的藏书量折线图,2绘制各学生借书量的饼图
    def show_diaglo(self,chos):
        if str(chos)=="1":
            self.get_publish()
        if str(chos)=='2':
            self.get_stu()
        print("展现图表")

    def cls(self):
        os.system("cls")

    def menu(self):
        level_1_choose = raw_input("按回车继续")
        while level_1_choose != "exit\n":
            self.cls()
            print("图书管理系统菜单\n")
            print("1 借阅功能 请输入: 1 学号 书号")
            print("2 还书功能 请输入: 2 学号 书号")
            print("3 查询学生借阅信息 请输入: 3 学生姓名")
            print("4 查询借该书的学生信息 请输入: 4 书号")
            print("5 统计某出版社的藏书量 请输入: 5 出版社名")
            print("6 统计某学生当前的借书量 请输入: 6 学生学号")
            print("7 绘图功能 请输入:7")
            level_1_choose = raw_input("请选择1-7你要选择的功能,输入exit退出")
            turn = True
            while turn:
                sp = level_1_choose.split()
                # 1-7
                if sp[0] == "1":
                    if len(sp) == 3:
                        self.borrow(sp[1], sp[2])
                        turn = False
                    else:
                        turn = True
                        level_1_choose = raw_input("输入错误,请重新输入\n")
                elif sp[0] == "2":
                    if len(sp) == 3:
                        self.let_back(sp[1], sp[2])
                        turn = False
                    else:
                        turn = True
                        level_1_choose = raw_input("输入错误,请重新输入\n")
                elif sp[0] == "3":
                    if len(sp) == 2:
                        self.find_by_student_name(sp[1])
                        turn = False
                    else:
                        turn = True
                        level_1_choose = raw_input("输入错误,请重新输入\n")
                elif sp[0] == "4":
                    if len(sp) == 2:
                        self.find_by_book_id(sp[1])
                        turn = False
                    else:
                        turn = True
                        level_1_choose = raw_input("输入错误,请重新输入\n")
                elif sp[0] == "5":
                    if len(sp) == 2:
                        self.sum_by_publish(sp[1])
                        turn = False
                    else:
                        turn = True
                        level_1_choose = raw_input("输入错误,请重新输入\n")
                elif sp[0] == "6":
                    if len(sp) == 2:
                        self.sum_by_student_id(sp[1])
                        turn = False
                    else:
                        turn = True
                        level_1_choose = raw_input("输入错误,请重新输入\n")
                elif sp[0] == "7":
                    if len(sp) == 2:
                        self.show_diaglo(sp[1])
                        turn = False
                    else:
                        turn = True
                        level_1_choose = raw_input("输入错误,请重新输入\n")
                else:
                    turn = True
                    level_1_choose = raw_input("输入错误,请重新输入\n")


if __name__ == '__main__':
    ls = library_system()

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python实现图书管理系统(课设) 的相关文章

随机推荐

  • 关于SAR的研究热点——几点思考

    关于SAR的研究热点 几点思考 SAR研究热点之一 新体制论证 SAR系统设计追求的目标 图像质量高 空间和辐射分辨率高 成像幅宽大 具备多模式 扫描 可变入射角条带 斜视 聚束 多波段 全极化 三维成像 动目标检测与成像能力 对平台运动姿
  • 今日头条自媒体矩阵运营攻略

    你今天通常做什么 许多人用它来娱乐八卦 寻找乐趣 并打发时间 但对于媒体和品牌来说 它是一个非常好的操作平台 基于媒体矩阵标题数量的改进及其独特的推荐机制 公司传播品牌 打造个人品牌非常友好 今天我们讨论了标题号如何快速建立个人品牌的综合潜
  • Hexo一些实用的插件

    Hexo的插件真是个好东西 一开始部署博客的时候并没有太在意插件的问题 毕竟觉得博客主题自带的插件挺全面的 足够使用了 但是用久了总是会腻 就想着静态博客能不能整一些新操作 即使只是添加点小功能 于是就翻了翻 Hexo 的插件目录 挑了些比
  • Android BLE学习笔记

    http blog csdn net xiaoyaoyou1212 article details 51854454 个人网站 http www xiaoyaoyou1212 com 欢迎吐槽围观 前言 本文主要描述Android BLE的
  • 链式基数排序(第十章 P286 算法10.15,10.16,10.17)

    链式基数排序 概述 基数排序 radix sort 属于 分配式排序 distribution sort 基数排序也叫做多关键字排序 基数排序是一种借助 多关键字排序 的思想来实现 单关键字排序 的内部排序算法 多关键字排序的方法 n 个记
  • fastjson 重复引用和循环引用问题

    数据传输使用json格式再方便不过了 fastjson 由阿里巴巴那伙人使用Java语言编写 号称最快的JSON库前两天遇到一个问题 后台的数据转化为json字符串后发送到前台出现了 ref字样的东西 后来明白了这是引用 在传输的数据中出现
  • 【LKM】makefile的支持c99的方法: ccflags-y := -std=c99

    如果写的C代码中 变量的定义在 函数之后 则会warning warning ISO C90 forbids mixed declarations and code Wdeclaration after statement 解决办法 1 正
  • 子关卡卸载actor不完全的问题解决。

    在子关卡中 actorA里面挂接n个actor 结果卸载actorA时 挂接的那些actor没有随之卸载掉 解决办法也简单 给这些actor设置owner为actorA即可 即在actorA所在的类里 生成这些挂载的actor时 FActo
  • linux在欢迎界面restart,[Linux]如何手动触发kernel restart

    所谓Linux panic就是碰到错误情况时 code里主动调的一个函数panic 里面出不来 会让cpu重启 不允许再乱执行代码 以便保留现场 像下面这个例子 就是在kernel fault函数里检查到非法无效地址访问后的错误处理 主动调
  • MySQL的服务层和存储引擎层

    1 服务层 Server Layer 服务层是MySQL的顶层组件 负责处理客户端与MySQL服务器之间的交互 它提供了一组API和协议 使应用程序能够连接到MySQL服务器 并发送查询 事务管理 用户权限控制等请求 服务层负责解析和优化查
  • 区块链技术关键词

    区块链技术 区块链是一种分布式账本技术 通过将数据以区块的形式依次链接在一起 并使用密码学技术保证安全性和一致性 加密货币 加密货币是基于区块链技术的数字资产 例如比特币 Bitcoin 和以太坊 Ethereum 等 它们使用区块链来记录
  • neo4j入门(三) 在数据库已知存在的节点上创建新的边

    from py2neo import Graph Node Relationship from py2neo import NodeSelector graph Graph http localhost 7474 username neo4
  • POJ1753 FlipGame

    分类 状压 暴力枚举 参考博客 https www cnblogs com honeycat p 5176211 html 代码是这位博主原创的 加了点注释 题目 http poj org problem id 1753 1 用16位的in
  • 解决由于找不到xxx.dll,无法继续执行代码的问题

    在用vs写项目 或者你下载github上的C 代码的时候 是不是经常遇到由于找不到xxx dll 无法继续执行代码的问题 其实很简单 解决方法如下 首先 对应于不同的运行模式 debug和release 方法都是一样的 找到你项目目录下 项
  • ctfhub-web-密码口令

    弱口令 先尝试admin password 尝试admin admin 默认口令 一般这种题目都是要去找这个产品的默认密码
  • “卷”资金抢人才,一文看懂国产AI大模型竞争格局|钛度图闻

    神仙打架 大佬 下凡 编辑 刘亚宁 孙骋 作图 初彦墨 策划制作 钛媒体视觉中心 6月29日 美团在港交所发布公告 宣布收购王慧文创办的大模型公司 光年之外 这也给AI大模型市场留下了猜测 不只在国内 ChatGPT的访问量在近期增速下滑
  • QCC300x笔记(2) -- QCC3007芯片入门进阶(二)

    哈喽大家好 这是该系列博文的第二篇 篇 lt lt 系列博文索引 快速通道 gt gt 接着上一篇 这一篇主要讲解如何使用ADK Configuration Tool修改固件的常用配置一 在线模式 Go Configurable Read
  • 用Nginx+Redis实现session共享的均衡负载

    原文地址 https segmentfault com a 1190000004708640 前言 大学三年多 也做个几个网站和APP后端 老是被人问到 如果用户多了服务器会不会挂 总是很尴尬的回答 哈哈 我们的用户还少 到了服务器撑不住的
  • 一条链接获取你的照片【附源码】

    测试链接 https sunpma com other xiangjiquanxian 无论是手机还是pc 都会被获取 请谨慎点击 直接申请获取相机权限 拍照上传到服务器 现在众多手机APP乱用权限并窃取用户隐私 大家要注意保护好自己 代码
  • python实现图书管理系统(课设)

    图书管理系统图书管理系统 某图书馆所藏图书如表1所示 书号 书名 出版社 作者 价格 库存 10001 C语言程序设计 清华大学出版社 张三 51 5 10002 Python程序设计基础 高等教育出版社 李四 45 6 借阅信息如表2所示