یا لطیف
سلام بچهها! حالتون خوبه؟ ما هم خوبیم. خداروشکر!
این پست در مورد آزمون مقدماتی برنامه نویسی است. قبول دارم یه کم دیر این پست رو میزینم. راستش ما، هم درگیر امتحان نهایی هستیم هم منتظر بودیم تا کمیته نوع و سطح سوالات این امتحان رو معلوم کنه بعد پست بزنیم اما فعلا خبری نیست. قراره وقتی کمیته درمورد نوع سوالات و نحوه امتحان تصمیم قطعی گرفت، توضیحاتش رو تو سایت 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 <= 100 و ti ها صحیح و مثبت اند.
خروجی: در سطر اول فایل خروجی متوسط زمان پایان یافتن کارها و در سطر دوم ترتیب انجام کارها رو بنویسید.
مثال:
ورودی نمونه:
5
34 23 52 13 42
خروجی نمونه:
79
4 2 1 5 3
------------------------------------------------------------------------------------------------------
اگه حلش کردید کدش رو هم بزنید. خب دیگه من باید برم فیزیک بخونم!
موفق باشید
فعلا خداحافظ!