2 분 소요

[공지사항] 반도체 공정 기초

공지사항입니다.

  • 파이썬
  • 어렵다
  • 그만그만그만그만그만

포스텍 버튼입니다

KakaoTalk_20240512_173520231

#

#!/usr/bin/env python
# coding: utf-8

# In[1]:


def average(score):
    """점수를 기반으로 해당 점수의 학점을 반환합니다."""
    if score >= 90:
        return 'A'
    elif score >= 80:
        return 'B'
    elif score >= 70:
        return 'C'
    elif score >= 60:
        return 'D'
    else:
        return 'F'

def read_students(filename):
    """지정된 파일로부터 학생 데이터를 읽어서 학생 리스트를 반환합니다. 각 학생은 식별번호, 이름, 중간고사 점수, 기말고사 점수로 구성됩니다."""
    students = []
    try:
        with open(filename, "r") as fr:
            for line in fr:
                line = line.strip()
                parts = line.split("\t")
                if len(parts) != 4:
                    print(f"Warning: Invalid data format in line: {line}")
                    continue

                sid, name, mid, fin = parts
                try:
                    mid = int(mid)
                    fin = int(fin)
                    avg = (mid + fin) / 2
                    grade = average(avg)
                    students.append([sid, name, mid, fin, avg, grade])
                except ValueError:
                    print(f"Warning: Invalid score data in line: {line}")
                    continue
    except FileNotFoundError:
        print("Error: File not found.")
    return students

def show_function(slist):
    """저장된 학생 리스트를 평균 점수에 따라 정렬하여 표시합니다."""
    print(f"{'Student':<15}{'Name':<14}{'Midterm':>9}{'Final':>9}{'Average':>9}{'Grade':>9}")
    print("-" * 65)
    for student in sorted(slist, key=lambda x: x[4], reverse=True):
        print(f"{student[0]:<15}{student[1]:<14}{student[2]:>8}{student[3]:>9}{student[4]:>9.1f}{student[5]:>9}")

def search_function(slist):
    """사용자가 입력한 ID를 기반으로 학생을 검색하고 그의 세부 정보를 출력합니다."""
    search_id = input("Student ID: ").strip()
    found = False
    for student in slist:
        if student[0] == search_id:
            print(f"{'Student':<15}{'Name':<14}{'Midterm':>9}{'Final':>9}{'Average':>9}{'Grade':>9}")
            print("-" * 65)
            print(f"{student[0]:<15}{student[1]:<14}{student[2]:>8}{student[3]:>9}{student[4]:>9.1f}{student[5]:>9}")
            found = True
            break
    if not found:
        print("NO SUCH PERSON.")

def change_function(slist):
    """학생의 중간고사 또는 기말고사 점수를 변경합니다."""
    student_id = input("Student ID: ").strip()
    student = next((s for s in slist if s[0] == student_id), None)
    if student is None:
        print("NO SUCH PERSON.")
        return

    exam_type = input("Mid or Final? ").strip().lower()
    if exam_type not in ["mid", "final"]:
        
        return

    new_score = input("Input new score: ").strip()
    try:
        new_score = int(new_score)
        if not 0 <= new_score <= 100:
            
            return
    except ValueError:
        
        return

    if exam_type == "mid":
        print(f"{'Student':<15}{'Name':<14}{'Midterm':>9}{'Final':>9}{'Average':>9}{'Grade':>9}")
        print("-" * 65)
        print(f"{student[0]:<15}{student[1]:<14}{student[2]:>8}{student[3]:>9}{student[4]:>9.1f}{student[5]:>9}")
        student[2] = new_score
    else:
        print(f"{'Student':<15}{'Name':<14}{'Midterm':>9}{'Final':>9}{'Average':>9}{'Grade':>9}")
        print("-" * 65)
        print(f"{student[0]:<15}{student[1]:<14}{student[2]:>8}{student[3]:>9}{student[4]:>9.1f}{student[5]:>9}")
        student[3] = new_score

    print("Score changed.")
    student[4] = (student[2] + student[3]) / 2
    student[5] = average(student[4])
    print(f"{student[0]:<15}{student[1]:<14}{student[2]:>8}{student[3]:>9}{student[4]:>9.1f}{student[5]:>9}")
    

def add_function(slist):
    """새로운 학생을 리스트에 추가합니다."""
    new_id = input("Student ID: ").strip()
    if any(student[0] == new_id for student in slist):
        print("ALREADY EXISTS.")
        return
    new_name = input("Name: ").strip()
    new_mid = int(input("Midterm Score: "))
    new_final = int(input("Final Score: "))
    new_avg = (new_mid + new_final) / 2
    new_grade = average(new_avg)
    slist.append([new_id, new_name, new_mid, new_final, new_avg, new_grade])
    print("Student added.")
def searchgrade_function(slist):
    """지정된 학점에 해당하는 모든 학생을 검색하여 출력합니다."""
    print("searchgrade")
    grade = input("Grade to search: ").strip().upper()

    if grade not in ["A", "B", "C", "D", "F"]:
        print("NO RESULTS.")
        return


    found = [student for student in slist if student[5] == grade]

    if not found:
        print("NO RESULTS.")
    else:
        print(f"{'Student':<15}{'Name':<14}{'Midterm':>9}{'Final':>9}{'Average':>9}{'Grade':>9}")
        print("-" * 65)
        for student in found:
            print(f"{student[0]:<15}{student[1]:<14}{student[2]:>8}{student[3]:>9}{student[4]:>9.1f}{student[5]:>9}")

def remove_function(slist):
    """리스트에서 지정된 ID의 학생을 제거합니다."""
    if not slist:
        print("List is empty.")
        return

    remove_id = input("Student ID: ").strip()
    for index, student in enumerate(slist):
        if student[0] == remove_id:
            slist.pop(index)
            print("Student removed.")
            return
    print("NO SUCH PERSON.")

def quit_function(slist):
    """프로그램을 종료하고 선택적으로 변경사항을 파일에 저장합니다."""
    save = input("Save data? [yes/no]: ").strip().lower()
    if save == "yes":
        filename = input("File name: ").strip()  # 사용자로부터 파일 이름을 입력받음
        if not filename:  # 파일 이름이 비어 있는 경우 기본 이름 사용
            filename = "students.txt"
        with open(filename, "w") as fw:
            for student in slist:
                
                fw.write(f"{student[0]}\t{student[1]}\t{student[2]}\t{student[3]}\n")
        print(f"Changes saved to {filename}.")
    print("Exiting program.")
    exit()



def main():
    
    import os
    import sys
    try :
        filename = sys.argv[1]
    except:
        filename = "students.txt"
    slist = read_students(filename)
  
    while True:
        command = input("# ").strip().lower()
        if command == "show":
            show_function(slist)
        elif command == "search":
            search_function(slist)
        elif command == "changescore":
            change_function(slist)
        elif command == "add":
            add_function(slist)
        elif command == "searchgrade":
            searchgrade_function(slist)
        elif command == "remove":
            remove_function(slist)
        elif command == "quit":
            quit_function(slist)
            break
        else:
            print("Invalid command.")

if __name__ == "__main__":
    main()


# In[ ]:





# In[ ]:





#

댓글남기기