성적 예제

nahye·2021년 5월 13일
0

만들어보기

내 답 :

class Sungjuk():

    def input_sungjuk(student):
        data = {}
        data["haknum"] = input("학번 : ")
        data["irum"] = input("이름 : ")
        data["kor"] = int(input("국어 : "))
        data["eng"] = int(input("영어 : "))
        data["math"] = int(input("수학 : "))

    def process_sungjuk(student):
        data = {}
        data["tot"] = data["kor"] + data["eng"] + data["math"]
        data["avg"] = data["tot"] / 3

        if data["avg"] >= 90:
            data["grade"] = "수"
        elif data["avg"] >= 80:
            data["grade"] = "우"
        elif data["avg"] >= 70:
            data["grade"] = "미"
        elif data["avg"] >= 60:
            data["grade"] = "양"
        else:
            data["grade"] = "가"

    def output_sugjuk(student):
        total_avg = 0
        
        print("\n                        ***성적표***")
        print("=================================================")
        print("학번   이름   국어   영어   수학   총점   평균   등급")
        print("=================================================")
        for data in student:
            total_avg += data["avg"]
            print("%4s   %4s   %3d   %3d   %3d   %3d   %6.2f   %s"
                  % (data['num'], data['name'], data["kor"], data["eng"],
                     data["math"], data["tot"], data["avg"], data["grade"]))


답 :

self로 default 정의
문자는 None, 숫자는 0
None 말고 "" 라고 적어도 됨

if 전까지가 성적 Class

if를 넣은 이유는 성적 Class와 이 내용을 분리시키기 위해서
향후에도 이 Class를 사용하기 위해 성적 Class와 일반 실행문을 분리시킴

Q. 생성자에서 변수선언할때 사용자가 학번, 이름, 성적, 학점을 입력할때 원하는 자료형만 받도록 약속을 정하는 문법이 있나요?

A. 이런 자료형은 존재하지 않음!

한 사람의 성적 data를 출력할 수 있음

dict 예제와 비교하면 훨씬 심플함

이 클래스가 성적처리에 최적화 하도록 설계했기 때문에
(obj = Sungjuk())

내가 원하는 기능을 미리 만들어두고 가져와(obj.input_sungjuk())

output으로 호출하면 됨
(obj.output_sungjuk())

성적 객체에 리스트를 넣는 것

dict 말고 성적 클래스로 대체해서 사용

다른 곳에서 이 클래스 사용하려면

해당 모듈을 import 하면 됨
from sungjuck_6 import Sungjuck

Q. 클래스의 메서드에서 멤버변수가 필요할때마다 "self.새로운변수 = 값"이렇게 선언하는것보다는 생성자에서 멤버변수를 모두 선언해놓는게 좋은건가요?

A. 일괄적으로 모아두는 게 한 눈에 쉽게 파악 가능

여러사람 입력하는 sungjuk_5.py에서 한사람 성적입력할때 sungjuk_6.py의 sungjuk 클래스 참조해서 한사람입력할때 이용해보기

내 답:

from sungjuk_exam import Sungjuk

def f_menu():
    print(" *** 메뉴 ***")
    print("1. 성적정보 입력")
    print("2. 성적정보 출력")
    print("3. 성적정보 조회")
    print("4. 성적정보 수정")
    print("5. 성적정보 삭제")
    print("6. 프로그램 종료")

def f_input(f_students):
    data = {}
    obj = Sungjuk()
    obj.input_sungjuk()
    obj.process_sungjuk()

    f_students.append(data)
    print("\n성적정보 입력 성공!\n")

def f_output(f_students):
    total_avg = 0

    obj = Sungjuk()
    obj.output_sugjuk()

    if len(f_students) == 0:
        print("\n데이터가 없습니다!!!\n")
        return

    print("=======================================")
    print("\t\t 총학생수 = %d, 전체평균 = %.2f\n"
              % (len(f_students), total_avg / len(f_students)))

def f_search(f_students):
    num = input("\n조회할 학번을 입력하세요 : ")
    for data in f_students:
        if (data["num"] == num):
            print("\n학번   이름   국어   영어   수학   총점   평균   등급")
            print("==================================================")
            print("%4s   %4s   %3d   %3d   %3d   %3d   %6.2f   %s"
                  % (data['num'], data['name'], data["kor"], data["eng"],
                     data["math"], data["tot"], data["avg"], data["grade"]))
            print("===================================================")
            break # return도 가능
    else:
        print("\n조회할 학번 %s가 없습니다! \n" % num)

def f_update(f_students):
    num = input("\n수정할 학번을 입력하세요 : ")
    for data in f_students:
        if (data["num"] == num):
            data["kor"] = int(input("국어점수를 입력하세요 : "))
            data["eng"] = int(input("영어점수를 입력하세요 : "))
            data["math"] = int(input("수학점수를 입력하세요 : "))
            data["tot"] = data["kor"] + data["eng"] + data["math"]
            data["avg"] = data["tot"] / 3.
            if data["avg"] >= 90:
                data["grade"] = "수"
            elif data["avg"] >= 80:
                data["grade"] = "우"
            elif data["avg"] >= 70:
                data["grade"] = "미"
            elif data["avg"] >= 60:
                data["grade"] = "양"
            else:
                data["grade"] = "가"

            print("\n학번 %s 성적정보 수정 성공!!\n" % data['num'])
            break
        else:
            print("\n수정할 학번 %s가 없습니다!\n" % num)

