Python

[Python] 파이썬 성적 관리 프로그램 작성(2023-1 파이썬 프로그래밍 기말고사)

SeungbeomKim 2023. 6. 19. 16:54

이번 기말고사에서는 dictionary 자료구조를 이용해서 성적 관리 프로그램을 만드는 문제였습니다.

dictionary의 key값은 해당 학생의 이름이고, value값에는 성적과 현재 시간을 list로 담아줘야 했습니다. 그리고 성적 전체 조회 시 각 학생의 점수와 출력시간을 보여주고, 해당 학생들의 평균, 표준편차, 최고점을 보여주는 동시에 histogram(도수분포표인데, 표 형식 대신에 각 점수 분포에 해당하는 학생수를 *로 나타내야 함)을 보여주는 기능을 만들어야 했습니다.

 

코드 먼저 보여드리고 각 메서드의 역할에 대해서 설명드리겠습니다.

<코드>

import random
import logging
import time
import math

student = {}
now_time = time.localtime()
grade_count = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

def main_process():
    return input('1=성적 입력 2=성적 조회 3=전체 성적 출력 4=랜덤 성적 생성 q=종료 >> ')

def input_grade():
    while True:
        name = input('학생 이름: ')
        if name == '.':
            print('성적이 입력되었습니다.')
            break
        grade = int(input('성적: '))
        if grade < 0 and grade > 100:
            logging.error('유효하지 않은 성적입니다.')
        student[name] = [grade, now_time]

def find_grade():
    find_name = input('조회할 학생 이름: ')
    for name in student.keys():
        if find_name == name:
            print(f'{find_name}의 성적은 {student[find_name][0]}입니다. (입력 시간: {student[find_name][1]})')

def view_all_grades():
    print('전체 성적 출력:')
    max_value = -1
    total_score = 0

    for name in student.keys():
        print(f'{name}: 성적 - {student[name][0]}, 입력 시간 - {student[name][1]}')

    for name in student.keys():
        total_score += student[name][0]
        if student[name][0] > max_value:
            max_value = student[name][0]
    print(f'평균 성적: {total_score / len(student)}, 최고 점수: {max_value}, 표준 편차: {calculate_std_dev(**student)}')
    plot_histogram()


def plot_histogram():
    for name in student.keys():
        if student[name][0] >= 0 and student[name][0] <= 9:
            grade_count[0] += 1
        if student[name][0] >= 10 and student[name][0] <= 19:
            grade_count[1] += 1
        if student[name][0] >= 20 and student[name][0] <= 29:
            grade_count[2] += 1
        if student[name][0] >= 30 and student[name][0] <= 39:
            grade_count[3] += 1
        if student[name][0] >= 40 and student[name][0] <= 49:
            grade_count[4] += 1
        if student[name][0] >= 50 and student[name][0] <= 59:
            grade_count[5] += 1
        if student[name][0] >= 60 and student[name][0] <= 69:
            grade_count[6] += 1
        if student[name][0] >= 70 and student[name][0] <= 79:
            grade_count[7] += 1
        if student[name][0] >= 80 and student[name][0] <= 89:
            grade_count[8] += 1
        if student[name][0] >= 90 and student[name][0] <= 100:
            grade_count[9] += 1
    first_number = 0
    last_number = 9

    print('성적 분포:')
    for grade in grade_count:
        if last_number == 99:
            last_number = 100
        print(f'{first_number}- {last_number}:', end='  ')
        for i in range(0, grade):
            print('*', end='')
        print()
        first_number += 10
        last_number += 10

def calculate_std_dev(**student):
    dev_total = 0
    total = 0
    for name in student.keys():
        total += student[name][0]
    average = total / len(student)
    for name in student.keys():
        dev_total += math.sqrt((student[name][0] - average)**2)
    return dev_total / len(student)

def generate_random_grade():
    for i in range(0, 10):
        student['학생' + str(i+1)] = [random.randint(0, 100), now_time]
    print('랜덤한 성적이 생성되었습니다.')


print('성적 관리 프로그램을 시작합니다.')
while True:
    cmd = main_process()
    if cmd == '1':
        input_grade()
    elif cmd == '2':
        find_grade()
    elif cmd == '3':
        view_all_grades()
    elif cmd == '4':
        generate_random_grade()
    elif cmd == 'q':
        print('프로그램을 종료합니다.')
        break
    else:
        print('올바른 명령을 입력해주세요.')

 각 메서드의 역할

  1. main_process() : 성적 관리 프로그램의 옵션
    1. 성적 입력(이름, 성적을 입력하고 마지막에 .을 입력해서 해당 메서드를 빠져나오도록 설계)
    2. 성적 조회(성적 조회할 학생의 이름을 입력하면 해당 학생의 이름과 성적 입력시간이 출력되어야 함)
    3. 전체 성적 조회(입력한 학생들과 랜덤 생성한 학생들의 이름과 성적, 학생들의 평균, 표준편차, 최고점 및 histogram 출력)
    4. 랜덤 성적 생성(임의의 학생(이름은 학생1, 학생 2, 학생 3...로 지정) 10명에 대한 랜덤 성적 생성)
  2. input_grade() : 학생 이름과 성적을 입력
  3. find_grade() : 해당 학생의 성적 단건 조회 (key 값(이름)을 입력하면 key에 대한 value 값이 출력되어야 함) 
  4. view_all_grade() : 전체 성적을 출력함과 동시에 plot_histogram 함수 호출(전체 학생들의 평균, 표준편차, 최고점을 보여주고 histogram을 보여줘야 함)
  5. plot_histogram() : 성적 분포표(0~9, 10~19 ...)에서 각 점수 구간에 해당하는 학생수를 *로 나타냄
  6. calculate_std_dev() : 매개변수로 사전형 데이터 student로 받아, 표준편차를 계산
  7. generate_random_grade() : 랜덤 성적을 생성

1학기때는 파이썬 함수를 배우지 않아서 while문 안에 모든 코드를 작성해야 해서 불편함이 있었고 가독성이 떨어진 코드를 만들었지만, 기말고사 기간에는 함수를 배워 while문 안에서 각 옵션에 해당하는 함수를 호출함으로써, 각 함수의 역할을 구분할 수 있었고, 가독성 좋은 코드를 만들 수 있었습니다.

 

<실행 결과>

성적 입력, 랜덤 성적 생성, 전체 성적 조회
점수 분포에 해당하는 빈도수를 *로 표시