Python if-elif-else 를 활용한 점수 기반 성적 산출 방법

PythonBeginner
지금 연습하기

소개

이 튜토리얼에서는 Python 의 if-elif-else 문을 사용하여 성적 시스템을 구현하는 과정을 안내합니다. 교육 환경에서 흔히 사용되는 작업인 학생의 점수를 기반으로 성적을 결정하는 방법을 배우게 됩니다. 이 튜토리얼을 마치면 실제 시나리오에 적용할 수 있는 기능적인 성적 프로그램을 만들 수 있습니다. 이러한 실습 방식은 더 복잡한 프로그래밍 로직의 기본 구성 요소인 Python 의 조건문 이해를 강화할 것입니다.

Python 조건문 이해하기

성적 시스템을 만들기 전에 Python 의 기본적인 조건문을 이해해 봅시다. 조건문을 사용하면 프로그램이 특정 조건에 따라 결정을 내릴 수 있습니다.

첫 번째 Python 파일 만들기

새로운 Python 파일을 만들어 보겠습니다.

  1. WebIDE 에서 왼쪽 상단의 "File" 메뉴를 클릭합니다.
  2. "New File"을 선택합니다.
  3. 파일을 /home/labex/project 디렉토리에 conditional_demo.py로 저장합니다.

기본 If-Else 문

conditional_demo.py 파일에 다음 코드를 작성합니다.

## Basic if-else example
score = 75

if score >= 70:
    print("You passed the test!")
else:
    print("You need to study more.")

## Try changing the score to see different results

이 간단한 프로그램은 score 변수가 70 이상인지 확인합니다. 그렇다면 "You passed the test!"를 출력합니다. 그렇지 않으면 "You need to study more."를 출력합니다.

코드 테스트하기

코드를 실행하려면 WebIDE 에서 터미널을 열고 다음을 실행합니다.

python3 /home/labex/project/conditional_demo.py

다음 출력을 볼 수 있습니다.

You passed the test!

If-Elif-Else 로 더 많은 조건 추가하기

if-elif-else 구조를 사용하여 더 많은 조건을 처리하도록 예제를 확장해 보겠습니다.

## If-elif-else example
score = 85

if score >= 90:
    print("Excellent!")
elif score >= 80:
    print("Very good!")
elif score >= 70:
    print("Good!")
elif score >= 60:
    print("Satisfactory")
else:
    print("Needs improvement")

## Try different values for score to see different results

파일을 저장하고 다시 실행합니다.

python3 /home/labex/project/conditional_demo.py

출력:

You passed the test!
Very good!

if-elif-else 구조는 위에서 아래로 조건을 평가합니다. 조건이 참이면 해당 코드 블록이 실행되고 나머지 조건은 건너뜁니다.

이 흐름을 이해하는 것은 다음 단계에서 성적 시스템을 구축하는 데 매우 중요합니다.

기본 성적 시스템 만들기

이제 조건문을 이해했으니 간단한 성적 시스템을 만들어 보겠습니다. 숫자 점수를 문자 등급으로 변환하는 함수를 만들 것입니다.

성적 시스템 파일 만들기

  1. WebIDE 에서 grading_system.py라는 새 파일을 만듭니다.
  2. /home/labex/project 디렉토리에 저장합니다.

기본 성적 함수 구현하기

grading_system.py 파일에 다음 코드를 작성합니다.

def get_grade(marks):
    """
    Convert numerical marks to letter grades.

    A: 90-100
    B: 80-89
    C: 70-79
    D: 60-69
    F: 0-59
    """
    if marks >= 90:
        return 'A'
    elif marks >= 80:
        return 'B'
    elif marks >= 70:
        return 'C'
    elif marks >= 60:
        return 'D'
    else:
        return 'F'

## Test the function with a few examples
test_marks = [95, 82, 75, 65, 45]

for mark in test_marks:
    grade = get_grade(mark)
    print(f"Marks: {mark} - Grade: {grade}")

이 코드는 학생의 점수를 입력으로 받아 일반적인 성적 기준에 따라 해당 문자 등급을 반환하는 get_grade() 함수를 만듭니다.

