基于python的图书信息管理系统

实验任务和要求

设计并实现一个图书信息管理系统。根据实验要求设计该系统的菜单和交互逻辑,并编码实现增删改查的各项功能。 该系统至少包含以下功能:

(1) 根据指定图书个数,逐个输入图书信息;

(2) 逐个显示图书表中所有图书的相关信息;

(3) 能根据指定的待入库的新图书的位置和信息,将新图书插入到图书表中指定的位置;

(4) 根据指定的待出库的旧图书的位置,将该图书从图书表中删除;

(5) 能统计表中图书个数;

(6) 实现图书信息表的图书去重;

(7) 实现最爱书籍查询,根据书名进行折半查找,要求使用非递归算法实现,成功返回此书籍的书号和价格;

(8) 图书信息表按指定条件进行批量修改;

(9) 利用快速排序按照图书价格降序排序;

(10)实现最贵图书的查找;

相关算法实现方案

1、主界面代码部分

此函数主要就是使用print打印出主界面

def show_choose():print("==========================图书信息管理系统==========================")print()print("-----------------------------功能菜单------------------------------")print()print("                         1.录入图书信息")print("                         2.查找图书信息")print("                         3.删除图书信息")print("                         4.修改图书信息")print("                         5.排序图书信息")print("                         6.统计图书总数")print("                         7.显示图书信息")print("                         8.查找最贵图书")print("                         0.退出信息管理系统")print()print("------------------------------------------------------------------")

2、录入图书信息函数代码部分

在这个函数中实现的功能是录入图书书号,图书名称,图书价格并将其写入文件中,每一行为一个图书的信息存储

# 录入图书信息
def input_info():def r_sort():  # 按书号由小到大排序file1 = open('ifile.txt', 'r')  # 以可读方式打开文件,读取到line_info中,每一行就是一个列表的元素line_info = file1.readlines()file2 = open('ifile.txt', 'w')  # 用以写入修改后的数据for j in range(0, len(line_info) - 1):# 假设找到的最小元素下标为jmin_index = j# 寻找最小元素的过程for i in range(j + 1, len(line_info)):# 假设最小下标的值,大于循环中一个元素,那么就改变最小值的下标if line_info[min_index].split()[0] > line_info[i].split()[0]:min_index = i# 为了容错处理,因为循环一开始就假设把最小值的下标j赋值给变量min_indexif j != min_index:# 在不停的循环中,不停的交换两个不一样大小的值temp=line_info[min_index]line_info[min_index]=line_info[j]line_info[j]=tempfor line in line_info:  # 遍历列表file2.write(line)file1.close()file2.close()infile_info = open('ifile.txt', 'a')  # 以追加的方式向文件中写入数据,如果文件不存在就创建一个文件findfile_info = open('ifile.txt', 'r')  # 以可读方式打开文件line_info = findfile_info.readlines()flag = 'y'# 向文件中录入图书信息,每一个图书的信息单独占一行while flag == 'y' or flag == 'Y':book_id = input("请输入图书书号(如9787302257646):")f = 0  # 0表示书号未重复for line in line_info:if line.split()[0]==book_id:f=1print("该图书已经存在!!")breakif f==1:    # 若书号重复则继续进行输入书号操作continuebook_name = input("请输入图书书名:")book_price = input("请输入图书价格:")book_info = book_id + '\t' + book_name + '\t' + book_price + '\n'infile_info.write(book_info)flag = input("是否继续添加图书信息?y/n")print("信息录入完毕!!!")infile_info.close()r_sort()  # 重新排序方便之后的折半查找算法

3、查找图书信息函数代码部分

此函数主要是按图书的书号进行折半查询,若查无此书则输出提示信息

