score.py
[공지사항] 반도체 공정 기초
공지사항입니다.
- 파이썬
- 어렵다
- 그만그만그만그만그만
#
#!/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[ ]:
#
댓글남기기