성적 시스템 실행하기

코드를 실행하여 성적 시스템을 테스트해 보겠습니다.

python3 /home/labex/project/grading_system.py

다음과 유사한 출력을 볼 수 있습니다.

Marks: 95 - Grade: A
Marks: 82 - Grade: B
Marks: 75 - Grade: C
Marks: 65 - Grade: D
Marks: 45 - Grade: F

코드 이해하기

이 코드가 어떻게 작동하는지 자세히 살펴보겠습니다.

  1. marks라는 하나의 매개변수를 받는 get_grade()라는 함수를 정의했습니다.
  2. 함수 내부에서 if-elif-else 문을 사용하여 다양한 등급 기준에 따라 점수를 확인했습니다.
  3. 함수가 다양한 값으로 어떻게 작동하는지 보여주기 위해 테스트 점수 목록을 만들었습니다.
  4. for 루프를 사용하여 각 점수를 반복하고, 해당 등급을 얻고, 결과를 출력했습니다.

이 기본 성적 시스템은 표준적인 경우에 잘 작동하지만, 예외적인 경우는 어떨까요? 다음 단계에서는 이러한 경우를 처리하도록 시스템을 개선할 것입니다.

성적 시스템에서 예외 처리하기

기본 성적 시스템은 작동하지만 다음과 같은 예외적인 경우를 고려하지 않습니다.

  1. 잘못된 입력 (0 미만 또는 100 초과 점수)
  2. 숫자 외 입력

이러한 시나리오를 처리하도록 성적 시스템을 개선해 보겠습니다.

성적 시스템 업데이트하기

/home/labex/project 디렉토리에 다음 코드를 사용하여 improved_grading.py라는 새 파일을 만듭니다.

def get_grade(marks):
    """
    Convert numerical marks to letter grades with input validation.

    A: 90-100
    B: 80-89
    C: 70-79
    D: 60-69
    F: 0-59

    Returns "Invalid marks" for inputs outside the range of 0-100
    """
    try:
        ## Convert to float in case input is a string number
        marks = float(marks)

        ## Check if marks are in valid range
        if marks < 0 or marks > 100:
            return "Invalid marks: must be between 0 and 100"
        elif marks >= 90:
            return 'A'
        elif marks >= 80:
            return 'B'
        elif marks >= 70:
            return 'C'
        elif marks >= 60:
            return 'D'
        else:
            return 'F'
    except ValueError:
        return "Invalid marks: not a number"

## Test the function with valid and invalid inputs
test_inputs = [95, 82, 75, 65, 45, -5, 105, "abc", "75"]

for value in test_inputs:
    grade = get_grade(value)
    print(f"Input: {value} - Result: {grade}")

개선된 성적 시스템 실행하기

개선된 성적 시스템을 실행합니다.

python3 /home/labex/project/improved_grading.py

출력은 다음과 유사해야 합니다.

Input: 95 - Result: A
Input: 82 - Result: B
Input: 75 - Result: C
Input: 65 - Result: D
Input: 45 - Result: F
Input: -5 - Result: Invalid marks: must be between 0 and 100
Input: 105 - Result: Invalid marks: must be between 0 and 100
Input: abc - Result: Invalid marks: not a number
Input: 75 - Result: C

개선 사항 설명

우리가 한 개선 사항을 살펴보겠습니다.

  1. 입력 유형 변환: float()를 사용하여 입력을 숫자로 변환하여 함수가 "75"와 같은 문자열 입력을 허용하도록 했습니다.

  2. 유효 범위 확인: 점수가 0-100 의 유효 범위 내에 있는지 확인하는 조건을 추가했습니다.

  3. 오류 처리: 숫자 외 입력이 제공될 때 발생하는 ValueError 예외를 catch 하기 위해 코드를 try-except 블록으로 묶었습니다.

  4. 자세한 오류 메시지: 오류 코드만 반환하는 대신 사용자에게 무엇이 잘못되었는지 알리기 위해 구체적인 오류 메시지를 반환합니다.

