خانه / آموزش / تمرین‌های آموزشی / فایل نمرات (تا پایان جلسه شانزدهم)

فایل نمرات (تا پایان جلسه شانزدهم)

سطح سوال: ساده

آنچه از این جلسه باید بدانید: فایل و ورودی/خروجی در جاوا

می‌خواهیم برنامه‌ای بنویسیم تا بتوانیم با فایل نمرات دانشجویان کار کرده و کارهایی که پیش از این توسط مسوولین آموزش به صورت دستی بر روی این فایل‌ها انجام می‌شد را خودکار کنیم. هر سطر از این فایل دارای سه بخش است که با کاراکتر فاصله (” “) از هم جدا شده‌اند. این سه بخش به ترتیب عبارتند از:

  1. شماره دانشجویی
  2. کد درس
  3. نمره

یعنی هر سطر از این فایل مشخص می‌کند که یک دانشجو در یک درس چه نمره‌ای را گرفته است.

چند نیاز اساسی در رابطه با این فایل‌ها وجود دارد:

  • می‌خواهیم بتوانیم یک سطر دلخواه از این فایل را در قالب شی‌ای از جنس Grade بخوانیم.
  • می‌خواهیم بتوانیم یک شی از جنس Grade را به صورت یک سطر از فایل نمرات و در انتهای فایل ذخیره کنیم.
  • می‌خواهیم معدل دانشجویان در یک درس خاص را محاسبه کنیم.
  • می‌خواهیم معدل یک دانشجو را محاسبه کنیم.

بسته ir.javacup.io را دانلود کرده و محتوای آن را ببینید. در کلاس Grade سه فیلد برای این سه ویژگی در نظر گرفته شده است.

  • شماره دانشجویی : studentId
  • کد درس: courseCode
  • نمره: score

با توجه به نیازمندی‌هایی که در بالا گفته شد، در واسط CourseUtil تعدادی متد تعریف شده است که انتظار داریم در کلاس CourseUtilImpl، طبق آنچه که در جدول زیر توضیح داده‌شده است، ‌آن‌ها را پیاده‌سازی کنید.

رفتار متد
فایل ورودی به صورت یک ByteArrayOutputStream در ورودی این متد داده می‌شود. void setOutputStream(ByteArrayOutputStream out);
یک شماره خط از فایل را در ورودی می‌گیرد و اطلاعات موجود در آن خط از فایل را در قالب یک شی Grade برمی‌گرداند. Grade load(int lineNumber);
یک شی Grade در ورودی می‌گیرد و طبق فرمت مورد نظر، آن را در انتهای outputStream اضافه می‌کند. void save(Grade grade);
میانگین نمرات دانشجویان در درس با کد courseCode را محاسبه می‌کند. double calcCourseAverage(int courseCode);
میانگین نمرات دانشجو با شماره دانشجویی studentId در درس‌های مختلف را محاسبه می‌کند. double calcStudentAverage(String studentId);
تعداد کل نمرات موجود در فایل نمرات را برمی‌گرداند. int count();

نکات

  • محتوای فایل با کمک متد (setOutputStream(ByteArrayOutputStream out در قالب یک OutputStream در اختیار کلاس قرار داده می‌شود.
  • در متد load اگر مقدار lineNumber بزرگتر از تعداد خط‌های فایل بود، باید null برگردانید. بدیهتا شماره‌ی خط از ۱ شروع می‌شود.
  • متد setOutputStream ممکن است چند بار فراخوانی شود که پس از هر فراخوانی، اطلاعاتِ outputStream جدید باید خوانده شود.

در کد زیر یک outputStream شامل دو سطر به عنوان ورودی داده شده است.

 

خروجی زیر باید چاپ  شود:

 

آنچه باید آپلود کنید:

یک فایل زیپ شامل بسته‌ی ir.javacup.io است. به صورتی که وقتی فایل زیپ را باز می‌کنیم، دقیقا شاخه‌ی ir را ببینیم که درون آن شاخه‌ی javacup و درون آن نیز شاخه‌ی io قرار دارد. در داخل شاخه‌ی io فقط فایل‌های CourseUtilImpl.java و Grade.java وجود دارند.

برای داوری تمرین، می‌توانید پاسخ خود را در سایت Quera به نحوی که در بالا گفته شد، بارگذاری کنید.

با ما همراه باشید:

آدرس کانال تلگرام: IranianJavaDevelopers@

آدرس صفحه اینستاگرام: javacup.ir

آدرس گروه لینکدین: Iranian Java Developers

 


درباره مهناز خورسندی

همچنین بررسی کنید

گزارش‌گیری

نام و تاریخ مسابقه: جی‌کل ۶ – ۱۸ بهمن ۱۳۹۶ مباحث: رشته و آرایه  

۴ نظر

  1. با سلام
    واسه اپلود که جایی وجود نداره که!

     
    • سلام
      باید در سایت Quera ثبت‌نام کرده و وارده شده باشید و در مسابقه‌ی مربوطه هم وارد شده باشید.
      در بخش مسابقات –> مسابقات دیگر –> تمرین‌های دوره‌ی آموزشی جاواکاپ، ورود به مسابقه را بزنید. از این پس محل آپلود پاسخ‌ها رو می‌توانید مشاهده کنید.

       
  2. سلام
    “متد setOutputStream ممکن است چند بار فراخوانی شود که پس از هر فراخوانی، اطلاعاتِ outputStream جدید باید خوانده شود.”
    این نکته یعنی چی؟ هربار outPutStream جدید باید جایگزین قبلی بشه یا باید اطلاعاتش به قبلی اضافه بشه؟

     

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *