الگوریتمها امروزه به جز جداییناپذیری از زندگی ما تبدیل شدهاند، هرچیزی که در زندگی روزمرهی خود با آن سروکار داریم به نوعی از یک الگوریتم تشکیل شده است، اجازه دهید قبل از هرچیزی این موضوع را با یک مثال ساده برای شما توضیح دهیم، یک ماشین لباسشویی را در نظر بگیرید که به صورت خودکار مراحل شستشوی لباسها را برای شما انجام میدهد، این لباسشویی بهگونهای برنامهریزی شده که در هر مرحله فرایند خاصی را انجام دهد:
- مادهی شوینده
- چرخش مخزن
- آبکشی لباسها
همهوهمه به ترتیب و پشتسر هم انجام میشوند که توسط یک برنامه کنترل خواهند شد، اما این برنامه قبل از هرچیز، خود از یک الگوریتم تشکیل شده است، الگوریتمها مفاهیم بسیار جذابی هستند که در این مقاله بهطور کامل با آنها آشنا میشویم، اما توصیه میکنیم قبل از اینکه مقاله را تا انتها بخوانید، ویدئوکست زیر را بشنوید تا در ابتدا با زبانی ساده با مفهوم الگوریتم آشنا شوید، پس از آن، تا انتهای مقاله با ما همراه باشید تا مثالهای ساده و کاربری از الگوریتمها را با هم بررسی کنیم.
الگوریتم یکی از راههای حل مسئله با روشهای ریاضی و منطقی است، این روش برای نخستین بار توسط خوارزمی (دانشمند ایرانی) مورد توجه قرار گرفت، در حال حاضر اساس اجرای بسیاری از برنامههای کامپیوتری روش خوارزمی است، نام الگوریتم نیز به احترام این دانشمند و از کلمهی الخوارزمی گرفته شده است.
در این آموزش قصد داریم با زبانی ساده مفهوم الگوریتم را برای شما شرح دهیم و مثالهایی کاربردی از الگوریتم را در زندگی روزمره با هم بررسی کنیم، پس از آن چند الگوریتم ریاضی را با هم بررسی کرده و در پایان نیز با برخی از الگوریتمهای پرکاربرد علم کامپیوتر آشنا خواهیم شد.
همانطوری که گفته شد، اساس اجرای بسیاری از برنامههای کامپیوتری، الگوریتم میباشد، طرح اصلی خیلی از نرمافزارهایی که در حال استفاده از آنها هستیم ابتدا توسط الگوریتم و فلوچارت (روندنما) ایجاد و سپس به برنامه و در نهایت به زبان کامپیوتر برنامهنویسی میشود، بنابراین اگر میخواهید برنامهنویس خوبی شوید و از پس حل مسائل مختلف برآیید باید به خوبی با مفهوم الگوریتم آشنا بوده و بتوانید طرح و ایدهی خود را در قالب الگوریتم و فلوچارت پیادهسازی کنید.
شاید با دیدن تصویر بالا پیش خود فکر کنید که میخواهیم برای شروع آموزش الگوریتمنویسی شما را با تعداد زیادی محاسبات ریاضی گیج کننده درگیر کنیم، باید بگوییم که اصلا اینطور نیست!
برای شروع احتیاجی به این محاسبات پیچیده نداریم، هرچند که باید بدانیم اساس کار برنامههای کامپیوتری بر مبنای همین محاسبات پیچیده است.
“دونالد کنوت“ یکی از دانشمندان بزرگ علوم کامپیوتر میگوید: علم کامپیوتر چیزی جز مطالعهی الگوریتمها نیست.
راه حل مسائل پیچیده و بزرگی که بر سر راه یک برنامه نویس پیش میآیند، تسلط بر الگوریتمهاست؛ زیرا با نوشتن یا تصور یک الگوریتم منطقی میتوان بر تمام مسائل غلبه کرد.
برای نوشتن یک الگوریتم مناسب باید سه عامل اصلی را در صورت مسئله شناسایی کنیم:
- مقادیر معلوم: اطلاعاتی که در اختیار ما قرار داده شده و باید به کمک آنها به حل مسئله بپردازیم (دادهها)
- خواستههای مسئله: نتایجی که در اثر انجام محاسبات بر روی دادههای مسئله حاصل میشود (مقادیر مجهول)
- عملیات محاسباتی: دستورات و روابط منطقی که برای رسیدن به خواستههای مسئله بر روی دادهها و مقادیر مجهول انجام میشود.
به عنوان مثال فرض کنید وزن مقداری سیب و قیمت هر کیلوگرم از آن به ما داده شده است، از ما خواسته میشود قیمت کل سیبها را محاسبه کنیم.
در این مثال:
دادهها: وزن سیبها (W) و قیمت هر کیلوگرم سیب (P)
خواستهها: محاسبهی قیمت کل سیبها (T)
عملیات محاسباتی: قیمت کل = وزن سیبها * قیمت هر کیلوگرم
مراحل حل مسئله به صورت زیر است:
T=W×P
الگوریتم چیست؟
الگوریتم مفهومی است که مسائل را با استفاده از دستورالعملهای پشت سرهم و به کمک تحلیلهای ریاضی و منطقی مورد بررسی قرار داده و راه حل مناسبی برای آن ارائه می کند، الگوریتم به ما کمک میکند مراحل حل مسئله را به زبان رایانه نزدیکتر کرده و در نهایت آن را به کدهای قابل فهم کامپیوتر تبدیل کنیم.
همچنین تعریفی که برای الگوریتم در ویکیپدیا ارائه شده است:
مجموعهای متناهی از دستورالعملها است، که به ترتیب خاصی اجرا میشوند و مسئلهای را حل میکنند. به عبارت دیگر یک الگوریتم، روشی گام به گام برای حل مسئله است. شیوه محاسبه معدل در مدرسه، یکی از نمونههای الگوریتم است.
حال بیایید یک نمونه الگوریتم که مطمئنا بسیاری از ما تا بهحال طبق آن عمل کردهایم را به هم بررسی کنیم.
به عنوان مثال فرض کنید میخواهیم مراحل رفتن به دانشگاه را به صورت مرحله به مرحله بنویسیم!
- شروع
- بیدار شدن از خواب
- شستن دست و صورت
- خوردن صبحانه
- پوشیدن لباس مناسب
- برداشتن وسایل مورد نیاز (کتاب و …)
- خروج از خانه
- رفتن به دانشگاه
- ورود به کلاس
- پایان
چیزی که واضح است این دستورات باید به ترتیب انجام شوند، در غیر اینصورت امکان بروز خطا وجود دارد، الگوریتمهای کامپیوتری نیز به همین صورت هستند، در صورتی که ترتیب اجرای دستورات آنها به درستی در نظر گرفته نشود احتمال تولید خروجی نامعتبر بسیار بالا خواهد رفت.
حال یک مثال سادهی دیگر از الگوریتمها را با هم بررسی میکنیم، فرض کنید قصد داریم الگوریتم پخت کیک را بنویسیم، مراحل نوشتن این الگوریتم به شکل زیر خواهد بود:
- شروع
- تهیهی آرد
- تهیهی شکر
- تهیهی تخممرغ
- تهیهی آب
- مخلوط کردن، آرد، شکر، تخممرغ و آب
- ریختن محتویات در ظرف مخصوص
- قرار دادن ظرف در فر یا مایکروویو
- روشن کردن حرارت
- صبر کردن تا پخت کامل کیک
- خارج کردن کیک از فر
- برش کیک به قطعات دلخواه
- پایان
همانطور که در این مثال نیز به خوبی مشخص است، تمام مراحل کار، با جزئیات کامل، به صورت گام به گام نوشته شده است، مهمترین نکته برای نوشتن یک الگوریتم خوب رعایت همین موضوع ساده است، شما باید تمام فرایند انجام یک کار را به صورت مرحله به مرحله بنویسید.
شما هم اطلاعات مختصر و مفید خود را در بخش دیدگاهها درج کنید تا تمام کاربران بتوانند از تجربیاتتان استفاده کنند.
مثال کاربردی از الگوریتمها در برنامهنویسی
فرض کنید قصد داریم برنامهای ایجاد کنیم که یک عدد را دریافت کرده و در صورت فرد بودن عدد عبارت Fard و در صورت زوج بودن عبارت Zoje را چاپ کند، مراحل این الگوریتم به شرح زیر است:
- عدد را دریافت کن
- عدد را تقسیم بر ۲ کن
- اگر باقی مانده برابر با ۱ بود عبارت Fard را نمایش بده در غیر این صورت عبارت Zoje را نمایش بده.
- پایان
جالب است بدانید، راههای زیادی برای نوشتن یک الگوریتم وجود دارد، آنهم الگوریتمی که دقیقا یک نتیجهی یکسان را در پی داشته باشد، آیا میتوانید چند پاسخ دیگر نیز برای سوال بالا بنویسید؟ الگوریتمهای نوشتهشدهی خود را در بخش دیدگاهها به ما و سایر کاربران نشان دهید!
نکات مهمی که باید در نوشتن الگوریتم به آنها توجه داشته باشید
رعایت این موارد برای نوشتن یک الگوریتم صحیح لازم و ضروری است:
- مراحل را به ترتیب و پشت سر هم بنویسید (اجرا از بالا به پایین)
- قدمهای ضروری را در نظر گرفته و آنها را در طرح خود به کار ببرید.
- از بیان جزئیات بیهوده پرهیز کرده و سعی کنید تا حد امکان مراحل را ساده و در عین حال کامل بنویسید.
- از زبانی ساده برای نوشتن الگوریتم استفاده کنید، طوری که افراد مختلف برداشت متفاوتی از آن نداشته باشند.
- هر الگوریتم تنها یک نقطه شروع دارد که اولین دستورالعمل از آن شروع میشود، ولی میتواند چندین پایان داشته باشد.
- الگوریتم باید جامع باشد، طوری که در حالتهای خاص نیز نتیجهی مناسب را به شما بدهد.
- اولویت عملگرهای ریاضی را هنگام نوشتن طرحتان در نظر داشته باشید (به عنوان مثال محاسبه حاصل ضرب نسبت به محاسبه حاصل جمع در اولویت است)
به یاد داشته باشید، نمادهای ریاضی که از آنها برای حل الگوریتم استفاده میکنید باید در صفحه کلید رایانه شما نیز وجود داشته باشند! خیلی از نمادهای ریاضی (مانند خط کسری، توان و…) را نمیتوانید بر روی کیبورد خود بیابید در نتیجه اجازه ندارید برای نوشتن الگوریتم از آنها استفاده کنید.
فرض کنید میخواهید عبارت زیر را به صورت قابل فهم برای رایانه (به صورت الگوریتم) بنویسید:
شما نمیتوانید این عبارت را با استفاده از کیبورد رایانهی خود بنویسید، در نتیجه باید آن را به صورت زیر ایجاد کنید:
توصیهی همیار آی تی: فرض کنید رایانه مانند کودکی است که چیزی نمیداند و شما میخواهید مراحل حل یک مسئله را برای او توضیح دهید، باید سعی کنید تمام نکات ضروری را به صورت مرحله به مرحله برای او بنویسید تا مطابق دستورالعملهای شما پیش برود و در نهایت به نتیجهی مورد نظر برسد.
اگر جزئیات بیهوده را در مراحل قرار دهید باعث گیج شدن او خواهید شد، همچنین اگر توضیحات کامل نباشد به نتیجهی دلخواه نخواهید رسید، رایانه ما فعلا فقط چهار عمل اصلی را میشناسد و شما باید با استفاده از آنها مراحل حل مسئله را برای او توضیح دهید، برای نشان دادن اولویتها میتوانید از پرانتز کمک بگیرید.
چگونه یک الگوریتم بنویسیم؟
یک الگوریتم شامل تعدادی از دستورات است:
- دستورات ورودی
- دستورات خروجی
- دستورات محاسباتی
- دستورات شرطی
- دستورات تکرار
در ادامه به صورت کامل با تمام این حالات آشنا میشویم:
دستورات ورودی
این دستورات برای دریافت دادههای ورودی استفاده میشوند، شما میتوانید یک نام اختصاری را به متغیرهای ورودی تخصیص دهید. (بخوان، دریافت کن، بگیر و… جزو این نوع دستورات میباشند)
دستورات خروجی
این دستورات برای نمایش نتایج الگوریتم یا نمایش پیامهای مورد نیاز به کار میروند (نمایش بده، چاپ کن و… از جمله دستورات خروجی هستند)
مثال: الگوریتمی بنویسید که اعداد مثبت کوچکتر از ۶ را نمایش بدهد.
- شروع
- اعداد ۱، ۲، ۳، ۴، ۵ را نمایش بده.
- پایان
مثال: الگوریتمی بنویسید که یک عدد را از کاربر دریافت کرده و آنرا در خروجی نمایش دهد.
- شروع
- N را دریافت کن.
- N را نمایش بده.
- پایان
(در این مثال N یک متغیر است که مقدار ورودی در آن ذخیره میشود)
دستورات محاسباتی
این دستورات نحوهی ارائه و محاسبات دستورات را با فرمولهای ریاضی بیان کرده و به زبان ریاضی نیز نوشته میشوند که شامل ۳ جز اصلی میباشد:
- متغیر
- عملگرهای محاسباتی
- عملوندهای محاسباتی
متغیر: عنوانهایی متشکل از حرف و عدد که مقدار آنها قابل تغییر است (a, b, n, s2 …)
عملگرهای محاسباتی: عملگرهای ریاضی از پیش تعریف شده در دستگاه الگوریتم (+ , – , * , / , % , =)
عملوندهای محاسباتی: اعداد و عباراتی که محاسبات بر روی آنها انجام میشود (شامل اعداد و متغیرها)
معرفی عملگرهای مورد استفاده در نوشتن الگوریتم:
( ) پرانتز ⇐ برای نشان دادن اولویت انجام مجاسبات استفاده میشود.
× یا * ضرب ⇐ برای ضرب دو یا چند عبارت استفاده میشود.
/ تقسیم ⇐ برای تقسیم کردن عبارات استفاده میشود.
% باقیمانده ⇐ برای نشان دادن باقیمانده تقسیم دو عدد از علامت درصد استفاده میشود.
+ جمع ⇐ برای جمع کردن دو عبارت استفاده میشود.
– تفریق ⇐ برای تفریق کردن دو عدد استفاده میشود.
توجه: از این به بعد هنگام نوشتن الگوریتم، از علامت تساوی (=) با عنوان انتساب استفاده میکنیم، اگر بخواهیم نتایج حاصل از یک عبارت یا ورودی را در یک متغیر ذخیره کنیم از این علامت استفاده خواهیم کرد.
مثال: حاصل عبارت ۲*۵ را در متغیر P ذخیره کنید.
- شروع
- P=2*5
- پایان
توجه داشته باشید: حق تقدم را در استفاده از عملگرهای ریاضی رعایت کنید!
اولویت عملگرهای ریاضی به ترتیب زیر است:
- پرانتز
- ضرب، تقسیم و باقیمانده
- جمع و تفریق
اگر در یک سطر اولویتها یکسان باشند عملیات به ترتیب از چپ به راست انجام خواهد شد.
مثال: الگوریتمی بنویسید که دو عدد را از کاربر دریافت کرده و حاصل ضرب آن ها را نمایش دهد.
- شروع
- a و b را دریافت کن.
- zarb=a*b
- zarb را نمایش بده.
- پایان
مثال: الگوریتمی بنویسید که میانگین ۳ عدد را محاسبه کرده و نمایش دهد.
- شروع
- اعداد a , b , c را دریافت کن.
- ۳/(a+b+c) نمایش بده.
- پایان
حال که تا حدودی با نحوهی نوشتن و دستورات ورودی، خروجی و محاسباتی در الگوریتمها آشنا شدیم، وقت آن است که وارد مفاهیم حرفهای و شیرینتر الگوریتمها شده و یاد بگیریم چگونه میتوان الگوریتم دستورات شرطی را نوشت.
آموزش نوشتن الگوریتم دستورات شرطی
یکی از پرکاربردترین دستوراتی که در برنامهنویسی استفاده میشوند، دستورات شرطی میباشند، در این دستورات ابتدا شرط (شرطها) بررسی شده و در صورت صحیح بودن آنها دستور (دستورات) خاصی اجرا میشود. قالب کلی دستورات شرطی به شکل زیر است:
اگر شرط برقرار بود آنگاه دستوری خاص را انجام بده، در غیر اینصورت دستور دیگری را انجام بده.
با یک مثال ساده شروع میکنیم: اگر تلفنهمراه شارژ نداشت، شارژر را به آن متصل کن. در این مثال شرط ما داشتن یا نداشتن شارژ است، اگر شرط برقرار باشد دستور اجرا میشود. همانگونه که دیدید میتوانیم بخش “در غیر این صورت” را از دستور حذف کنیم، در این حالت اگر شرط برقرار نباشد دستور خاصی اجرا نمیشود و ادامه الگوریتم از سر گرفته میشود.
از چه دستوراتی میتوانیم در شرط استفاده کنیم؟
شما از دستورات خاصی میتوانید در قسمت شرطی الگوریتم خود استفاده کنید، که شامل موارد زیر میشوند:
- عملگرهای مقایسهای (کوچکتر، بزرگتر، مساوی، نامساوی و…)
- عملگرهای منطقی (and, or, not)
عملگرهای مقایسهای
عملگرهای مقایسهای که میتوانید در نوشتن الگوریتم شرطی خود از آنها استفاده کنید شامل دستورات زیر میشوند:
- == عملگر تساوی مثال ۴ == ۴
- =< عملگر بزرگتر مساوی مثال ۱ =< 5
- => عملگر کوچکتر مساوی مثال 5 => 1
- < عملگر بزرگتر مثال ۲ < 3
- > عملگر کوچکتر مثال ۴ > 2
- =! عملگر نامساوی مثال ۲ =! ۳
مثال: الگوریتمی که مثبت یا منفی بودن عدد را بررسی کند.
- شروع
- N را دریافت کن.
- اگر ۰ =< N آنگاه “Mosbat” را نمایش بده، در غیر اینصورت “Manfi” را نمایش بده.
- پایان
مثال: الگوریتمی که دو عدد را دریافت کند و نشان دهد میانگین آنها بزرگتر یا مساوی ۲۰ است یا خیر.
- شروع
- a و b را دریافت کن
- sum=a+b
- ave=sum/2
- اگر ave >= 20 آنگاه “Yes” را چاپ کن
- اگر ave < 20 آنگاه “No” را نمایش بده
- پایان
مثال: الگوریتمی بنویسد که ۳ عدد را دریافت کرده و بزرگترین را در میان آنها بیابد.
- شروع
- a, b, c را دریافت کن.
- max=a
- اگر b > max آنگاه max=b
- اگر c > max آنگاه max=c
- max را نمایش بده.
- پایان
عملگرهای منطقی
اگر بخواهیم چند شرط و مقایسه را با هم ترکیب کنیم باید از عملگرهای منطقی استفاده کنیم، که شامل دستورات زیر میشوند:
- and: عملگر “و” منطقی (and منطقی) این عملگر شرطها را بررسی میکند و اگر تمام آنها درست باشند دستورات شرط برقرار میشود، اما اگر تنها یکی از شرطها برقرار نباشد، دستورات شرط اجرا نخواهند شد.
- or: عملگر “یا” منطقی (or منطقی) این عملگر شرطها را بررسی میکند و اگر تنها یکی از آنها نیز درست باشد دستورات شرط برقرار میشود، فقط در صورتی که هیچ کدام از شرایط برقرار نباشد دستورات اجرا نمیشود.
- not: عملگر “نقیض” این عملگر تمام دستورات را نقض میکند، یعنی عبارات صحیح غلط و عبارات غلط صحیح میشوند.
مثال: عدد ۱ را به عنوان مقدار صحیح (True) و عدد ۰ را به عنوان مقدار نادرست (False) در نظر بگیرید. در این صورت:
- ۱ و ۱ و ۰ و ۱ ⇐ مقدار غلط ⇐ به دلیل وجود ۰ و and منطقی.
- ۱ یا ۰ یا ۰ یا ۰ ⇐ مقدار صحیح ⇐ به دلیل وجود ۱ و or منطقی.
- not 1 ⇐ مقدار غلط ⇐ ۱ مقدار صحیح را داشت ولی به خاطر وجود عملگر not نقض شده و معکوس میشود.
- ۱ و ۱ و ۱ ⇐ مقدار صحیح ⇐ چون تمام مقادیر صحیح هستند پس مقدار and منطقی صحیح میشود.
- ۰ یا ۰ ⇐ مقدار غلط ⇐ چون تمام مقادیر غلط هستند or منطقی نیز غلط میشود.
مثال: الگوریتمی بنویسید که دو عدد را دریافت کرده و مشخص کند مجموع آن دو عدد بین 0 تا ۲۰ هست یا خیر.
- شروع
- m و n را دریافت کن.
- sum=m+n
- اگر sum>0 و sum<20 آنگاه چاپ کن “Yes” در غیر اینصورت “No” را چاپ کن.
- پایان
(همانگونه که مشاهده میکنید در دستور شرط از and منطقی “و” استفاده کردیم، بدین ترتیب برای اجرای دستور باید هر دو شرط همزمان برقرار باشد، با اینکار توانستیم بازهی اعداد را مشخص کنیم)
آیا تا بهحال به این فکر کردهاید چگونه باید یک دستور را به تعداد زیاد تکرار کنید، بهعنوان مثال فرض کنید قصد داریم الگوریتمی بنویسیم که اعداد ۱ تا ۱۰۰۰۰ را به ترتیب نمایش دهیم، مطمئنا در چنین حالتی نمیتوان بهتعداد ۱۰۰۰۰ بار یک دستور تکراری را نوشت، اینجاست که الگوریتمهای تکرار (حلقهها) به کمک برنامهنویس میآیند.
آموزش الگوریتم دستورات تکرار (حلقهها)
دستور تکرار (حلقه) از ۴ بخش اصلی تشکیل میشود:
- شمارنده: متغیری عددی که تعداد دفعات تکرار را کنترل میکند و مقدار آن در هر بار اجرای حلقه افزایش یا کاهش مییابد.
- مقدار اولیه: مقداری که قبل از شروع حلقه برای شمارنده تعیین میشود.
- شرط حلقه: شمارنده را کنترل کرده و پایان تکرار (خروج از حلقه) را مشخص میکند.
- دستورات حلقه: دستورات مورد نظر ما که در حلقه اجرا (و تکرار) میشوند.
این مطلب، یک آموزش پریمیوم از همیار آیتی است، چیزی که خواندید تنها بخشی از مقاله بود و محتوای حرفهایتر در انتظار شماست، کاربران ویژه میتوانند ادامهی آموزش را هم بخوانند، پس شما نیز همین حالا به جمع اعضای ویژهی همیار پیوسته و به تمام آموزشها و امکانات پریمیوم سایت دسترسی داشته باشید، این یک سرمایهگذاری عالی روی آیندهی کاری و حرفهای شماست... پس شما نیز همین حالا به جمع اعضای ویژهی همیار پیوسته و به تمام آموزشها و امکانات پریمیوم سایت دسترسی داشته باشید، این یک سرمایهگذاری عالی روی آیندهی کاری و حرفهای شماست...
در یک قدمی حرفهای شدن هستید!
این مطلب، یک آموزش پریمیوم از همیار آیتی است، چیزی که خواندید تنها بخشی از مقاله بود و محتوای حرفهایتر در انتظار شماست، کاربران ویژه میتوانند ادامهی آموزش را هم بخوانند، پس شما نیز همین حالا به جمع اعضای ویژهی همیار پیوسته و به تمام آموزشها و امکانات پریمیوم سایت دسترسی داشته باشید، این یک سرمایهگذاری عالی روی آیندهی کاری و حرفهای شماست...
شما یک گام جلوتر از دیگران باشید! اگر به آیتی و تکنولوژی علاقهمندید و دوست دارید سریعتر در این زمینه پیشرفت کنید، همین حالا به جمع ۳۸۹۸ عضو همیار آیتی بپیوندید، دسترسی به تمام آموزشهای پریمیوم، دریافت جدیدترین آموزشهای کاربردی مرتبط با آیتی و استفاده از مشاورهی رایگان، برخی از مزایای عضویت در سایت هستند، شما نیز به کاربران همیار پیوسته و همین حالا وارد دنیای حرفهایها شوید... من هم میخواهم عضو ویژهی همیار شوم
بازنشر مقالات و آموزشهای رایگان سایت با ذکر منبع و درج لینک باعث خرسندی ماست.