이러한 개선 사항은 다양한 예외적인 경우를 적절하게 처리하여 성적 시스템을 더욱 강력하게 만듭니다. 이제 프로그램은 잘못된 입력이 발생할 때 충돌하거나 잘못된 결과를 생성하는 대신 유용한 피드백을 제공합니다.

피드백 메시지로 성적 시스템 향상시키기

각 등급에 대한 개인화된 피드백 메시지를 추가하여 성적 시스템을 더욱 개선해 보겠습니다. 이렇게 하면 시스템이 더 유익하고 사용자 친화적이 됩니다.

향상된 성적 시스템 만들기

/home/labex/project 디렉토리에 enhanced_grading.py라는 새 파일을 만듭니다.

def get_grade_with_feedback(marks):
    """
    Convert numerical marks to letter grades with personalized feedback.

    Returns a tuple containing the grade and a feedback message.
    """
    try:
        marks = float(marks)

        if marks < 0 or marks > 100:
            return (None, "Invalid marks: must be between 0 and 100")
        elif marks >= 90:
            return ('A', "Excellent! Outstanding performance.")
        elif marks >= 80:
            return ('B', "Very good! Above average performance.")
        elif marks >= 70:
            return ('C', "Good work! Average performance.")
        elif marks >= 60:
            return ('D', "Satisfactory. Below average but passing.")
        else:
            return ('F', "Needs improvement. Please study more.")
    except ValueError:
        return (None, "Invalid marks: not a number")

def format_report(student_name, marks, subject):
    """
    Generate a formatted report for a student.
    """
    grade, feedback = get_grade_with_feedback(marks)

    if grade is None:
        return f"Report for {student_name}: {feedback}"

    return f"""
Report Card
-----------
Student: {student_name}
Subject: {subject}
Marks: {marks}
Grade: {grade}
Feedback: {feedback}
"""

## Test the enhanced system with a few examples
students = [
    {"name": "Alice", "marks": 92, "subject": "Mathematics"},
    {"name": "Bob", "marks": 78, "subject": "Science"},
    {"name": "Charlie", "marks": 45, "subject": "History"},
    {"name": "David", "marks": "abc", "subject": "English"}
]

for student in students:
    report = format_report(student["name"], student["marks"], student["subject"])
    print(report)

향상된 성적 시스템 실행하기

향상된 성적 시스템을 실행합니다.

python3 /home/labex/project/enhanced_grading.py

다음과 유사한 출력을 볼 수 있습니다.

Report Card
-----------
Student: Alice
Subject: Mathematics
Marks: 92
Grade: A
Feedback: Excellent! Outstanding performance.


Report Card
-----------
Student: Bob
Subject: Science
Marks: 78
Grade: C
Feedback: Good work! Average performance.


Report Card
-----------
Student: Charlie
Subject: History
Marks: 45
Grade: F
Feedback: Needs improvement. Please study more.

Report for David: Invalid marks: not a number

새로운 기능 설명

구현한 개선 사항을 살펴보겠습니다.

  1. 개인화된 피드백: 이제 각 등급에는 맥락과 격려를 제공하는 특정 피드백 메시지가 포함됩니다.

  2. 반환 형식: get_grade_with_feedback() 함수는 등급과 피드백 메시지를 모두 포함하는 튜플을 반환합니다.

  3. 보고서 형식 지정: 각 학생에 대한 잘 구조화된 성적표를 생성하는 새로운 함수 format_report()를 만들었습니다.

  4. 실제 데이터로 테스트: 실제 학생 데이터를 시뮬레이션하기 위해 딕셔너리 목록을 사용했습니다. 이는 프로그래밍에서 일반적인 데이터 구조입니다.

  5. 우아한 오류 처리: 시스템은 여전히 잘못된 입력을 우아하게 처리하지만 이제 오류를 사용자 친화적인 형식으로 표시합니다.

