اردوی انتخابی برنامهنویسی مرحله ۲ المپیاد کامپیوتر، شامل ۲ امتحان برنامهنویسی میباشد که در ۲ روز پشت سر هم برگزارمیشود. هر امتحان، شامل تعدادی سوال برنامهنویسی میباشد که در ابتدای مسابقه به شرکتکنندگان داده میشود. شرکتکنندگان در زمان تعیین شده فرصت دارند تا به جواب این سوالات برسند.
شرکت کنندگان
شرکتکنندگان در این دوره حدود ۶۰ نفر برتر آزمون تستی/تشریحی مرحلهی دوم میباشند. در پایان آزمون از این تعداد، منتخبین شرکت در دوره تابستان المپیاد کامپیوتر برگزیده خواهند شد.
مشخصات سیستم
برای پاسخگویی به سوالات در طول امتحان یک کامپیوتر به هر فرد داده میشود که دارای ویژگیهای زیر میباشد:
سوالات آزمون
سؤالات این آزمون غالباً نیاز به دانستن الگوریتم خاصی ندارند و بر پایهی محاسبات ریاضی یا ایدههای خلاقانه هستند. در هر سؤال از شرکتکننده یک عدد نهایی خواسته میشود و شرکتکننده با استفاده از رایانهای که در اختیار دارد میبایست عدد خواسته شده را محاسبه کند.
یک نمونهی ساده از چنین سؤالی، باقیماندهی عدد ۲۰۰۹ بهتوان ۱۳۸۹ بر ۴۹۹۹۹ است. این کار با استفاده از روشهای دستی و بدون از رایانه، عملاً کاری وقتگیر است. اما با دانستن زبان C++ و توانایی نوشتن یک برنامهی ساده، جواب را میتوان در چند دقیقه محاسبه کرد. یک سؤال مشابه دیگر، تعداد اعداد اوّل ۷ رقمی است.
دقت کنید که در این آزمون از شما متن برنامه خواسته نمیشود و تنها باید برای هر سؤال یک عدد را (به هر روش مُجاز ای با استفاده از برنامهنویسی و محاسبه) بهدست بیاورید.
نمونه سوالات آزمون آزمایشی
۶ سؤال نمونه برای این آزمون در فایل final_bahman.pdf قرار دارند. این آزمون در تاریخ ۲۹ بهمنماه ۱۳۸۸ با شرکت منتخبین سال گذشته به صورت آزمایشی برگزار شد و در آن به هر یک از شرکتکنندگان یک عدد (دلتا)ی منحصر بفرد داده میشد که معمولاً یک عدد اوّل ۳ یا ۴ رقمی بود.
یک نمونه از کدهایی که میتوانستند جواب سؤالات را بهدست بیاورند در فایل solution_bahman.pdf قرار دارد. لازم بهذکر است که جوابهای این فایل تنها یکی از چندین روش نوشتن برنامه برای مسائل بودهاند و بههیچوجه بهترین یا زیباترین یا سریعترین جواب ممکن نیستند. جوابهای بهتری با استفاده از دستورات و ساختارهای دیگر زبان C++ ممکن است وجود داشته باشد.
نکات برای آزمون
شرکتکنندگان در این دوره باید قادر باشند بهراحتی در زبان C++ برنامههای ساده بنویسند. مفاهیمی نظیر تعریف متغیر، دانستن محدود متغیرها (حداکثر int و long long)، تعریف آرایه، شرط، حلقه و خواندن و نوشتن ورودی و خروجی از حداقل تواناییهای لازم برای برنامهنویسی به شمار میروند.
توصیه میشود که شرکتکنندگان با مفاهیمی نظیر آرایه چند بعدی، توابع، توابع بازگشتی، رشتههای C++ (تایپ string)، اعداد اعشاری در C++، توابع سادهی STL نظیر sort نیز آشنا باشند.
تمرین کار با تسهیلات C++ نظیر کلاسها، دادهساختارهای STL نظیر map و set، توابع C و C++ نظیر rand() و نیز تکنیکهایی نظیر استفاده از stringstreamها یا کار با bitset بالطبع میتوانند تسلّط برنامهنویس را بالا برده و زمان صرف شده برای نوشتن کد را کاهش دهند. هیچ یک از این موارد به هیچ وجه برای قبول شدن در این آزمون الزامی نیستند و تنها احتمال رسیدن سریعتر و دقیقتر به جواب را ممکن است افزایش بدهند.
توجه شود که هیچ یک از موارد گفته شده الزامی نیستند، چرا که از شرکتکنندگان کد یا الگوریتم خاصی درخواست نمیشود، بلکه شرکتکننده باید بتواند در زمان مقرّر، به پاسخ (عدد نهایی) حداکثر تعداد سؤالات برسد.
مراجع مفید برای آزمون
تلاش برای پیادهسازی برخی مسائل مرحله اوّل یا دوم سالهای گذشتهی المپیاد کامپیوتر با رایانه، میتواند تمرین خوبی باشد.
همچنین وبسایت http://projecteuler.net حدود ۳۰۰ مسئله شبیه به مسائلی که این آزمون دارد را در بر میگیرد که جواب هر مسئله، مشابه این آزمون یک عدد تنها است و از شما متن برنامه یا نحوه نگارش برنامه به هیچ وجه خواسته نمیشود.
مراجع مفید برای برنامه نویسی
سایت http://www.cplusplus.com راهنمای جامعی برای زبان C++ است.
کتابهای «How to Program in C++, by Deitel and Deitel» و یا ترجمهی آن موسوم به «C++ تألیف دایتل و دایتل» یکی از شناختهشدهترین مراجع آموزش برنامهنویسی است. همچنین کتابهای «آموزش برنامهنویسی C++ در ۲۱ روز» و کتاب «برنامهنویسی بهزبان C++» مهندس جعفرنژاد قمی و کتاب «چگونه با C++ برنامه بنویسیم» ترجمهی مهندس ابراهیمزادهی قلزم کتابهای مفیدی برای یادگیری زبان C++ هستند.
با آرزوی موفقیت،
مسئولین علمی و اجرایی دوره
خرداد ۸۹