Python/파이선과 친해지기

[Python] - Python과 친해지기-학생관리 프로그램ver1

자 즐거운 코딩 시간이다. 우리는 이제 Python을 할 줄 아니, 간단한 프로그램을 통해서 우리가 배운 것을 검증하고 복습하는 시간을 가져보자.

<출처 : https://www.clien.net/service/board/park/12262874>

우리가 만들 영광스러운 첫 번째 프로그램은 학생을 관리하는 프로그램이다. 이 프로그램은 다음과 같은 특징이 있다.(프로그램을 발주한 사람은 필자라고 치자)

 

학생관리 프로그램의 조건

① 학생의 명단은 발주자가 미리 제공한다.

② 새로운 학생을 추가할 수 있는 기능이 있어야 한다.

③ 학생의 전체 명단을 "학생 번호 X : AAA"로 표현하는 기능이 있어야 한다.

④ 성적 저조자는 잘라야 되니, 성적 검사 후 70점 이하인 학생은 다음 분기 시험을 치더라도 입력하지 않게 한다.

⑤ 4분기 별 성적을 학생들에게 한 번에 추가하는 기능

② ~ ⑤는 students를 매개변수로 하는 함수로 생성할 것

⑥ 학생이 0명이 되면 교수님이 위너위너치킨디너

 

다음의 학생정보는 미리 제공된다.(이곳에는 5명의 학생밖에 없다 6명을 만들고 싶지만 불편하게 남기겠다.)

학생번호 이름
P_01 CHEELL
O_02 GLADOOS
R_03 WHEETLEY
T_04 TUULET
A_05 CAAVE

 

다음은 분기별 성적 정보이다.

  1분기 2분기 3분기 4분기
P_01 80 70 60 90
O_02 20 80 70 100
R_03 70 75 80 60
T_04 40 20 30 50
A_05 80 85 90 95

 

실력 향상을 위해서 다음 하나의 변수만 저장하도록 하자. 자료구조도 지정해 준 것을 사용하도록 하자

 

students : ([학생번호], [학생])의 tuple을 key로 사용하고 분기별 점수 배열을 value로 사용하는 dictionary
score_set : 주어지는 분기별 성적, 이중 LIST형태로 관리하자

 

⑥에 의해서 함수로 구현을 하면 되는데, 다행히도 dictionary는 자료구조이기 때문에 파라미터로 전달되면 함수의 내부에서 변경이 가능하다. 

또한 이번 프로그램에 한정해서 dictionary를 반복할 때는 dictionary.keys()와 dictionary.values()를 강제로 list()로 캐스팅해서 사용하도록 하자. 이는 우리가 아직 dictionary 반복을 모르기 때문이다.

 

어느 정도 프로그램에 윤곽이 잡힌 해리들은 아래 더보기를 눌러 아래 필자의 프로그램과 비교해보자

 


 

 

우선 하나하나 요구사항을 보며 무엇을 구현할지 생각해 보자

① 학생의 명단은 발주자가 미리 제공한다.

이것으로 명단을 막일로 적어주자(타이핑도 연습이야 이거 왜 이래)

students = { ("P_01","CHELL") : list(), ("O_02", "GLADOOS") : list(), ("R_03", "WHEETLEY") : list(),\
             ("T_04", "TUULET") : list(), ("A_05", "CAAVE") : list() }

아마 정상적으로 본 포스팅을 따라온 사람이라면, 한 줄에 모든 코드를 입력했을 것이다. 사실 Python은 줄이 너무 길다 싶으면 역 슬래쉬(\)를 통해서 다음 줄에 이어서 변수 정의 등을 할 수 있다.

 

① 조건은 완료했다.

② 새로운 학생을 추가할 수 있는 기능이 있어야 한다.

②에 따르면 새로운 학생을 추가할 수 있는 "기능"이 있어야 한다. 조건대로 함수로 구현해보자

def add_students(target_dict, stu_num, stu_name) :
    target_dict[(stu_num, stu_name)] = list()

추가할 dictionary와 학생번호, 학생 이름을 매개변수로 받아 매개변수로 받은 dictionary에 기존 테이블 형식으로 원소를 추가하는 함수를 생성하였다. 이렇게 ②조건을 완료했다.

 

③ 학생의 전체 명단을 "학생 번호 X : AAA"로 표현하는 기능이 있어야 한다.

