میخواهیم برنامهای بنویسیم تا بتوانیم با فایل نمرات دانشجویان کار کرده
و کارهایی که پیش از این توسط مسئولین آموزش به صورت دستی بر روی این فایلها
انجام میشد را خودکار کنیم. هر سطر از این فایل دارای سه بخش است که با
کاراکتر فاصله (" ") از هم جدا شدهاند. این سه بخش به ترتیب عبارتند از:
- شماره دانشجویی (عدد صحیح)
 - کد درس (عدد صحیح)
 - نمره (عدد اعشاری)
 
یعنی هر سطر از این فایل مشخص میکند که یک دانشجو در یک درس چه نمرهای را گرفته است.
چند نیاز اساسی در رابطه با این فایلها وجود دارد:
- میخواهیم بتوانیم یک سطر دلخواه از این فایل را در قالب یک شئ از جنس کلاس 
Gradeبخوانیم. - میخواهیم بتوانیم یک شئ از جنس 
Gradeرا به صورت یک سطر از فایل نمرات و در انتهای فایل ذخیره کنیم. - میخواهیم بتوانیم معدل دانشجویان در یک درس خاص را محاسبه کنیم.
 - میخواهیم بتوانیم معدل یک دانشجو را محاسبه کنیم.
 
جزئیات
یک کلاس به نام Grade شامل سه خصوصیت با اسامی زیر بنویسید.
- شماره دانشجویی: 
student_id - کد درس: 
course_code - نمره: 
score 
کلاس شما باید دارای متد __construct باشد که این سه خصوصیت را به همین ترتیب دریافت و مقدار دهی کند.
با توجه به نیازمندیهایی که در بالا گفته شد، یک کلاس با نام 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شماره خطی که داده میشود حتما در فایل وجود دارد. - فرض کنید به جز برنامه شما، برنامههای دیگری نیز به فایل داده شده دسترسی دارند و ممکن است بین ۲ فراخوانی متوالی متدی مانند 
loadمحتویات فایل تغییر کرده باشد. - در فایل نمرات برای هر دانشجو در هر درس فقط یک نمره وجود دارد. بنابراین اگر برای دانشجو و درسی که نمره اش در فایل وجود دارد نمره جدیدی با متد 
saveثبت کنیم، نباید در فایل تغییری ایجاد شود. - در انتهای فایل 
\nوجود ندارد. شما نیز باید طوری فایل را تغییر دهید که هیچ گاه در انتهای فایل\nوجود نداشته باشد. - تضمین میشود که در هنگام محاسبه میانگینها شماره دانشجویی یا شماره درس داده شده در فایل موجود است.
 - تضمین می شود که مقدار وردی به عنوان 
file_address$مستقیما به عنوان ورودی توابعfile_get_contentsوfile_put_contentsقابل استفاده است. 
در کد زیر یک فایل شامل دو سطر به عنوان ورودی داده شده است.
$util = new CourseUtil();
$util->set_file($file_address);
echo $util->count();
$grade = new Grade(445612, 1234, 12);
$util->save($grade);
echo $util->count();
$util->set_file($file_address);
echo $util->count();
خروجی زیر مورد انتظار است:
2
3
3
آنچه باید آپلود کنید:
یک فایل Zip شامل یک فایل به نام source.php که کلاسهای Grade و CourseUtil در آن قرار دارد آپلود کنید.
منبع سؤال: مسابقات جاواکاپ
ارسال پاسخ برای این سؤال