Python

성적 관리 프로그램 - Python(수정중)

충 민 2022. 7. 30. 23:39
# 1.입력 (누를때마다 한명씩 입력)
# 2.출력 1.전체출력 2.반출력 (성적순)
# 3.검색 1.이름검색 2.성적검색 (성적이 90점 이상인사람하면 모두출력)
# # 4.삭제  
#  5.수정
# 6.종료 System.exit
from cgitb import text
import os
import pickle
db={}

_text ='score.txt'
#파일 불러오기 
with open(_text,'rb') as  file:
    try:
        db = pickle.load(file)
    except:
        db={}
#새로운 학생 입력
def student():
    try:
        stuNum = int(input('학번:'))
        name = input('이름:')
        kor=int(input('국어:'))
        eng=int(input('영어: '))
        mat=int(input('수학: '))

    except:
        print('잘못입력하였습니다.')

    total = kor+eng+mat
    avg=total/3

    db.setdefault(student,{'이름':name,'국어':kor,'영어':eng,'수학':mat,'총점':total,'평균':round(avg,2)})
    
#학번을 입려받아 그 학번 데이터를 삭제
def delete(stuNum):
    if a in db:
        db.pop(a)
        with open(_text,'wb') as file:
            pickle.dump(db,file)
    else:
        print('없는 사람입니다.')
#점수 검색
def subSearch(subject):
    a  = int(input('1.이상 2.이하'))
    flag = int(input('기준 점수:'))
    print('학번','이름','국어','영어','수학','총점','평균',sep='\t')
    for i in db.keys():
        if(a ==1 and db[i][subject] >= flag ):
            print(i,db[i]['이름'],db[i]['국어'],db[i]['영어'],db[i]['수학'],db[i]['총점'],db[i]['평균'],sep='\t')
        elif (a == 2 and db[i][subject] <= flag):
            print(i,db[i]['이름'],db[i]['국어'],db[i]['영어'],db[i]['수학'],db[i]['총점'],db[i]['평균'],sep='\t')
#이름 검색
def nameSearch(name):
	for i in db.keys():
		if db[i]['이름'] == name:
			print('학번','이름','국어','영어','수학','총점','평균',sep='\t')
			print(i,db[i]['이름'],db[i]['국어'],db[i]['영어'],db[i]['수학'],db[i]['총점'],db[i]['평균'],sep='\t')

#정렬된 데이터를 리턴
def isort(subject):
    return dict(sorted(db.items(),key = lambda score:score[1][subject]))  

def printData(datas):
	korlist = sorted([db[i]['국어'] for i in db])
	englist = sorted([db[i]['영어'] for i in db])
	matlist = sorted([db[i]['수학'] for i in db])
	print('학번','이름','국어\t','영어\t','수학\t','총점','평균',sep='\t')
	for i in datas:
		korgrade = setGrade(korlist.index(datas[i]['국어']),len(korlist))
		enggrade = setGrade(englist.index(datas[i]['영어']),len(englist))
		matgrade = setGrade(matlist.index(datas[i]['수학']),len(matlist))
		print(i,datas[i]['이름'],str(datas[i]['국어'])+'('+str(korgrade)+'등급)',str(datas[i]['영어'])+'('+str(enggrade)+'등급)',str(datas[i]['수학'])+'('+str(matgrade)+'등급)',datas[i]['총점'],datas[i]['평균'], sep='\t')
# 학생수 및 등수를 입력받아 등급을 리턴
def setGrade(rank,n):
	per = (rank+1)/n
	if per <= 0.04:
		return 9
	elif per <= 0.11:
		return 8
	elif per <= 0.23:
		return 7
	elif per <= 0.4:
		return 6
	elif per <= 0.6:
		return 5
	elif per <= 0.77:
		return 4
	elif per <= 0.89:
		return 3
	elif per <= 0.96:
		return 2
	else:
		return 1
#수정
# def stuupdate(stuNum):
#     for i in db.keys():
#         if db[i]['학번'] == stuNum:
            
            
#             db[i][]


while True:
    print('성적관리프로그램')
    print('1.입력 2.출력 3.검색 4.삭제 5.수정 6.종료')
    a = int(input())

    if a == 1:
        student()
        with open(_text,'wb') as file:
            pickle.dump(db,file)
    elif a == 2:#출력
        print('1.전체출력 2.국어성적순 3.영어성적순 4.수학성적순 5.평균순  :  ')
        q = int(input())
        if q==1:
           #1 전체출력
            print(db)
        elif a == 2:
            printData(isort('국어'))
        elif a == 3:
            printData(isort('영어'))
            
        elif a == 4:
            
            printData(isort('수학'))
            
        elif a == 5:
            printData(isort('평균'))
        else:
            print('잘못된 입력입니다')



    elif a == 3:#검색-정렬
        a= int(input('무엇으로 검색하겠습니까 \n 1.학번 2.이름 3.성적 :'))
        if a==1:#학번
            a = input('학번 : ')
            stuInfo = db[a]
            print('학번','이름','국어','영어','수학','총점','평균',sep='\t')
            print(a,stuInfo['이름'],stuInfo['국어'],stuInfo['영어'],stuInfo['수학'],stuInfo['총점'],stuInfo['평균'],sep='\t')

        elif 2:
            a= input('이름: ')
            nameSearch(a)
        
        elif a==3:#성적
            subject = input('과목 : ')
            subSearch(subject)

        else: 
            print('잘못입력하였습니다')

    elif a == 4:#삭제-delete
        a = int(input('삭제할 학번:'))
        delete(a)
    elif a == 5:#수정-update
        stuNum=input('수정할 학번 입력:')
        
    elif a == 6: 
        print('프로그램 종료')
        break
    else:print('잘못된 입력입니다')