만들어보기
내 답 :
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문은 중복되면 메뉴가 아닌 새로운 학번을 입력할 때까지 반복하게 됨