基于python的图书信息管理系统
基于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的图书信息管理系统相关推荐
- python学生名片系统_基于python的学生信息管理系统!听说好多人的作业都是这个...
完整代码 import pymysqlindex=''' +---------------------+ 首页 欢迎来到学生信息管理系统 1.登陆 2.注册 3.quit(按任意键退出) +----- ...
- 基于python的学生信息管理系统文献综述_学生信息管理系统的文献综述
基于 B/S 模式的成绩管理系统文献综述 1 .本课题研究的重要性和意义 目前,在学校里,随着高校规模的不断扩大和招生人数的不断增加,需要处理大量的 学生数据信息,越来越多的学校都需要自己的学生信息管 ...
- 基于python+mysql超市信息管理系统(附完整源代码)
(参考的是这篇文章(5条消息) 数据库课程设计-超市零售信息管理系统(Python实现)_小桃在改bug的博客-CSDN博客_超市管理系统数据库设计但是这篇文章里没有完整的代码,所以我自己补全了ui界 ...
- python pywinauto 单击鼠标_基于Python的学生信息管理系统
开发环境要求 本系统的软件开发及运行环境具体如下. 操作系统:Windows 7.Windows 10. Python版本:Python 3.7.0. 开发工具:Python IDLE. 运行方法 在 ...
- 基于 Python 的图书借阅管理系统(附报告源码)
文章目录 项目需求 系统建模 活动图 用例图 类图 顺序图 状态图 系统部署说明 Requirements 启动系统 展示后修改和优化说明 源码下载 项目需求 系统建模 活动图 普通用户注册后通过前台 ...
- 基于Python的学生信息管理系统(附源代码)3.7
开发环境要求 本系统的软件开发及运行环境具体如下. 操作系统:Windows 7.Windows 10. Python版本:Python 3.7.0. 开发工具:Python IDLE. 运行方法 在 ...
- 基于php的图书信息管理系统
本系统采用phpstudy开发平台,采用PHP和MySQL数据库进行开发,开发工具为HBuilder. phpStudy是一个PHP调试环境的程序集成最新的Apache+PHP+MySQL+phpMy ...
- 基于Eclipse+Java+Swing+Mysql图书信息管理系统
基于Eclipse+Java+Swing+Mysql图书信息管理系统 一.系统介绍 二.功能展示 1.主页 2.新增图书信息 3.删除图书信息 三.数据库 四.其他系统实现 五.获取源码 一.系统介绍 ...
- 基于线性表的图书信息管理系统
基于线性表的图书信息管理系统 [实验目的] 1.掌握线性表的顺序存储表示和链式存储表示. 2.掌握顺序表和链表的基本操作,包括创建.查找.插入和删除等算法. 3.明确线性表两种不同存储结构的特点及其适 ...
最新文章
- python可以做测试软件吗_Python如何给你的程序做性能测试
- 湖北大数据采集平台的应用价值及领域,数道云
- windows下将iso文件挂载到文件夹
- 基于Python语言Hamcrest断言的使用
- clang 搭建和编译boost 和zero ICE库 (Ubuntu10 64)
- python猜单词游戏_磁盘空间不足。
- [HNOI2008]玩具装箱toy(dp+斜率优化)
- Socket编程:之双机通信
- python求近似值_python 已知一个字符,在一个list中找出近似值或相似值实现模糊匹配...
- 秋游可以去哪些地方?
- mysql 异步同步_MySQL主从复制异步半同步实例
- 400毫米降水线每年150公里北移
- 一键解决Windows聚焦不更新的方法
- Guarded Suspension模式
- 如何将EXCEL数据表里面的数据逆时针旋转90度
- 淘宝客API订单接入的一些坑
- Python项目实战之欢迎来到美多商城!学习目录导航
- web课程设计网页规划与设计:鲜花网站设计——基于HTML+CSS+JavaScript制作网上鲜花网页设计(5页)
- 机柜搬迁到IDC机房需要注意哪些事项
- win10用一会就蓝屏重启_电脑总是蓝屏重启怎么办