# 查询图书信息
def find_info():flag = 'y'while flag == 'y' or flag == 'Y':n = 0m = 0  # 定义m,n是为了用作判断文件中是否有此人信息的标记findfile_info = open('ifile.txt', 'r')  # 以可读方式打开文件line_info = findfile_info.readlines()find_id = input('请输入图书书号:')length=len(line_info)first=0last=length-1while first<=last:  # 根据书号进行折半查找mid=(first+last)//2print(line_info[mid].split()[0])if find_id in line_info[mid]:print(line_info[mid])n = n + 1breakelif find_id<line_info[mid].split()[0]:last=mid-1else:first=mid+1if n == 0:print("没有查询到图书信息,无数据显示!!!")findfile_info.close()flag = input("是否继续查询图书信息?y/n")

折半查找算法(非递归)

折半查找( Binary Search)技术,又称为二分查找。它的前提是线性表中的记录必须是关键码有序( 通常从小到大有序),线性表必须采用顺序存储。折半查找的基本思想是:在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区继续查找。不断重复上述过程,直到查找成功,或所有查找区域无记录,查找失败为止。

def binary_search(alist,item):n= len(alist)first = 0last = n - 1while first < last:mid = (first + last)//2if alist[mid] == item:return Trueelif item < alist[mid]:last = mid - 1else:first = mid + 1return False

4、删除图书信息函数代码部分

此函数的主要功能是执行删除操作,输入书号进行查找,查找到图书信息之后,对图书信息进行删除

# 删除图书信息
def del_info():flag = 'y'while flag == 'y' or flag == 'Y':n = 0  # 用以查无图书时的标记defile_info1 = open('ifile.txt', 'r')  # 以可读方式打开文件line_info = defile_info1.readlines()  # 将文件的信息按行全部读取出来,此时line_info是一个列表,每一行是一个元素defile_info2 = open('ifile.txt', 'w')  # 以可写方式打开文件,用来将删除后的信息写入文件del_id = input("请输入要删除的图书书号:")for line in line_info:  # 如果要删除的图书书号在文件存储的信息中,就将后面的信息向前移动覆盖这条信息if del_id in line:continuedefile_info2.write(line)n = n + 1if n == len(line_info):print("无此图书信息,请核对后再操作!!!")else:print("书号为{0}的图书信息已被删除!!!".format(del_id))defile_info1.close()defile_info2.close()flag = input("是否继续删除图书信息?y/n")

5、修改图书信息代码部分

此函数的功能是对图书信息进行修改,当输入书号后,查询到学生信息之后,对学生信息进行修改

# 修改图书信息
def mod_info():flag = 'y'while flag == 'y' or flag == 'Y':n = 0  # 用以查无此书时的标记mod_id = input("请输入要修改的图书书号:")modfile_file1 = open('ifile.txt', 'r')  # 以可读方式打开文件,读取到line_info中,每一行就是一个列表的元素line_info = modfile_file1.readlines()modfile_file2 = open('ifile.txt', 'w')  # 用以写入修改后的数据for line in line_info:  # 遍历列表if mod_id in line:  # 如果修改的图书信息存在,就重新写入图书信息print("已找到图书,请修改信息!")mod_name = input("请输入书名:")mod_price = input("请输入价格:")mod_stu_info = mod_id + '\t' + mod_name + '\t' + mod_price +  '\n'modfile_file2.write(mod_stu_info)print("修改成功!!!")continuemodfile_file2.write(line)  # 由于w方式打开的文件重新后会覆盖原有数据,所以需要将原有数据写入n = n + 1if n == len(line_info):print("无此图书信息,请核对后再操作!!!")else:print("书号为{0}的图书信息已修改!!!".format(mod_id))modfile_file1.close()modfile_file2.close()flag = input("是否继续修改图书信息?y/n")

6、按照图书价格排序代码部分

此函数利用了快速排序按照图书价格进行排序

