python设计学生成绩管理系统详细步骤_python实现一个简易版学生成绩管理系统

class Node(object):

def __init__(self, data, pointer):

self.data = data

self.next = pointer

# 创建单链表

class SingleLinkedList(object):

def __init__(self):

self.head = Node(None, None)

self.point = self.head

def append(self, data):

# 末尾追加节点

new_node = Node(data, None)

self.point.next = new_node

self.point = new_node

def insert(self, data, find):

# 插入数据(前向插入数据)

if not self.head.next:

print('链表为空')

return None

new_node = Node(data, None)

self.point = self.head

while self.point.next.data != find:

self.point = self.point.next

if self.point.next is None:

print('没有找到该元素')

return None

new_node.next = self.point.next

self.point.next = new_node

def delete(self, find):

# 删除节点

# 空链表

if not self.head.next:

print('链表为空')

return None

self.point = self.head

while self.point.next.data != find:

self.point = self.point.next

pointer = self.point.next

self.point.next = self.point.next.next

del pointer

def insert_after_head(self, data):

node = Node(data, None)

# bug 产生没写 if 返回

if not self.head.next:

self.head.next = node

return None

node.next = self.head.next

self.head.next = node

def reverse(self):

local_list = SingleLinkedList()

self.point = self.head

count = 0

while self.point.next:

count += 1

self.point = self.point.next

data = self.point.data

local_list.insert_after_head(data)

return local_list

def get_size(self):

count = 0

self.point = self.head

while self.point.next:

self.point = self.point.next

count += 1

return count

def delete_by_tail(self, num):

size = self.get_size()

assert (num <= size)

assert (num > 0)

pos = size - num

count = 0

self.point = self.head

while count < size:

count += 1

self.point = self.point.next

if count == pos:

pointer = self.point.next

self.point.next = self.point.next.next

del pointer

# 求中间节点 只允许遍历一次

def quick_middle(self):

slow_point = self.head

fast_point = self.head

while fast_point.next.next:

slow_point = slow_point.next

fast_point = fast_point.next.next

if not fast_point.next:

break

if fast_point.next:

slow_point = slow_point.next

return slow_point.data

def check_circle(self):

pass

def sort(self):

# get_size()改变了 self.point 的指向

length = self.get_size()

i, j = 0, 0

flag = 1

while i < length:

self.point = self.head.next

while j < length - i - 1:

if self.point.data > self.point.next.data:

temp = self.point.data

self.point.data = self.point.next.data

self.point.next.data = temp

self.point = self.point.next

j += 1

flag = 0

if flag:

break

i += 1

j = 0

def print(self):

# 打印结点

self.point = self.head

while self.point.next:

self.point = self.point.next

print('{} ->'.format(self.point.data), end=' ')

print('')

class StudentControlSystem(SingleLinkedList):

# 打印菜单

def print_menu(self):

print('*' * 30)

print('-' * 13 + '菜单' + '-' * 13)

print('1.增加学生信息')

print('2.删除学生信息')

print('3.修改学生信息')

print('4.查找学生信息')

print('5.显示所有信息')

print('6.排序')

print('0.退出程序')

print('*' * 30)

# 用户输入

def user_input(self, item):

try:

item = int(item)

except:

pass

# 增加信息

if item == 1:

self.add_info()

# 删除信息

elif item == 2:

find = input('请输入删除的学号:')

self.del_info(find=find)

# 修改信息

elif item == 3:

self.modify_info()

# 查找信息

elif item == 4:

self.search_info()

# 显示信息

elif item == 5:

self.display_info()

# 信息排序

elif item == 6:

self.rank_info()

# 退出程序 保存数据

elif item == 0:

with open('database.txt', 'w') as f:

self.point = self.head

while self.point.next:

self.point = self.point.next

f.writelines('{}\n'.format(self.point.data))

exit()

else:

print('请输入正确的数字')

# id 保证互异性

def unique_id(self, std_id):

self.point = self.head

while self.point.next:

self.point = self.point.next

if self.point.data['id'] == std_id:

return False

return True

# 增加信息

def add_info(self):

# id 不能重复

# 成绩不能超出范围

name = input('姓名:')

std_id = input('学生id:')

while not self.unique_id(std_id=std_id):

print('id重复')

std_id = input('学生id:')

grade = input('学生成绩:')

if eval(grade) < 0 or eval(grade) > 100:

print('超出范围')

grade = input('学生成绩:')

print(name, std_id, grade)

print('请确认无误后保存')

choice = input('y/n')

items = ['y', 'yes', 'Y', 'Yes']

if choice in items:

print(choice)

data = {'id': std_id, 'name': name, 'grade': grade}

self.append(data)

# 删除信息

def del_info(self, find):

print('请确认无误后保存')

choice = input('y/n')

items = ['y', 'yes', 'Y', 'Yes']

if choice in items:

if not self.head.next:

print('链表为空')

return None

self.point = self.head

while self.point.next.data['id'] != find:

self.point = self.point.next

pointer = self.point.next

self.point.next = self.point.next.next

del pointer

# 序列逆序

def reverse(self):

local_list = StudentControlSystem()

self.point = self.head

count = 0

while self.point.next:

count += 1

self.point = self.point.next

data = self.point.data

local_list.insert_after_head(data)

return local_list

# 序列排序

def sort(self, item):

length = self.get_size()

i, j = 0, 0

flag = 1

while i < length:

self.point = self.head.next

while j < length - i - 1:

if int(self.point.data[item]) > int(self.point.next.data[item]):

# self.point.data, self.point.next.data =

# self.point.next.data, self.point.data

temp = self.point.data

self.point.data = self.point.next.data

self.point.next.data = temp

self.point = self.point.next

j += 1

flag = 0

if flag:

break

i += 1

j = 0

# 修改信息

def modify_info(self):

find = input('输入需要修改的学生的id:')

if not self.head.next:

print('链表为空')

return None

self.point = self.head

while str(self.point.next.data['id']) != find:

self.point = self.point.next

if self.point.next is None:

print('没有找到该元素')

return None

name = input('姓名:')

grade = input('学生成绩:')

self.point.next.data['name'] = name

self.point.next.data['grade'] = grade

# 搜索信息

def search_info(self):

find = input('输入需要查找的学生的id:')

if not self.head.next:

print('链表为空')

return None

self.point = self.head

while str(self.point.next.data['id']) != find:

self.point = self.point.next

if self.point.next is None:

print('没有找到该元素')

return None

data = self.point.next.data

print('ID 姓名 成绩')

print('{} {} {}'.format(data['id'], data['name'], data['grade']))

# 信息排序

def rank_info(self):

choice = input('1.成绩排序 2.学号排序:')

order = input('1.升序 2.降序:')

if choice == '1':

item = 'grade'

elif choice == '2':

item = 'id'

else:

return None

self.sort(item=item)

if order == '2':

temp = self.reverse()

temp.display_info()

return None

self.display_info()

# 显示信息

def display_info(self):

self.point = self.head

print('ID 姓名 成绩')

while self.point.next:

self.point = self.point.next

data = self.point.data

print('{} {} {}'.format(data['id'], data['name'], data['grade']))

print('')

def main():

SCS = StudentControlSystem()

try:

with open('database.txt', 'r') as f:

for data in f.readlines():

SCS.append(eval(data))

except:

with open('database.txt', 'w') as f:

pass

while True:

SCS.print_menu()

item = input('请输入你的选择:')

SCS.user_input(item)

if __name__ == "__main__":

main()

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页