همانطور که از اسم سؤال پیداست، از شما میخواهیم برنامهای
با پایتون ۳ بنویسید که اتفاق عجیبی بیفتد!
نحوه عملکرد برنامه به این صورت است:
```python
>>> p = Foo()
>>> print(p.x)
0
>>> p.x = 125
>>> print(p.x)
25
>>> p.x = 15874
>>> print(p.x)
74
>>> p.x = 8
>>> print(p.x)
8
>>> p.x = 13
>>> print(p.x)
13
>>> p.x = -15698
>>> print(p.x)
-1
```
# جزئیات
باید کلاسی به نام `Foo` بنویسید که
یک خصوصیت به نام `x` داشته باشد که طبق این قواعد مقداردهی میشود:
- مقدار اولیه `x` هنگام ساخته شدن کلاس `Foo` صفر است.
- هنگام مقداردهی `x` با یک عدد:
+ اگر عدد نامنفی بود، دو رقم سمت راست آن در `x` ذخیره شود.
+ اگر عدد منفی بود، مقدار x برابر با `-1` شود.
- مقدار ذخیرهشده در `x` باید از نوع `int` باشد.
یک مثال دیگر:
```python
>>> p=Foo()
>>> p.x = 1234
>>> p.x == 34
True
>>> type(p.x)
<class 'int'>
```
# نکات
یک فایل Zip شامل یک فایل به نام `source.py` که کلاس `Foo` در آن قرار دارد آپلود کنید.
میخواهیم برنامهای بنویسیم تا بتوانیم با فایل نمرات دانشجویان کار کرده
و کارهایی که پیش از این توسط مسئولین آموزش به صورت دستی بر روی این فایلها
انجام میشد را خودکار کنیم. هر سطر از این فایل دارای سه بخش است که با
کاراکتر فاصله (`" "`) از هم جدا شدهاند. این سه بخش به ترتیب عبارتند از:
1. شماره دانشجویی (عدد صحیح)
2. کد درس (عدد صحیح)
3. نمره (عدد اعشاری)
یعنی هر سطر از این فایل مشخص میکند که یک دانشجو در یک درس چه نمرهای را
گرفته است.
چند نیاز اساسی در رابطه با این فایلها وجود دارد:
+ میخواهیم بتوانیم یک سطر دلخواه از این فایل را در قالب یک شئ از جنس `Grade` بخوانیم.
+ میخواهیم بتوانیم یک شئ از جنس `Grade` را به صورت یک سطر از فایل نمرات و در انتهای فایل ذخیره کنیم.
+ میخواهیم بتوانیم معدل دانشجویان در یک درس خاص را محاسبه کنیم.
+ میخواهیم بتوانیم معدل یک دانشجو را محاسبه کنیم.
# جزئیات
یک کلاس به نام `Grade` شامل سه خصوصیت با اسامی زیر بنویسید.
+ شماره دانشجویی: `student_id`
+ کد درس: `course_code`
+ نمره: `score`
کلاس شما باید دارای متد سازندهای باشد که این سه خصوصیت را به همین ترتیب دریافت و مقداردهی کند.
با توجه به نیازمندیهایی که در بالا گفته شد، یک کلاس با نام `CourseUtil`
تعریف کنید که همه متدهای جدول زیر را طبق رفتار توضیح داده شده پیادهسازی کند.
| رفتار |خروجی| متد |
|:------------------:|:-------:|:-----------:|
|آدرس فایل نمرات به ورودی این متد داده میشود.|`-`| `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` وجود نداشته باشد.
+ تضمین میشود که در هنگام محاسبه میانگینها شماره دانشجویی یا شماره درس داده شده در فایل موجود است.
در کد زیر یک فایل شامل دو سطر به عنوان ورودی داده شده است.
```
util = CourseUtil()
util.set_file(file)
print(util.count())
grade = Grade(445612,1234,12)
util.save(grade)
print(util.count())
util.set_file(file)
print(util.count())
```
خروجی زیر مورد انتظار است:
```
2
3
3
```
#### آنچه باید آپلود کنید:
یک فایل Zip شامل یک فایل به نام `source.py` که کلاسهای `Grade` و `CourseUtil` در آن قرار دارد آپلود کنید.
منبع سؤال: مسابقات جاواکاپ