300来行python代码实现简易版学生成绩管理系统,供大家参考,具体内容如下
使用链表来实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
|
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() |
运行后
然后就可以插入与查询啦
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/liuzuoping/article/details/103284854