خوشحالیم که توانستیم بار دیگر در دورهای جدید شما را همراهی کنیم و بتوانیم در راستای طراحی خلاقانه الگوریتمها شما را یاری کنیم! این متن را حتماً بخوانید و تیک «خواندم» آنرا بزنید تا بقیه دوره برایتان باز شود!
در این دوره با کاربرد و اهمیت طراحی الگوریتم آشنا میشویم و میفهمیم تفاوت **الگوریتم خوب** و **الگوریتم بد** واقعاً چیست.
اگرچه این دوره تحت عنوان دورهی پیشرفتهی الگوریتم آمدهاست اما در واقع مقدمهای برای آشنایی با دنیای طراحی الگوریتمها و بهینهسازی است و دنیای طراحی الگوریتم بزرگتر از آن است که در یک دوره بگنجد. امیدواریم تا حد خوبی بتوانیم شما را در این دوره با این دنیای الگوریتمها آشنا کنیم.
# اهداف دوره
در این دوره انتظار میرود شما با مفهوم تحلیل زمانی الگوریتمها، مفاهیم پایهای در طراحی الگوریتم مثل پسگرد، برنامهنویسی پویا، گرافها و ... و همچنین ساختماندادهها آشنا شوید و توانایی حل مسائل الگوریتمی را بدست بیاورید.
# نکاتی در مورد فصلها
این دوره بجز مقدمه شامل ۱۵ فصل مجزا است. هر فصل شامل چند «بخش» است به طوری که هر بخش میتواند یک «**درسنامه**» یا یک «**تمرین**» با *سامانه داوری* یا ترکیبی از این دو باشد. برای آشنایی با فرمت استاندارد مسائل در کوئرا به این [پیوند](https://quera.ir/course/assignments/2693/problems) مراجعه کنید.
بخشها به صورت **الگوریتمی و مستقل از زبان** میباشند و در آن به جای کد از **شِبهِکُد**
*(PsuedoCode)*
استفاده شدهاست.
شبهکد در جعبههایی به صورت زیر ظاهر میشوند و معمولاً به شکل زیر هستند.
```
> FunctionName(functionInputs)
functionInput and variable descriptions
----------------------------------------
function goal
----------------------------------------
// Algorithm:
1. operation1
2. operation2
.
.
.
return value
```
برای مثال شبهکد زیر جمع اعداد زوج از ۱ تا $n$ را برمیگرداند.
```
> sumOfEvenNumbers(n)
n : the upper bound of the numbers we want
------------------------------------------
return the sum of even numbers in [1, n]
------------------------------------------
1. returnValue := 0
2. for i from 1 to n:
3. if i is even:
4. returnValue := returnValue + i
5. return returnValue
```
توضیحات جامعی درباره شبهکد در فصل «ضمیمه» موجود است.
بخش بزرگی از این دوره به صورت **پنهان** در آمده است تا به شما فرصت تفکر روی مسائل را بدهیم همچنین بخشهای الگوریتمی از برنامهنویسی جدا باشد. این بخشها به صورت زیر با رنگبندیهای زیر است.
<details class="orange">
<summary>
راهنمایی
</summary>
در این بخشها میتوانید راهنمایی سؤال مورد نظر را ببینید.
</details>
<details class="red">
<summary>
درسنامهی الگوریتمی یا راهحل سؤال یا راهنمایی زیاد
</summary>
در این بخش میتوانید راهحل سؤالات یا ادامهی درسنامهها را ببینید. این بخشها دارای **بیشترین** اهمیت هستند و به هیچکدام از این بخشها کم توجهی نکنید. بخصوص زمانی که خودتان مسئلهای را حل میکنید حتماً راهحل طراح را هم ببینید.
</details>
<details class="blue">
<summary>
کد *++C*
</summary>
در این بخشها میتوانید توضیحاتی راجع به پیادهسازی سؤال مورد نظر یا درسنامهی مورد نظر ببینید. بخش های مربوط به پیادهسازی *++C* در اینجا آمدهاست. برای مثال کد شبهکد بالا به صورت زیر خواهد بود:
```cpp
// In the name of God
#include <iostream>
using namespace std;
long long sumOfEvenNumbers(int n) {
long long returnValue = 0;
for (int i = 0; i <= n; i++)
if (i % 2 == 0) {
returnValue += i;
}
return returnValue;
}
int main () {
int n;
cin >> n;
cout << sumOfEvenNumbers(n) << endl;
return 0;
}
```
</details>
<details class="green">
<summary>
کد *پایتون*
</summary>
در این بخشها میتوانید توضیحاتی راجع به پیادهسازی سؤال مورد نظر یا درسنامهی مورد نظر ببینید. بخش های مربوط به پیادهسازی *پایتون* در اینجا آمده است. برای مثال کد شبهکد بالا به صورت زیر خواهد بود:
```python
# In the name of God
def sum_of_even_numbers(n):
return sum([x for x in range(1, n+1) if x % 2 == 0])
n = int(input())
print(sum_of_even_numbers(n))
```
</details>
**نکته مهم**: گاهاً درسنامهها و نکات برنامهنویسی و الگوریتمی در قالب **راهحل یا راهنمایی** سؤال آمدهاست بنابراین **حتماً** راهحل سؤالات را بخوانید تا نکتههایی را دریابید. همچنین این بخشها به صورت پنهانشده هستند تا بتوانید قبل از خواندن راهحل سؤال به خوبی روی سؤال فکر کنید.
درسنامههای زبان به زبان *++C* و *پایتون* هستند دلیل اینکه این زبان انتخاب شدهاست قابلیتهای زیاد آن است و همهی الگوریتمها و ساختمانهای داده را میتوان با آنها پیادهسازی کرد.
راهحل هر کدام از سؤالات با پرداخت امتیاز به زبانهای *پایتون* و *++C* موجود است.
بخش تمرینات دورهای برای تمرین بیشتر بخشهای قبلی و افزایش امتیاز برای درج در گواهی موجود است. این تمرینات ممکن است کمی سختتر از سؤالات بخشهای دیگر باشند ولی حل آنها حتماً به افزایش قابلیتهایتان کمک خواهند کرد.
# سیستم امتیازات
در این دوره هر تمرین یا درسنامه امتیازی تعریف شده دارد. با گذراندن هر درسنامه یا حل هر تمرین، امتیاز آن به شما تعلق میگیرد. از این امتیاز میتوانید برای خریداری راهحل و یا تستکیسهای سوالها استفاده کنید. توصیه میکنیم تا حد امکان کد راهحل سؤال را با پرداخت امتیاز نخرید؛ تا علاوه بر اینکه مطلب بهتر برایتان جا میافتد، امتیازتان برای درج در گواهی دوره بالا باقی بماند.
در درسنامه بعدی راجع به سیستم امتیازات بیشتر توضیح داده شده است.
# پیشنیازها
آشنایی با حداقل یک زبان برنامهنویسی برای گذراندن دوره نیاز است. همچنین آشنایی مقدماتی با مفاهیم ریاضی همانند استقرا، گرافها و مفاهیم ترکیبیاتی به شما بسیار کمک میکند و کارتان را راحتتر میکند. البته تلاش کردهایم به همه تعاریف به صورت مقدماتی بپردازیم.
میتوانید با تمام زبانهایی که کوئرا پشتیبانی میکند این دوره را بگذرانید. در تمامی بخشهای کد محور بجای نوشتن کد به زبانی خاص، *شبهکد* نوشته شدهاست. درسنامههای زبان اضافهتر در ضمیمه برای کاربردها و کتابخانههای الگوریتمی زبانها به دو زبان *++C* و *پایتون* موجود است و اکثر الگوریتمها در کنار شبهکد به این دو زبان هم پیادهسازی شدهاند.
# ضمیمهی دوره
در انتهای دوره فصلی تحت عنوان **ضمیمه** موجود است که حاوی اطلاعات خوبی مانند منابع مفید و همچنین نکات برنامهنویسی است. اکثر درسنامههای زبانهای برنامهنویسی و پیادهسازیهای مهم که در آنجا آورده شده است. توصیه میکنیم هر جا از نظر برنامهنویسی به مشکلی برخورد کردید به این بخش مراجعه کنید.
# بخش گفتوگو
خیلی از سؤالات دوره ممکن است برایتان سخت باشد ولی شما با استفاده از **سیستم گفتوگو**ی کوئرا میتوانید از تجربهی دیگر شرکتکنندهها بهره ببرید تا سؤالات را با راهنمایی طراحان یا تجربههای دیگران حل کنید و شدیداً توصیه میکنیم از این سیستم استفاده کنید.
در این بخش میتوانید با طراحان دوره نیز در ارتباط باشید. سؤالاتی که سؤالات خیلی از شرکتکنندهها باشد را طراحان به این بخش اضافه میکنند. همچنین ممکن است هر سؤال نکاتی داشتهباشد که در این بخش بیان شدهباشد. بنابراین حتماً از این امکان استفادهکنید!
# بخش سوال خصوصی
هرگونه اشکالی در دوره مشاهده کردید یا هرگونه پیشنهادی برای بهبود دوره داشتید یا اگر به مشکلات خاصی برخورد کردید یا پس از چندبار بررسی کدتان اشکالش را پیدا نکردید یا اشکال خاصی در سوال یا درسنامه دیدید میتوانید از طریق سوال خصوصی با پشتیبانهای دوره در تماس باشید. تلاش بر این است تا هیچ سوالی بیشتر از ۲۴ ساعت منتظر نماند. (به طور میانگین زمان انتظار کمتر از ۱۲ ساعت است)
# زمان شروع و مهلت پایان دوره
دورهها از روی سایت برداشته نخواهند شد و تا قبل از فصل «**طراحی استقرایی الگوریتمها**» هیچ محدودیت زمانی برای شما در نظر گرفته نشده است. هنگامی که به این فصل برسید محدودیت زمانی دوره با تایید شما آغاز میشود و شما **۹۰ روز** زمان دارید تا دوره را به اتمام برسانید. مهلت باقی مانده خود را میتوانید در پایینِ صفحهی خانهی دوره ببینید. در صورت اتمام مهلت دوره، محتوا همچنان در اختیار شما خواهد بود اما امکان ارسال و داوری را نخواهید داشت و در نتیجه نمیتوانید در دوره پیش بروید. البته میتوانید با پرداخت مبلغی برای تمدید مهلت دوره خود اقدام کنید.
# پیشنهادهای ما
برنامههایی که به زبان *++C* نوشته میشوند معمولاً در اجرا سریعتر هستند اما نوشتن برنامهها به زبان *پایتون* سادهتر است. میتوانید دوره را به هر زبانی که کوئرا پشتیبانی میکند بگذرانید اما پیشنهاد ما یکی از این دو زبان است. (یا اگر دوست داشتید هر دو)
اگر چه این دوره شامل تمرینات بسیار برای افزایش مهارت برنامهنویسی الگوریتمی است ولی قطعاً کافی نیست و دنیای الگوریتم گستردهتر از آن است که در یک دوره بگنجد. امیدواریم با این دوره بتوانید با این دنیا آشنا شوید و با تمرین بیشتر (از بانک سوالات کوئرا یا منابع دیگر) به مهارت مدنظرتان برسید.