فایل نمرات (تا پایان جلسه شانزدهم)
سطح سوال: ساده
آنچه از این جلسه باید بدانید: فایل و ورودی/خروجی در جاوا
میخواهیم برنامهای بنویسیم تا بتوانیم با فایل نمرات دانشجویان کار کرده و کارهایی که پیش از این توسط مسوولین آموزش به صورت دستی بر روی این فایلها انجام میشد را خودکار کنیم. هر سطر از این فایل دارای سه بخش است که با کاراکتر فاصله (” “) از هم جدا شدهاند. این سه بخش به ترتیب عبارتند از:
- شماره دانشجویی
- کد درس
- نمره
یعنی هر سطر از این فایل مشخص میکند که یک دانشجو در یک درس چه نمرهای را گرفته است.
چند نیاز اساسی در رابطه با این فایلها وجود دارد:
- میخواهیم بتوانیم یک سطر دلخواه از این فایل را در قالب شیای از جنس 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 برگردانید. بدیهتا شمارهی خط از 1 شروع میشود.
- متد setOutputStream ممکن است چند بار فراخوانی شود که پس از هر فراخوانی، اطلاعاتِ outputStream جدید باید خوانده شود.
در کد زیر یک outputStream شامل دو سطر به عنوان ورودی داده شده است.
public static void main(String[] args) { final String content = "777777777 111 13.5" + System.lineSeparator() + "888888888 333 19.5"; ByteArrayOutputStream out = new ByteArrayOutputStream(); try { out.write(content.getBytes()); } catch (IOException e) { } CourseUtilImpl util = new CourseUtilImpl(); util.setOutputStream(out); Grade grade = util.load(1); System.out.println("id: " + grade.getStudentId() + " code: " + grade.getCourseCode() + " score: " + grade.getScore()); Grade g = new Grade(); g.setCourseCode(313); g.setScore(13); g.setStudentId("1111111"); util.save(g); System.out.println("count: " + util.count()); grade = util.load(3); System.out.println("id: " + grade.getStudentId() + " code: " + grade.getCourseCode() + " score: " + grade.getScore()); }
خروجی زیر باید چاپ شود:
id: 777777777 code: 111 score: 13.5 count: 3 id: 1111111 code: 313 score: 13.0
آنچه باید آپلود کنید:
یک فایل زیپ شامل بستهی ir.javacup.io است. به صورتی که وقتی فایل زیپ را باز میکنیم، دقیقا شاخهی ir را ببینیم که درون آن شاخهی javacup و درون آن نیز شاخهی io قرار دارد. در داخل شاخهی io فقط فایلهای CourseUtilImpl.java و Grade.java وجود دارند.
برای داوری تمرین، میتوانید پاسخ خود را در سایت Quera به نحوی که در بالا گفته شد، بارگذاری کنید.
با ما همراه باشید:
آدرس کانال تلگرام: IranianJavaDevelopers@
آدرس صفحه اینستاگرام: javacup.ir
آدرس گروه لینکدین: Iranian Java Developers
سلام وقتتون بخیر
ببخشید من پاسخم رو (چه این سوال چه سوالات دیگه)که آپلود میکنم یه ضرب fail میشه و توی پیغام خطا میگه could not run 7 tests
میخواستم بدونم مشکل از کد هست یا نحوه ارسال؟
ممنونم
سلام
لطفا سوالات خود را بخش «سوال بپرسید» در کوئرا مطرح کنید تا تیم پشتیبانی مشکلتان را بررسی کرده و شما را راهنمایی کند
سلام
“متد setOutputStream ممکن است چند بار فراخوانی شود که پس از هر فراخوانی، اطلاعاتِ outputStream جدید باید خوانده شود.”
این نکته یعنی چی؟ هربار outPutStream جدید باید جایگزین قبلی بشه یا باید اطلاعاتش به قبلی اضافه بشه؟
سلام
هربار outPutStream جدید باید کاملا جایگزین قبلی شود.
با سلام
واسه اپلود که جایی وجود نداره که!
سلام
باید در سایت Quera ثبتنام کرده و وارده شده باشید و در مسابقهی مربوطه هم وارد شده باشید.
در بخش مسابقات –> مسابقات دیگر –> تمرینهای دورهی آموزشی جاواکاپ، ورود به مسابقه را بزنید. از این پس محل آپلود پاسخها رو میتوانید مشاهده کنید.