# 排序图书信息
def sort_info():flag = 'y'def quick_sort(line_info,first,last):     # 利用快速排序按照图书价格降序排序if first>=last:returnmid=line_info[first]mid_value=line_info[first].split()[2]low=firsthigh=lastwhile low<high:# high 左移while low<high and line_info[high].split()[2]<=mid_value:high-=1line_info[low]=line_info[high]while low < high and line_info[low].split()[2] > mid_value:low+=1line_info[high] = line_info[low]# 从循环退出时,low==highline_info[low]=mid# 对左边的列表执行快速排序quick_sort(line_info, first, low-1)# 对右边的列表执行快速排序quick_sort(line_info, low+1, last)while flag == 'y' or flag == 'Y':sortfile_info = open('ifile.txt', 'r')  # 可读方式打开文件,并读取信息line_info中line_info = sortfile_info.readlines()length=len(line_info)quick_sort(line_info,0,length-1)for line in line_info:print(line)flag = input("是否继续排序信息?y/n")

快速排序算法

快速排序的基本思想是:通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,已达到整个序列有序的目的

def quick_sort(alist,first,last):if first >= last:returnmid_value = alist[first]low=firsthigh=lastwhile low < high:# high左移while low < high and alist[high] >= mid_value:high -= 1alist[low] = alist[high]while low < high and alist[high] < mid_value:low += 1alist[high] = alist[low]# 从循环退出时,low==highalist[low]=mid_value# 对low左边的列表执行快速排序quick_sort(alist,first,low-1)# 对low右边的列表执行快速排序quick_sort(alist,low+1,last)

7、统计学生总数函数代码部分

此函数主要是输出信息系统中有几本图书

# 统计图书总数
def sum_info():sumfile_info = open('ifile.txt', 'r')line_info = sumfile_info.readlines()sum_stu = len(line_info)  # 写出列表中的元素个数print("一共有{0}个图书。".format(sum_stu))sumfile_info.close()

8、显示图书信息函数代码部分

此函数是将文件存储的图书信息全部显示出来

# 显示图书信息
def show_info():print("书号", end='\t\t\t\t')print("书名", end='\t\t\t\t\t')print("价格", end='\t\t\t\t')print('\n')showfile_info = open('ifile.txt', 'r')line_info = showfile_info.readlines()for line in line_info:  # 遍历列表,输出各个元素print(line)showfile_info.close()

9、实现最贵图书的查找代码部分

此函数可以实现最贵图书的查找

# 查找最贵图书
def get_info():def take_price(elem):return int(elem[2])sortfile_info = open('ifile.txt', 'r')  # 可读方式打开文件,并读取信息line_info中line_info = sortfile_info.readlines()# 定义列表,用来将读取出来的字符串信息,转化为列表lst = []for i in range(0, len(line_info)):lst.append('lst' + str(i))i = 0for line in line_info:  # 遍历列表,将信息转化为单独的列表,并去掉\t和\n,方便接下来的排序比较line = line.replace('\n', '')lst[i] = line.split('\t')i = i + 1lst.sort(key=take_price, reverse=True)print("最贵的图书是:")print(lst[0])

最后,需要在程序末尾执行main(),完成后运行函数,就可以正常运行了。

运行结果部分截图

以上为菜单界面

源码

# 录入图书信息
def input_info():def r_sort():  # 按书号由小到大排序file1 = open('ifile.txt', 'r')  # 以可读方式打开文件,读取到line_info中,每一行就是一个列表的元素line_info = file1.readlines()file2 = open('ifile.txt', 'w')  # 用以写入修改后的数据for j in range(0, len(line_info) - 1):# 假设找到的最小元素下标为jmin_index = j# 寻找最小元素的过程for i in range(j + 1, len(line_info)):# 假设最小下标的值,大于循环中一个元素,那么就改变最小值的下标if line_info[min_index].split()[0] > line_info[i].split()[0]:min_index = i# 为了容错处理,因为循环一开始就假设把最小值的下标j赋值给变量min_indexif j != min_index:# 在不停的循环中,不停的交换两个不一样大小的值temp=line_info[min_index]line_info[min_index]=line_info[j]line_info[j]=tempfor line in line_info:  # 遍历列表file2.write(line)file1.close()file2.close()infile_info = open('ifile.txt', 'a')  # 以追加的方式向文件中写入数据,如果文件不存在就创建一个文件findfile_info = open('ifile.txt', 'r')  # 以可读方式打开文件line_info = findfile_info.readlines()flag = 'y'# 向文件中录入图书信息,每一个图书的信息单独占一行while flag == 'y' or flag == 'Y':book_id = input("请输入图书书号(如9787302257646):")f = 0  # 0表示书号未重复for line in line_info:if line.split()[0]==book_id:f=1print("该图书已经存在!!")breakif f==1:    # 若书号重复则继续进行输入书号操作continuebook_name = input("请输入图书书名:")book_price = input("请输入图书价格:")book_info = book_id + '\t' + book_name + '\t' + book_price + '\n'infile_info.write(book_info)flag = input("是否继续添加图书信息?y/n")print("信息录入完毕!!!")infile_info.close()r_sort()  # 重新排序方便之后的折半查找算法
# 查询图书信息
def find_info():flag = 'y'while flag == 'y' or flag == 'Y':n = 0m = 0  # 定义m,n是为了用作判断文件中是否有此人信息的标记findfile_info = open('ifile.txt', 'r')  # 以可读方式打开文件line_info = findfile_info.readlines()find_id = input('请输入图书书号:')length=len(line_info)first=0last=length-1while first<=last:  # 根据书号进行折半查找mid=(first+last)//2print(line_info[mid].split()[0])if find_id in line_info[mid]:print(line_info[mid])n = n + 1breakelif find_id<line_info[mid].split()[0]:last=mid-1else:first=mid+1if n == 0:print("没有查询到图书信息,无数据显示!!!")findfile_info.close()flag = input("是否继续查询图书信息?y/n")
# 删除图书信息
def del_info():flag = 'y'while flag == 'y' or flag == 'Y':n = 0  # 用以查无图书时的标记defile_info1 = open('ifile.txt', 'r')  # 以可读方式打开文件line_info = defile_info1.readlines()  # 将文件的信息按行全部读取出来,此时line_info是一个列表,每一行是一个元素defile_info2 = open('ifile.txt', 'w')  # 以可写方式打开文件,用来将删除后的信息写入文件del_id = input("请输入要删除的图书书号:")for line in line_info:  # 如果要删除的图书书号在文件存储的信息中,就将后面的信息向前移动覆盖这条信息if del_id in line:continuedefile_info2.write(line)n = n + 1if n == len(line_info):print("无此图书信息,请核对后再操作!!!")else:print("书号为{0}的图书信息已被删除!!!".format(del_id))defile_info1.close()defile_info2.close()flag = input("是否继续删除图书信息?y/n")
# 修改图书信息
def mod_info():flag = 'y'while flag == 'y' or flag == 'Y':n = 0  # 用以查无此书时的标记mod_id = input("请输入要修改的图书书号:")modfile_file1 = open('ifile.txt', 'r')  # 以可读方式打开文件,读取到line_info中,每一行就是一个列表的元素line_info = modfile_file1.readlines()modfile_file2 = open('ifile.txt', 'w')  # 用以写入修改后的数据for line in line_info:  # 遍历列表if mod_id in line:  # 如果修改的图书信息存在,就重新写入图书信息print("已找到图书,请修改信息!")mod_name = input("请输入书名:")mod_price = input("请输入价格:")mod_stu_info = mod_id + '\t' + mod_name + '\t' + mod_price +  '\n'modfile_file2.write(mod_stu_info)print("修改成功!!!")continuemodfile_file2.write(line)  # 由于w方式打开的文件重新后会覆盖原有数据,所以需要将原有数据写入n = n + 1if n == len(line_info):print("无此图书信息,请核对后再操作!!!")else:print("书号为{0}的图书信息已修改!!!".format(mod_id))modfile_file1.close()modfile_file2.close()flag = input("是否继续修改图书信息?y/n")
# 排序图书信息
def sort_info():flag = 'y'def quick_sort(line_info,first,last):     # 利用快速排序按照图书价格降序排序if first>=last:returnmid=line_info[first]mid_value=line_info[first].split()[2]low=firsthigh=lastwhile low<high:# high 左移while low<high and line_info[high].split()[2]<=mid_value:high-=1line_info[low]=line_info[high]while low < high and line_info[low].split()[2] > mid_value:low+=1line_info[high] = line_info[low]# 从循环退出时,low==highline_info[low]=mid# 对左边的列表执行快速排序quick_sort(line_info, first, low-1)# 对右边的列表执行快速排序quick_sort(line_info, low+1, last)while flag == 'y' or flag == 'Y':sortfile_info = open('ifile.txt', 'r')  # 可读方式打开文件,并读取信息line_info中line_info = sortfile_info.readlines()length=len(line_info)quick_sort(line_info,0,length-1)for line in line_info:print(line)flag = input("是否继续排序信息?y/n")
# 统计图书总数
def sum_info():sumfile_info = open('ifile.txt', 'r')line_info = sumfile_info.readlines()sum_stu = len(line_info)  # 写出列表中的元素个数print("一共有{0}个图书。".format(sum_stu))sumfile_info.close()
# 显示图书信息
def show_info():print("书号", end='\t\t\t\t')print("书名", end='\t\t\t\t\t')print("价格", end='\t\t\t\t')print('\n')showfile_info = open('ifile.txt', 'r')line_info = showfile_info.readlines()for line in line_info:  # 遍历列表,输出各个元素print(line)showfile_info.close()
# 查找最贵图书
def get_info():def take_price(elem):return int(elem[2])sortfile_info = open('ifile.txt', 'r')  # 可读方式打开文件,并读取信息line_info中line_info = sortfile_info.readlines()# 定义列表,用来将读取出来的字符串信息,转化为列表lst = []for i in range(0, len(line_info)):lst.append('lst' + str(i))i = 0for line in line_info:  # 遍历列表,将信息转化为单独的列表,并去掉\t和\n,方便接下来的排序比较line = line.replace('\n', '')lst[i] = line.split('\t')i = i + 1lst.sort(key=take_price, reverse=True)print("最贵的图书是:")print(lst[0])
def show_choose():print("==========================图书信息管理系统==========================")print()print("-----------------------------功能菜单------------------------------")print()print("                         1.录入图书信息")print("                         2.查找图书信息")print("                         3.删除图书信息")print("                         4.修改图书信息")print("                         5.排序图书信息")print("                         6.统计图书总数")print("                         7.显示图书信息")print("                         8.查找最贵图书")print("                         0.退出信息管理系统")print()print("------------------------------------------------------------------")def main():show_choose()choose_menu = input("请选择:")while choose_menu != '0':if choose_menu == '1':input_info()if choose_menu == '2':find_info()if choose_menu == '3':del_info()if choose_menu == '4':mod_info()if choose_menu == '5':sort_info()if choose_menu == '6':sum_info()if choose_menu == '7':show_info()if choose_menu == '8':get_info()choose_menu = input("请选择:")print("欢迎您再次使用!!!")if __name__=='__main__':main()