def f_delete(f_students):
    num = input("\n삭제할 학번을 입력하세요 : ")
    for data in f_students:
        if(data["num"] == num):
            f_students.remove(data)
            print("\n학번 %s 성적정보 삭제 성공!!\n" %data["num"])
            break
    else:
        print("\n삭제할 학번 %s가 없습니다!\n" % num)


if __name__ == "__main__":
    students = []
    while True:
        f_menu()

        menu = int(input("\n메뉴를 선택하세요 : "))
        if menu == 1:
            f_input(students)
        elif menu == 2:
            f_output(students)
        elif menu == 3:
            f_search(students)
        elif menu == 4:
            f_update(students)
        elif menu == 5:
            f_delete(students)
        elif menu == 6:
            print("\n프로그램 종료...")
            break;
        else:
            print("\n메뉴를 다시 입력하세요!!!\n")

obj = Sungjuk() # 성적 개체 하나 만듬
obj.input_sungjunk()

진짜 답 :


👆입력 부분
예전에 dict로 넣었던 걸 이젠 sungjuk 클래스에 넣는 것


👆 출력 부분
obj가 성적 개체가 됨


obj는 10을 전달 받고


obj는 이 함수가 끝나면 지역변수기 때문에 사라짐


obj는 10인데 10을 삭제하는 것
쓰레기 객체가 되어 사라짐



student.remove(obj)대신
del obj로 하면 어떻게 될까?
del obj하면

이 부분이 삭제 됨
그래서 에러가 남
del obj를 하고 싶으면

obj.hakbun을 hakbun이라고 고쳐주면 됨

"생성된 객체에 대한 참조가 유지되는 동안에는 삭제되지 않는다"

# 함수 추가함 sungjuk_5 answer과 다름
from sungjuk_exam import Sungjuk

def f_menu():
    print(" *** 메뉴 ***")
    print("1. 성적정보 입력")
    print("2. 성적정보 출력")
    print("3. 성적정보 조회")
    print("4. 성적정보 수정")
    print("5. 성적정보 삭제")
    print("6. 프로그램 종료")

def f_input(students):
    obj = Sungjuk()
    obj.input_sungjuk() # 입력
    print()

    obj.process_sungjuk() # 평균, 등급 처리

    students.append(obj) # obj 객체의 주소를 복제하는 것
    print("\n성적정보 입력 성공!\n")

def f_output(students):
    total_avg = 0
    if len(students) == 0:
        print("\n데이터가 없습니다!!!\n")
        return

    print("\n                      *** 성적표 ***")
    print("============================================================")
    print("학번    이름    국어    영어    수학    총점    평균     등급")
    print("============================================================")
    for obj in students:  # obj가 성적 개체가 됨
        total_avg += obj["avg"]
        obj.output_sungjuk()
    print("============================================================")
    print("\t\t 총학생수 = %d,  전체 평균 = %.2f\n"
          % (len(students), total_avg / len(students)))

def f_search(students): # 주소 전달 받음
    hakbun = input("\n조회할 학번을 입력하세요 : ")
    for obj in students:
        if (obj.hakbun == hakbun):
            print("\n학번   이름   국어   영어   수학   총점   평균   등급")
            print("==================================================")
            obj.output_sungjuk()
            print("===================================================")
            break # return도 가능
    else:
        print("\n조회할 학번 %s가 없습니다! \n" % num)

def f_update(students):
    hakbun = input("\n수정할 학번을 입력하세요 : ")
    for obj in students:
        if (obj.hakbun == hakbun):
            obj.kor = int(input("국어점수를 입력하세요 : "))
            obj.eng = int(input("영어점수를 입력하세요 : "))
            obj.math = int(input("수학점수를 입력하세요 : "))
            obj.process_sungjuk()
            print("\n학번 %s 성적정보 수정 성공!!\n" % obj.hakbun)
            break
    else:
        print("\n수정할 학번 %s가 없습니다!\n" % hakbun)
        
def f_delete(students):
    hakbun = input("\n삭제할 학번을 입력하세요 : ")
    for obj in students:
        if(obj.hakbun == hakbun):
            students.remove(obj) # obj는 10인데 10을 삭제하는 것
            print("\n학번 %s 성적정보 삭제 성공!!\n" % obj.hakbun)
            break
    else:
        print("\n삭제할 학번 %s가 없습니다!\n" % hakbun)


        

        




del student(obj) # 리스트 객체의 주소를 지우게 되는 것
더 이상 접근할 수가 없음 => 쓰레기 객체가 됨

학번의 중복을 체크하려면

def f_input(students):
    obj = Sungjuk()
    print()
    
    obj.input_sungjuk() # 입력
    for data in students: 
        if (obj.hakbun == data.hakbun):
            print("\n이미 존재하는 학번입니다.\n")
            return 
    """
    while True:
        obj.input_sungjuck()
        for data in students:
            if (obj.hakbun == data.hakbun):
                print("\n이미 존재하는 학번입니다.\n")
                break
        else:
        break
    """
    
    obj.process_sungjuk() # 평균, 등급 처리
        
    students.append(obj) # obj 객체의 주소를 복제하는 것
    print("\n성적정보 입력 성공!\n")

이렇게 조건을 주기

for문은 학번이 중복이 되면 메인 메뉴로 돌아가도록 설계

while문은 중복되면 메뉴가 아닌 새로운 학번을 입력할 때까지 반복하게 됨

profile
Slow and steady wins the race

0개의 댓글