이번 기말고사에서는 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('올바른 명령을 입력해주세요.')
각 메서드의 역할
- main_process() : 성적 관리 프로그램의 옵션
- 성적 입력(이름, 성적을 입력하고 마지막에 .을 입력해서 해당 메서드를 빠져나오도록 설계)
- 성적 조회(성적 조회할 학생의 이름을 입력하면 해당 학생의 이름과 성적 입력시간이 출력되어야 함)
- 전체 성적 조회(입력한 학생들과 랜덤 생성한 학생들의 이름과 성적, 학생들의 평균, 표준편차, 최고점 및 histogram 출력)
- 랜덤 성적 생성(임의의 학생(이름은 학생1, 학생 2, 학생 3...로 지정) 10명에 대한 랜덤 성적 생성)
- input_grade() : 학생 이름과 성적을 입력
- find_grade() : 해당 학생의 성적 단건 조회 (key 값(이름)을 입력하면 key에 대한 value 값이 출력되어야 함)
- view_all_grade() : 전체 성적을 출력함과 동시에 plot_histogram 함수 호출(전체 학생들의 평균, 표준편차, 최고점을 보여주고 histogram을 보여줘야 함)
- plot_histogram() : 성적 분포표(0~9, 10~19 ...)에서 각 점수 구간에 해당하는 학생수를 *로 나타냄
- calculate_std_dev() : 매개변수로 사전형 데이터 student로 받아, 표준편차를 계산
- generate_random_grade() : 랜덤 성적을 생성
1학기때는 파이썬 함수를 배우지 않아서 while문 안에 모든 코드를 작성해야 해서 불편함이 있었고 가독성이 떨어진 코드를 만들었지만, 기말고사 기간에는 함수를 배워 while문 안에서 각 옵션에 해당하는 함수를 호출함으로써, 각 함수의 역할을 구분할 수 있었고, 가독성 좋은 코드를 만들 수 있었습니다.
<실행 결과>
'Python' 카테고리의 다른 글
[Python] Naming Rule을 적용하여 로또 생성 및 등수 측정 프로그램 작성 (0) | 2023.06.19 |
---|