میخواهیم برنامهای بنویسیم تا بتوانیم با فایل نمرات دانشجویان کار کرده
و کارهایی که پیش از این توسط مسئولین آموزش به صورت دستی بر روی این فایلها
انجام میشد را خودکار کنیم. هر سطر از این فایل دارای سه بخش است که با
کاراکتر فاصله (`" "`) از هم جدا شدهاند. این سه بخش به ترتیب عبارتند از:
1. شماره دانشجویی (عدد صحیح)
2. کد درس (عدد صحیح)
3. نمره (عدد اعشاری)
یعنی هر سطر از این فایل مشخص میکند که یک دانشجو در یک درس چه نمرهای را
گرفته است.
چند نیاز اساسی در رابطه با این فایلها وجود دارد:
+ میخواهیم بتوانیم یک سطر دلخواه از این فایل را در قالب یک شئ از جنس `Grade` بخوانیم.
+ میخواهیم بتوانیم یک شئ از جنس `Grade` را به صورت یک سطر از فایل نمرات و در انتهای فایل ذخیره کنیم.
+ میخواهیم بتوانیم معدل دانشجویان در یک درس خاص را محاسبه کنیم.
+ میخواهیم بتوانیم معدل یک دانشجو را محاسبه کنیم.
## جزئیات
یک کلاس به نام `Grade` شامل سه خصوصیت با اسامی زیر بنویسید.
+ شماره دانشجویی: `student_id`
+ کد درس: `course_code`
+ نمره: `score`
کلاس شما باید دارای متد سازندهای باشد که این سه خصوصیت را به همین ترتیب دریافت و مقداردهی کند.
**این کلاس در فایل پروژه اولیه تکمیل شده است و شما باید تنها کلاس `CourseUtil` را تکمیل کنید.**
با توجه به نیازمندیهایی که در بالا گفته شد، یک کلاس با نام `CourseUtil`
تعریف کنید که همه متدهای جدول زیر را طبق رفتار توضیح داده شده پیادهسازی کند.
```python source.py
class Grade:
def __init__(self, stu_id, crc_code, score):
self.student_id = stu_id
self.course_code = crc_code
self.score = score
class CourseUtil:
def set_file(self, address):
pass
def load(self, line_number):
pass
def calc_student_average(self, student_id):
pass
def calc_course_average(self, course_code):
pass
def count(self):
pass
def save(self, grade):
pass
```
| رفتار |خروجی| متد |
|:------------------:|:-------:|:-----------:|
|آدرس فایل نمرات به ورودی این متد داده میشود.|`-`| `set_file(address)`|
|یک شماره خط از فایل را در ورودی میگیرد و اطلاعات موجود در آن خط از فایل را در قالب یک شئ `Grade` برمیگرداند.|`Grade`| `load(line_number)`|
|یک شئ `Grade` در ورودی میگیرد و طبق فرمت مورد نظر، آن را در انتهای فایل اضافه میکند.|`-`|`save(grade)`|
|میانگین نمرات دانشجویان در درس با کد `course_code` را برمیگرداند. |`float`|`calc_course_average(course_code)`|
|میانگین نمرات دانشجو با شماره دانشجویی `student_id` در درسهای مختلف را برمیگرداند.|`float`|`calc_student_average(student_id)`|
|تعداد کل نمرات موجود در فایل نمرات را برمیگرداند.|`int`|`count()`|
## توضیحات بیشتر
+ آدرس فایل با کمک متد `set_file` در اختیار کلاس قرار داده میشود. شما باید خودتان فایل را به نحوه دلخواه باز کنید.
+ در متد `load` اگر مقدار `line_number` بزرگتر از تعداد خطهای فایل بود، باید `None` برگردانید. شمارهی خطوط از ۱ شروع میشود.
+ متد `set_file` ممکن است چند بار فراخوانی شود که پس از هر فراخوانی، اطلاعات فایل جدید باید خوانده شود.
+ در فایل نمرات برای هر دانشجو در هر درس فقط یک نمره وجود دارد. بنابراین اگر برای دانشجو و درسی که نمره اش در فایل وجود دارد نمره جدیدی با متد `save` ثبت کنیم، نباید در فایل تغییری ایجاد شود.
+ در انتهای فایل `\n` وجود ندارد. شما نیز باید طوری فایل را تغییر دهید که هیچ گاه در انتهای فایل `\n` وجود نداشته باشد.
+ تضمین میشود که در هنگام محاسبه میانگینها شماره دانشجویی یا شماره درس داده شده در فایل موجود است.
## نمونه
در کد زیر یک فایل شامل دو سطر به عنوان ورودی داده شده است.
```python source.py
util = CourseUtil()
util.set_file(file)
print(util.count()) # 2
grade = Grade(445612,1234,12)
util.save(grade)
print(util.count()) # 3
util.set_file(file)
print(util.count()) # 3
```
## نکات
+ میتوانید فایل اولیه این سوال را از [این لینک](/problemset/assignments/4367/download_problem_initial_project/16397/) دریافت کنید.
+ در توابعی که از شما خواسته شده مقداری را بازگردانید، باید مقدار مورد نظر را `return` کنید.
## نحوه ارسال
شما باید کلاس `CourseUtil` موجود در فایل `source.py` را تکمیل و سپس این فایل را ارسال کنید.
**منبع سؤال**: مسابقات جاواکاپ