基于python的图书信息管理系统相关推荐

  1. python学生名片系统_基于python的学生信息管理系统!听说好多人的作业都是这个...

    完整代码 import pymysqlindex=''' +---------------------+ 首页 欢迎来到学生信息管理系统 1.登陆 2.注册 3.quit(按任意键退出) +----- ...

  2. 基于python的学生信息管理系统文献综述_学生信息管理系统的文献综述

    基于 B/S 模式的成绩管理系统文献综述 1 .本课题研究的重要性和意义 目前,在学校里,随着高校规模的不断扩大和招生人数的不断增加,需要处理大量的 学生数据信息,越来越多的学校都需要自己的学生信息管 ...

  3. 基于python+mysql超市信息管理系统(附完整源代码)

    (参考的是这篇文章(5条消息) 数据库课程设计-超市零售信息管理系统(Python实现)_小桃在改bug的博客-CSDN博客_超市管理系统数据库设计但是这篇文章里没有完整的代码,所以我自己补全了ui界 ...

  4. python pywinauto 单击鼠标_基于Python的学生信息管理系统

    开发环境要求 本系统的软件开发及运行环境具体如下. 操作系统:Windows 7.Windows 10. Python版本:Python 3.7.0. 开发工具:Python IDLE. 运行方法 在 ...

  5. 基于 Python 的图书借阅管理系统(附报告源码)

    文章目录 项目需求 系统建模 活动图 用例图 类图 顺序图 状态图 系统部署说明 Requirements 启动系统 展示后修改和优化说明 源码下载 项目需求 系统建模 活动图 普通用户注册后通过前台 ...

  6. 基于Python的学生信息管理系统(附源代码)3.7

    开发环境要求 本系统的软件开发及运行环境具体如下. 操作系统:Windows 7.Windows 10. Python版本:Python 3.7.0. 开发工具:Python IDLE. 运行方法 在 ...

  7. 基于php的图书信息管理系统

    本系统采用phpstudy开发平台,采用PHP和MySQL数据库进行开发,开发工具为HBuilder. phpStudy是一个PHP调试环境的程序集成最新的Apache+PHP+MySQL+phpMy ...

  8. 基于Eclipse+Java+Swing+Mysql图书信息管理系统

    基于Eclipse+Java+Swing+Mysql图书信息管理系统 一.系统介绍 二.功能展示 1.主页 2.新增图书信息 3.删除图书信息 三.数据库 四.其他系统实现 五.获取源码 一.系统介绍 ...

  9. 基于线性表的图书信息管理系统

    基于线性表的图书信息管理系统 [实验目的] 1.掌握线性表的顺序存储表示和链式存储表示. 2.掌握顺序表和链表的基本操作,包括创建.查找.插入和删除等算法. 3.明确线性表两种不同存储结构的特点及其适 ...

最新文章

  1. python可以做测试软件吗_Python如何给你的程序做性能测试
  2. 湖北大数据采集平台的应用价值及领域,数道云
  3. windows下将iso文件挂载到文件夹
  4. 基于Python语言Hamcrest断言的使用
  5. clang 搭建和编译boost 和zero ICE库 (Ubuntu10 64)
  6. python猜单词游戏_磁盘空间不足。
  7. [HNOI2008]玩具装箱toy(dp+斜率优化)
  8. Socket编程:之双机通信
  9. python求近似值_python 已知一个字符,在一个list中找出近似值或相似值实现模糊匹配...
  10. 秋游可以去哪些地方?
  11. mysql 异步同步_MySQL主从复制异步半同步实例
  12. 400毫米降水线每年150公里北移
  13. 一键解决Windows聚焦不更新的方法
  14. Guarded Suspension模式
  15. 如何将EXCEL数据表里面的数据逆时针旋转90度
  16. 淘宝客API订单接入的一些坑
  17. Python项目实战之欢迎来到美多商城!学习目录导航
  18. web课程设计网页规划与设计:鲜花网站设计——基于HTML+CSS+JavaScript制作网上鲜花网页设计(5页)
  19. 机柜搬迁到IDC机房需要注意哪些事项
  20. win10用一会就蓝屏重启_电脑总是蓝屏重启怎么办

热门文章

  1. 上班迟到,单位能按员工手册罚款吗?
  2. 图片和传真查看器 打开图片 速度慢
  3. uniapp微信小程序下载文件,保存文件功能总结
  4. chkdsk与sfc/scannow两条命令让电脑流畅一些
  5. 基础工具运用:爆破管理员账户登录后台【配套课时:burp到支付和暴破 实战演练】
  6. 升本 WORD 2010
  7. ArchSummit讲师专访:腾讯微博张松国谈腾讯微博的架构成长过程
  8. 凡客诚品,缺钱你就喊出来
  9. JUC并发编程(一)
  10. 淘客基地转发:关于淘宝联盟2月佣金结算时间调整通知!