سلام بچهها! حالتون خوبه؟ ما هم خوبیم. خداروشکر!
این پست در موردآزمون مقدماتی برنامه نویسیاست. قبول دارم یه کم دیر این پست رو میزینم. راستش ما، هم درگیر امتحان نهایی هستیم هم منتظر بودیم تا کمیته نوع و سطح سوالات این امتحان رو معلوم کنه بعد پست بزنیم اما فعلا خبری نیست. قراره وقتی کمیته درمورد نوع سوالات و نحوه امتحان تصمیم قطعی گرفت، توضیحاتش رو تو سایتhttp://www.inoi.irبذاره. ما هم اگه خبردار شدیم اینجا مینویسیم. حالا فعلا تو این پست یه سری توضیحات کلی درمورد آزمونهای برنامه نویسی و خود برنامه نویسی مینویسم تا ببینیم چی میشه.
------------------------------------------------------------------------------------------------------
به طور کلی تو امتحانهای برنامه نویسی شما مثلا ۵ ساعت وقت دارید و به شما چندتا سوال داده میشه که هر کدوم به این شکل هستند:
برنامه ای بنویسید که از ورودی استاندارد (همون صفحه کلید) ورودی مسئله را بخواند و با توجه به صورت سوال خروجی برنامه را محاسبه کند و آن را در خروجی استاندارد (همون صفحه نمایشگر) چاپ کند! (میبینید که چقدر سوالها ساده است!)
این لینک۳ تا سوال برنامه نویسی به زبان فارسی داره که البته سوالاش خیلی سخته و امتحان شماخیلیاز این آسونتر خواهد بود. این لینک رو گذاشتم فقط برای اینکه ببینید قالب کلی سوال ها چیجوریه. (راستش لینک دیگهای دم دستم نبود که سوالهاش فارسی باشه).
زمان ما همه امتحان ها تو linux بود اما از سال ما به بعد تو دوره تابستون با بچهها تو windows کار میکردن و تو دوره نقره-طلا بهشون linux یاد میدادند. احتمالا این امتحان شما هم توی windows هستش. برنامههاتون رو هم باید به زبان ++C بنویسید.
------------------------------------------------------------------------------------------------------
اما درمورد برنامه نویسی. من اول میخواستم بیام یه کم مقدمات برنامهنویسی رو توضیح بدم ولی دیدم تو وبلاگ خیلی سخته. اما به طور کلی اگه شما میخواید برنامه نویسی رو از صفر شروع کنید بهتره از یکی که بلده بخواید بهتون مقدماتش رو یاد بده. منظورم اینه که اگه بخواید خودتون از رو کتاب یا با اینترنت یاد بگیرید خیلی وقتتون رو میگیره و بهتره که یکی (مثلا یکی از دوستاتون یا یکی از معلمهاتون) پای کامپیوتر مقدماتش رو بهتون یاد بده. اما اگه چیزای اولیه رو بلدید، دیگه باید کمکم خودتون بقیه چیزها رو با اینترنت و کتاب یاد بگیرید. یعنیبایدیاد بگیرید که چگونه از کتاب و مخصوصا اینترنت جواب سوالهاتون رو پیدا کنید. در مورد ++C هم سایت فتوفراوونه که اینجا دوتا از خوباش رو میگم(البته به نظر من خوبن):
سایتwww.cppreference.com: یکی از سایتهای خوبه که توش در مورد کتابخونهها و چیزای دیگهی ++C خیلی خوب و مختصر توضیح داده.
سایتhttp://www.cplusplus.com: توش هم یه بخش داره برایآموزشهم یهمرجع برای کتابخانههای ++Cداره، هم یهforumداره که توش میتونید سوال بپرسید.
معمولا تو امتحانها یه مرجع ++C در اختیار مسابقهدهندهها هست. مثلا تو جهانی پارسال و توی امتحان انتخاب تیم امسال همین سایتwww.cppreference.comبه عنوان مرجع در طول امتحان در اختیار مسابقهدهندهها بود. (البته این به معنی دسترسی به اینترنت نیست. بلکه صفحههای این سایت روی کامپیوتر ذخیره شده و ملت میتونن ازش استفاده کنن). تو این امتحانها یه PDF هم بود که برای آموزش ++C بود واینجابراتون آپلودش کردم (به نظرم این PDF همونقسمت آموزشی http://www.cplusplus.comهستش که به صورت PDF در آوردنش).
یه نکته مهم در مورد ++C، کتابخانه STL هست. این کتابخونه توش هم یه سری تابعبسیاربه درد بخور داره و هم یه سری ظرف (ترجمه container!) . این توابع و ظروف! اینقدر زیادن که من بعد عمری! کار کردن با این کتابخونه هنوز توش چیزای جدید پیدا میکنم. البته اگه این اسمها براتون جدیده اصلا نگران نشید. چون به نظرم خیلی بعیده تو این امتحان سوالی بدن که نیاز به استفاده از این ها مخصوصا container ها داشته باشین. اما به نظر من درمورد تابعمرتبسازیاین کتابخونه اگه استفاده ازش رو بلد باشین خیلی خوبه. از اسمش معلومه که چیکار میکنه و احتمالا خودتون هم میتونید بدون استفاده از STL این تابع رو بنویسید، ولی به هرحال یاد گرفتنش خیلی کارو راحت تر میکنه. اسم این تابعsortهستش و نحوه استفادهاش اینطوریه:
فرض کنید شما یه آرایه از اعداد (مثلا از نوع int) به اسم num دارید که توش n تا عدد ذخیره کردید و حالا میخواید اعدادش رو مرتب کنید. کافیه از تابعsortبه شکل زیر استفاده کنید:
sort(num, num + n); // num esme arayatoone va n tedad adade tooshe.
شاید تو پستهای دیگه در مورد سایر توابع پرکاربرد STL هم نوشتیم. خب این هم درمورد برنامهنویسی و STL. وقتی معلوم شد که امتحانتون چیجوریه و در چه سطحی باید الگوریتم بلد باشید، احتمالا در مورد الگوریتمها هم پست بذاریم. اما فعلا یه سوال برنامه نویسی میگم(از کتاب مسئله های الگوریتمی) که روش فکر کنید.
------------------------------------------------------------------------------------------------------
کتاب مسئلههای الگوریتمی، مسئله ۸۰. متوسط زمان پاسخ یک ماشین:
n کار را میخواهیم روی یک ماشین اجرا کنیم. اجرای کار شماره i به اندازهی tiزمان میگیرد. ماشین در هر لحظه حداکثر میتواند یکی از کارها رو انجام دهد. برنامهای بنویسید که ترتیبی برای اجرای این کارها پیدا کند، به طوری که متوسط زمان پایان یافتن کارها مینیمم شود.
ورودی: در سطر اول ورودی n و در سطر بعدی tiها نوشته شدهاند. فرض کنید n iها صحیح و مثبت اند.
خروجی: در سطر اول فایل خروجی متوسط زمان پایان یافتن کارها و در سطر دوم ترتیب انجام کارها رو بنویسید.
مثال:
ورودی نمونه:
5
34 23 52 13 42
خروجی نمونه:
79
4 2 1 5 3
------------------------------------------------------------------------------------------------------
اگه حلش کردید کدش رو هم بزنید. خب دیگه من باید برم فیزیک بخونم!
موفق باشید
فعلا خداحافظ!