③은 단순 출력이니 반복문을 통해서 어렵지 않게 구현할 수 있을 거 같다. 다음의 코드대로 구현해보자

def show_students(target_dict) :
    keys = list(target_dict.keys())
    values = list(target_dict.values())
    for i in range(len(target_dict)) :
        print("학생번호 "+keys[i][0]+": "+keys[i][1])

어려워 보여도 구현을 완료했다.

* dictionary를 반복할 수 있는 방법은 당연히 있다. 단 아직 배우지 않았다. 이는 Python과 친해지기가 끝나면 다음 올릴 예정인 Python과 매우 친해지기에서 알 수 있다.(Advanced-for나 dictionary for를 구글링 해서 봐도 된다.)

④ 성적 저조자는 잘라야 되니, 성적 검사 후 70점 이하인 학생은 다음 분기 시험을 치더라도 입력하지 않게 한다.
⑤ 4분기 별 성적을 학생들에게 한 번에 추가하는 기능

일단 score_set을 등록하자

score_set = [ [80, 20, 70, 40, 80], [70, 80, 75, 20, 85], [60, 70, 80, 30, 90], [90, 100, 60, 50, 95] ]

다음은 score_set을 studetns에 입력하는 함수를 만들어보자

def add_score(target_dict, score_list) :
    keys = list(target_dict.keys())
    values = list(target_dict.values())
    stop = [False,False,False,False,False]
    
    for i in range(4) :
        for j in range(len(values)) :
            if(stop[j] == True) :
                continue
            else :
                values[j].append(score_list[i][j])
            	if(values[j][-1] <= 70) :
               		stop[j] = True

이번에는 조금 복잡해 보인다. 하나하나 살펴보도록 하자. 일단 stop=[False,False,False,False,False] 까지는 함수에서 사용할 변수를 정의한 것이다. 사용하는 변수는 다음과 같다.

 

keys : 전달받은 dictionary의 key를 저장하는 list

values : 전달받은 dictionary의 value를 저장하는 list(따라서 맨 처음에는 [ [], [], [], [], [] ] 의 이중 LIST가 된다.)

stop : 학생들의 정보를 추가할지 말지는 결정하는 배열, (ex : stop[2] 가 True면 3 학생은 이제 점수 입력을 아니한다.)

 

다음은 for문의 분석이다 for는 i를 반복자로 하는 반복문(반복1)과 j를 반복자로 하는 반복문(반복2) 2개의 반복문이 중첩되어 작성되어있다. 반복1는 각 분기별로 동작할 것을 지시하며, 반복2는 각 분기에 대해(반복1의 블럭) 학생 수만큼 돌며 stop이 True면 넘어가고 아니라면 점수를 등록하고 등록한 점수에 대해서 70점 이하이라면 stop을 True로 하는 역할을 한다.

 

이렇게 구현을 완료했다.

 

전체 코드는 다음과 같다.

 

students = { ("P_01","CHELL") : list(), ("O_02", "GLADOOS") : list(), ("R_03", "WHEETLEY") : list(),\
             ("T_04", "TUULET") : list(), ("A_05", "CAAVE") : list() }
score_set = [[80, 20, 70, 40, 80], [70, 80, 75, 20, 85], [60, 70, 80, 30, 90], [90, 100, 60, 50, 95]]

def add_students(target_dict, stu_num, stu_name) :
    target_dict[(stu_num, stu_name)] = list()

    
def show_students(target_dict) :
    keys = list(target_dict.keys())
    values = list(target_dict.values())
    for i in range(len(target_dict)) :
        print("학생번호 "+keys[i][0]+": "+keys[i][1])


def add_score(target_dict, score_list) :
    keys = list(target_dict.keys())
    values = list(target_dict.values())
    stop = [False,False,False,False,False]

    for i in range(4) :
        add = True
        for j in range(len(values)) :
            if(stop[j] == True) :
                continue
            else :
                values[j].append(score_list[i][j])
                if(values[j][-1] <= 70) :
                    stop[j] = True
    
        

이번 시간에는 지금까지 배운 지식을 동원해서 나만의 조그마한 학생관리 프로그램을 만들어 보았다. 여기까지 오느라 수고 많았다. 이제 여러분은 Python의 기초적인 지식을 학습한 상태이다. 다음 시간에는 입출력에 대해서 알아보도록 하자