이러한 개선 사항은 실제 사용에 더 적합하도록 성적 시스템을 만듭니다. 개인화된 피드백은 학생들이 자신의 성과를 이해하는 데 도움이 되며, 형식화된 보고서는 결과의 전문적인 프레젠테이션을 제공합니다.

실제 데이터 세트에 성적 시스템 적용하기

이제 성적 시스템을 보다 현실적인 시나리오에 적용해 보겠습니다. 파일에서 학생 데이터를 읽고, 성적을 계산하고, 포괄적인 보고서를 작성하는 프로그램을 만들 것입니다.

샘플 데이터 세트 만들기

먼저 샘플 학생 데이터가 있는 파일을 만들어 보겠습니다. /home/labex/project 디렉토리에 다음 내용으로 student_data.csv라는 새 파일을 만듭니다.

name,subject,marks
John,Mathematics,88
Emily,Mathematics,92
Michael,Mathematics,75
Sophia,Mathematics,68
Daniel,Mathematics,42
Olivia,Mathematics,95
William,Mathematics,73
Emma,Mathematics,60
James,Mathematics,79
Ava,Mathematics,85

완전한 성적 애플리케이션 만들기

이제 /home/labex/project 디렉토리에 grading_application.py라는 새 파일을 만듭니다.

def get_grade_with_feedback(marks):
    """
    Convert numerical marks to letter grades with personalized feedback.

    Returns a tuple containing the grade and a feedback message.
    """
    try:
        marks = float(marks)

        if marks < 0 or marks > 100:
            return (None, "Invalid marks: must be between 0 and 100")
        elif marks >= 90:
            return ('A', "Excellent! Outstanding performance.")
        elif marks >= 80:
            return ('B', "Very good! Above average performance.")
        elif marks >= 70:
            return ('C', "Good work! Average performance.")
        elif marks >= 60:
            return ('D', "Satisfactory. Below average but passing.")
        else:
            return ('F', "Needs improvement. Please study more.")
    except ValueError:
        return (None, "Invalid marks: not a number")

def process_student_data(input_filename, output_filename):
    """
    Process student data from a CSV file and generate a report.
    """
    try:
        ## Read the input file
        with open(input_filename, 'r') as file:
            lines = file.readlines()

        ## Skip the header line
        headers = lines[0].strip().split(',')
        data = [line.strip().split(',') for line in lines[1:]]

        ## Prepare the output
        output_lines = ["Student Grade Report\n", "=" * 20 + "\n\n"]

        ## Calculate statistics
        valid_marks = []
        grade_counts = {'A': 0, 'B': 0, 'C': 0, 'D': 0, 'F': 0, 'Invalid': 0}

        ## Process each student
        for student in data:
            name, subject, marks = student
            grade, feedback = get_grade_with_feedback(marks)

            if grade:
                valid_marks.append(float(marks))
                grade_counts[grade] += 1

                output_lines.append(f"Student: {name}\n")
                output_lines.append(f"Subject: {subject}\n")
                output_lines.append(f"Marks: {marks}\n")
                output_lines.append(f"Grade: {grade}\n")
                output_lines.append(f"Feedback: {feedback}\n\n")
            else:
                grade_counts['Invalid'] += 1
                output_lines.append(f"Student: {name}\n")
                output_lines.append(f"Subject: {subject}\n")
                output_lines.append(f"Error: {feedback}\n\n")

        ## Calculate statistics
        if valid_marks:
            average_mark = sum(valid_marks) / len(valid_marks)
            max_mark = max(valid_marks)
            min_mark = min(valid_marks)

            output_lines.append("Class Statistics\n")
            output_lines.append("-" * 15 + "\n")
            output_lines.append(f"Average Mark: {average_mark:.2f}\n")
            output_lines.append(f"Highest Mark: {max_mark:.1f}\n")
            output_lines.append(f"Lowest Mark: {min_mark:.1f}\n\n")

            output_lines.append("Grade Distribution\n")
            output_lines.append("-" * 17 + "\n")
            for grade, count in grade_counts.items():
                output_lines.append(f"{grade}: {count}\n")

        ## Write the output file
        with open(output_filename, 'w') as file:
            file.writelines(output_lines)

        print(f"Report successfully generated and saved to {output_filename}")

    except Exception as e:
        print(f"An error occurred: {str(e)}")

