zoukankan      html  css  js  c++  java
  • 55-学生管理系统

    import os
    def read_stus():
        '''文件中存放数据的格式
        zst33	2323434   #	表示一个Tab,本程序等价于4个空格
        ls	22	3445454
        ww	33	2354565
        '''
        if os.path.exists(file_name):  # 判断文件或者目录是否存在
            f=open(file_name,"r")
            while True:
                student_str=f.readline() #逐行读
                #   print(student_str)
                if student_str=='': #读完了
                    break
                else:
                    #print(student_str+"===========")
                    student_info_list=student_str.split() #用空格分割student_str为一个list,下一部改造成dict
                    student={"name":student_info_list[0],"age":student_info_list[1],"qq":student_info_list[2]}
                    stus.append(student) #把当前这个student(一个dict), append到全局变量stus中,构成一个list
                    #dict和list,在局部函数区可以对一个全局变量,执行append和pop,但是赋值要global关键字
                    #普通类型变量,在局部函数区想对一个全局变量,执行引用或者赋值操作,都必须用global
            f.close()
            #print(stus)
     
    def write_stus_to_file():
        if os.path.exists(file_name):
            if os.path.exists(backup_file):
                os.remove(backup_file) # 删除之前的旧备份
            os.rename(file_name,"backup-"+file_name) #
        f=open(file_name,"w") #每次都被上面的rename了,所以重新创建一个空的file_name.txt,再写入
        for student in  stus: #逐个取出每一个student,格式化放入文件中
            student_str="%s	%s	%s"%(student['name'],student['age'],student['qq'])
            f.write(student_str) #覆盖式写入,就要保证每次的stus都包含了上一次的数据及本次的增量更新
            f.write("
    ") #这一行结束,文件指针指向下一行
        f.close()
         
         
    def print_menu():
        print("="*30)
        print("学生管理系统".center(30))
        print("输入1:添加学生")
        print("输入2:查找学生")
        print("输入3:修改学生")
        print("输入4:删除学生")
        print("输入5:查看所有学生")
        print("输入6:退出")
     
    def add_student():  #修改stu这个list,新增一项
        name=input("请输入学生的姓名:")
        age=int(input("请输入学生的年龄:"))
        qq=input("请输入学生的QQ号:")
         
        #一个学生包括三个信息,这三个信息存到一个字典中
        stu={}#申明一个字典变量 #这是局部变量
        stu["name"]=name#往字典中添加一个原始
        stu["age"]=age#往字典中添加一个原始
        stu["qq"]=qq#往字典中添加一个原始
        stus.append(stu) #向全局的stus新增了一项  
     
    def search_student(name):
        for item in stus:
            if item["name"]==name.strip():#判断字典中包含有改学生的姓名 {strip去除多余的空格}
                print("%s 学生存在"%name)
                print_student(item)
                #break
                return item
        else:#break是整个循环终止。不会执行else
            print("学生%s没有找到"%name)
     
    def print_student(item):
        print("%s	%s	%s"%(item["name"],item["age"],item["qq"]))
         
    def print_all_students():
        print("序号	姓名	年龄	QQ号")
        for i,item in enumerate(stus,1): #1是指迭代的序号i从1开始,难道还会从0开始?
            print("%s	"%i,end="") #输出一个序号i和4个空格{即1个Tab},end=""是默认参数?
            print_student(item)
    def del_student(name):
        student=search_student(name) #在全局的stus中找到这一项
        stus.remove(student)         #把stus的这一项删除掉
    def main():
        print_menu()
        read_stus()
        while True: #一直在检测输入操作,所以不会自动结束
            operate=input("请输入你想要的操作:")
            if operate=="1":
                add_student() #在原来的stus基础上新增了一项
                write_stus_to_file() #立即写入文件,待会儿要用再从更新后的文件中读入
                print("添加成功")
            if operate=="2":
                name=input("请输入要查找学生的姓名:")
                search_student(name)
            if operate == "3":
                pass
            if operate=="4":
                name=input("请输入要删除的学生姓名:")
                del_student(name) #在原来stus基础上,删除了一项
                write_stus_to_file() #立即写入文件,待会儿要用它,再从更新后的文件中读入
                print("删除学生%s成功"%name)
            if operate=="5":
                print_all_students()
            if operate=="6":
                break
    
    #全局变量            
    file_name="stus.txt"#存放学生数据的文件
    backup_file="backup-stus.txt"
    #一个学生包含很多信息,一个学生一个字典。学生列表用列表存储
    stus=[]
     
    main()
    
    • 注:在与本文件同级目录下,新建backup-stus.txt和stus.txt
  • 相关阅读:
    程序员的学习和积累
    【STL】-迭代器的用法
    【STL】-list的用法
    【STL】-deque的用法
    【STL】- vector的用法
    数据结构-各种排序算法
    【STL】-priority_queue的用法
    数据结构-二项队列
    IT公司100题-8-智力题
    IT公司100题-7-判断两个链表是否相交
  • 原文地址:https://www.cnblogs.com/LS1314/p/8504661.html
Copyright © 2011-2022 走看看