图书管理系统的python实现

目录

前言

一、顺序表实现

1.图书类、图书数组定义

2.读取文件保存到图书数组

3.将图书数组写入到文件

4.插入图书信息

5.删除图书信息

6.更新图书信息

7.查询图书信息

8.排序图书信息

二、链表实现(待更新)

总结


前言

        已经具备c/c++基础,而数模和项目中python更为方便(这一点在2020年国赛B题穿越沙漠的编程实现中深有体会,将python版的答案改成c++结果一天没改好),所以在学习数据结构的过程中用c实现一遍再用python实现一遍,希望藉此快速入门python巩固已修数据结构知识

一、顺序表实现

1.图书类、图书数组定义

在python中,典型的顺序表就是List,我们对它进行一个简单的封装,把它封装成一个类,其中elem是数据部分,size则是整个顺序表的实际长度

class Book:
        #(1)
    def __init__(self, no, name, price):
        self.no = no
        self.name = name
        self.price = price


class SeqList:
    def __init__(self):
        #(2)
        self.elem = []
        self.size = 0

#1:定义一个Book类,添加_init_构造函数,self类似c++中的this,该构造函数会在创建对象实例自动调用,与c++不同的是,无需单独定义属性,直接在函数中使用就意味着含有该属性,该图书类共有no编号、name名字、price价格三个属性

#2:定义一个数组类,在python中,典型的顺序表就是列表list,可以存放任意类型的数据而无需显示说明(一个list内部的数据类型也可以不相同),常用表达 var = [ ]

2.读取文件保存到图书数组

def read_file(seq, filepath):
    # 1
    try:
        # 2
        with open(filepath, 'r') as file:
            # 3
            next(file)
            next(file)
            
            # 4
            count = 0
            # 5
            for line in file:
                # 6
                parts = line.split()
                if len(parts) >= 3:
                    # 7    
                    seq.elem.append(None)
                    book = Book(parts[0], parts[1], float(parts[2]))
                    seq.elem[count] = book
                    count += 1
            # 8
            seq.size = count
    except FileExistsError:
        print('文件不存在')
  1. try except : 异常处理机制(类似于Java中的try-catch)
  2. 打开一个文件,‘r’代表只读模式,as file代表我们接下来用file流对象来使用它
  3. 跳过前两行标题信息
  4. 计数器
  5. 遍历文件剩下的所有行
  6. 把某一行的数据以空格分割,形成一个parts数组
  7. list类型的elem添加一个元素位置,一个萝卜一个坑
  8. 更新数组长度

3.将图书数组写入到文件

def save_file(seq, filepath):
    # 1
    with open(filepath, 'r') as fin:
        line1 = fin.readline().strip()
        line2 = fin.readline().strip()
    # 2
    with open(filepath, 'w') as file:
        # 3
        file.write(line1 + '\n')
        file.write(line2 + '\n')
        #4
        for j in range(0, seq.size, +1):
            file.write(seq.elem[j].no + '\t' + seq.elem[j].name + '\t' + str(seq.elem[j].price) + '\n')

#1:只读模式打开文件,记录前两行标题,以字符串的形式保存到line1、line2,strip()对其作净化处理(去除字符串两端的空白字符)

#2:写入模式打开文件,以 as file引用它

#3:写入前两行标题信息

#4:遍历seq图书数组,0 =< j < seq.size,j++,每次向文件中写入对应的图书信息,str()将浮点数转化成字符串

4.插入图书信息

def insert_book(seq, i, book):
    # 1
    seq.size += 1
    # 2
    seq.elem.append(None)
    # 3
    for j in range(seq.size-1, i-1, -1):
        seq.elem[j] = seq.elem[j-1]
    # 4
    seq.elem[i-1] = book

#1:更新图书数组长度

#2:一个萝卜一个坑,插入之前现在elem尾部增加一个元素位置

#3:for循环从seq.size-1开始,到 i 结束,依次将 seq.size-2 到 i-1 的元素后移一位(因为数组的长度已经增加了、因为#2),此处应当仔细体会

#4:更新插入位置的元素

5.删除图书信息

def delete_book(seq, i):
    #1
    for j in range(i, seq.size-1, +1):
        seq.elem[j-1] = seq.elem[j]
    #2
    seq.size -= 1

#1:从i开始,依次向前覆盖,实现删除

#2:更新数组长度

6.更新图书信息

python中,对列表的遍历是十分方便的,无需考虑元素类型,只需要列表可迭代

def update_book(seq):
    # 1
    for item in seq.elem:
        if item.price < 45:
            item.price *= 1.2
        else:
            item.price *= 1.1

#1:python十分方便的遍历数组(seq.elem本身可迭代),从第零个元素到最后一个元素

7.查询图书信息

python中的输入十分方便,a=int(input("xxxxx:")),控制台输出提示信息后,我们从键盘输入数据,被视为字符串,按需要强转,比如这题我们强转为int类型

def query_book(seq, type):
    # 1
    ret = SeqList()
    if type == 1:
        # 2
        pos = int(input("请输入要更新的书本序号:"))
        # 3
        ret.elem.append(seq.elem[pos-1])
        # 4
        ret.size = 1
    if type == 2:
        name = input("请输入要查询的书本名称:")
        for j in range(0, seq.size-1, +1):
            if seq.elem[j].name == name:
                ret.elem.append(seq.elem[j])
                ret.size += 1
    return ret

#1:定义返回值ret,类型为封装的list

#2:python中的输入流,a=input("xxxxxxxx:"),控制台输出xxxxxx提示信息后,键盘输入数据到a中,输入的数据类型不限,都会被视为字符串,int()强制类型转换了解一下

#3:向list类型的elem中添加元素

#4:更新返回数组长度

8.排序图书信息

def price_sort(seq):
    for i in range(0, seq.size, +1):
        for j in range(0, seq.size-i-1, +1):
            if seq.elem[j+1].price < seq.elem[j].price:
                tmp = seq.elem[j]
                seq.elem[j] = seq.elem[j+1]
                seq.elem[j+1] = tmp

冒泡排序,不再赘述

二、链表实现(待更新)

总结

  1. python中的类定义不同于c++/Java,无需单独定义属性,只说明方法即可,函数的返回值、参数类型也不用显式的说明。遍历操作也很方便,循环的边界是左闭右开。在本文的顺序表实现中,我们简单对list做出了封装,实际应用中list已经十分好用了。

你可能感兴趣的:(python,开发语言)