## Run the application
input_file = "/home/labex/project/student_data.csv"
output_file = "/home/labex/project/grade_report.txt"

process_student_data(input_file, output_file)

## Display the report in the console as well
print("\nGenerated Report Contents:")
print("--------------------------")
with open(output_file, 'r') as file:
    print(file.read())

완전한 애플리케이션 실행하기

애플리케이션을 실행합니다.

python3 /home/labex/project/grading_application.py

프로그램은 학생 데이터를 읽고, 성적을 계산하고, 보고서를 생성하여 콘솔에 표시합니다. 다음과 유사한 출력을 볼 수 있습니다.

Report successfully generated and saved to /home/labex/project/grade_report.txt

Generated Report Contents:
--------------------------
Student Grade Report
====================

Student: John
Subject: Mathematics
Marks: 88
Grade: B
Feedback: Very good! Above average performance.

Student: Emily
Subject: Mathematics
Marks: 92
Grade: A
Feedback: Excellent! Outstanding performance.

...

Class Statistics
---------------
Average Mark: 75.70
Highest Mark: 95.0
Lowest Mark: 42.0

Grade Distribution
-----------------
A: 2
B: 2
C: 3
D: 1
F: 2
Invalid: 0

보고서 파일 검토하기

생성된 보고서 파일을 확인할 수도 있습니다.

cat /home/labex/project/grade_report.txt

파일에는 콘솔에 표시된 것과 동일한 내용이 포함되어야 합니다.

완전한 애플리케이션 이해하기

우리가 만든 완전한 성적 애플리케이션은 몇 가지 중요한 프로그래밍 개념을 보여줍니다.

  1. 파일 I/O (File I/O): 파일에서 데이터를 읽고 파일에 데이터를 쓰는 것
  2. 데이터 처리 (Data Processing): 원시 데이터를 변환하고 분석하는 것
  3. 통계 계산 (Statistics Calculation): 평균을 계산하고 최소/최대 값을 찾는 것
  4. 오류 처리 (Error Handling): 파일 작업 중 발생할 수 있는 오류 관리
  5. 출력 형식 지정 (Formatting Output): 잘 구조화되고 읽기 쉬운 보고서 만들기

이 애플리케이션은 성적 시스템의 실제 사용 사례를 나타내며, Python 의 if-elif-else 문이 교육 환경에서 실용적인 문제를 해결하는 데 어떻게 적용될 수 있는지 보여줍니다.

요약

이 튜토리얼에서는 Python 의 if-elif-else 문을 사용하여 포괄적인 성적 시스템을 성공적으로 구축했습니다. 기본적인 조건문부터 시작하여, 예외 사례를 처리하고, 개인화된 피드백을 제공하며, 실제 학생 데이터를 처리하도록 프로그램을 점진적으로 개선했습니다.

다음은 개발한 주요 기술입니다.

  1. if-elif-else 문을 사용하여 의사 결정 로직 구현
  2. 사용자 입력을 검증하고 오류를 적절하게 처리
  3. 조건에 따라 의미 있는 피드백 제공
  4. 파일에서 데이터를 처리하고 보고서 생성
  5. 데이터 세트에서 통계 계산

이러한 기술은 많은 프로그래밍 작업의 기본이며 성적 시스템 외에도 다양한 실제 시나리오에 적용할 수 있습니다. 배운 조건 논리의 원리는 향후 Python 프로젝트에서 더 복잡한 프로그램을 위한 구성 요소 역할을 할 것입니다.

좋은 프로그래밍 관행에는 다음이 포함됩니다.

  • 명확하고 설명적인 변수 및 함수 이름
  • 적절한 오류 처리
  • 잘 구조화되고 정리된 코드
  • 유용한 주석 및 문서화

이 성적 시스템을 확장하거나 배운 내용을 새로운 프로그래밍 과제에 적용하여 계속 연습하십시오!