الگوریتم چیست؟
قبل از اینکه تعریف الگوریتم رو برای شما مطرح کنم یک سوال از شما میپرسم:
به نظر شما انسان باهوشتره یا کامپیوتر؟
ممکنه بعضیهاتون بگید کامپیوتر و استدلالتون این باشه که رباتهایی باشن که کارهای فوق العاده ای انجام میدن یا حتی بگید یک ماشین حساب ساده خیلی دقیق تر و سریعتر از مغز انسان کار میکنه.
اما ممکنه بعضی های دیگه به درستی بگید مگه این رباتها و نرم افزارها رو کی نوشته؟ قطعا انسانها باهوش ترن و ما از قدرت سرعت و دقتِ کامپیوترها استفاده میکنیم که بتونیم نرم افزارهای هوشمندی رو طراحی کنیم.
جالبه بدونید که کامپیوترها به تنهایی از محاسبه 2+2 هم عاجزن و حتما باید یه برنامه نویسی باشه که قدم به قدم بهشون بگه که الان باید چیکار کنند! و این اولین نکته ای هست که شما باید به ذهن داشته باشید که هر برنامه ای رو میخواهید کدنویسی کتید باید برای همه چیز فکر کنید و کدنویسی کنید!
با این توضیحات دیگه میتونیم تعریف الگوریتم رو ارائه کنیم! الگوریتم میشه “روش گام به گام حل یک مساله” پس وقتی یک مساله به ما میدن باید به همه جوانب دقت کنیم و براش راه حل داشته باشیم.
کامپیوترها به تنهایی از محاسبه 2+2 هم عاجزن! وظیفه یک برنامه نویس آن است کهقدم به قدم الگوریتمی طراحی کند که کامپیوتر از از روی آن بتواند محاسبات و دستورات را انجام دهد
حالا که فهمیدیم الگوریتم چیه بریم و ببینیم برای نوشتن الگوریتم چه معیارهایی باید در نظر بگیریم و در ادامه چند تا مثال با هم حل کنیم
در نوشتن الگوریتم باید معیارهای زیر را در نظر گرفت:
الگوریتم باید بدون ابهام نوشته شود تا توسط هر فرد یا کامپیوتری درک یکسانی صورت گیرد. به این منظور در نوشتن الگوریتم باید معیارهای زیر را در نظر بگیریم:
- ورودی: یک الگوریتم باید صفر یا چند ورودی داشته باشد. به طور مثال در زمان کار با ماشین حساب، برای محاسبه حاصل 2+3 اعداد 2 و 3 و عمل جمع ورودی الگوریتم به شمار می روند.
- خروجی: الگوریتم باید صفر یا چند خروجی داشته باشد. به عنوان مثال خروجی مثال قبل 5 است.
- قطعیت: دستورات باید با زبانی دقیق و بی ابهام نوشته شوند.
- محدودیت: الگوریتم باید دارای شروع و پایان مشخص باشد.
شاید معیارهایی که بهتون گفتم کمی مبهم باشه براتون. ولی نگران نباشید. در قالب چند مثال مفاهیم رو خوب یاد میگیرید. بریم و مثال اول رو ببینیم!
مثال 1- الگوریتم برنامه ای بنویسید که از ورودی دو عدد دریافت کند و مجموع دو عدد را چاپ کند.
نوشتن این الگوریتم اصلا سخت نیست. اگر به الگوریتم زیر نگاه کنید متوجه میشید که چه جوری نوشته شده! فقط به دو تا نکته توجه کنید. یکی اینکه الگوریتم قدم به قدم نوشته شده و همه جزییات الگوریتم رو نوشتیم و مورد بعد اینکه 4 تا معیار بالایی رو در الگوریتم بررسی کنید:
1- شروع.
2- عدد اول را بگیر و در x قرار بده.
3- عدد دوم را بگیر و در y قرار بده.
4- حاصل x+y را در z قرار بده
5- z را چاپ کن
6- پایان.
مثال اول ساده بود، درسته؟ چند تا مثال اول ساده است، اما اگر با من همراه باشید به سوالات سخت تر و کاربردی تر میرسید. پس مثالها رو با دقت دنبال کنید
مثال 2- الگوریتم برنامه ای بنویسید که دو عدد را دریافت نماید و بزرگترین آنها را نمایش دهد.
برای این سوال به دو روش الگوریتم مینویسیم. با دقت هر دو روش رو دنبال کنید و بگید کدوم روش بهتره؟
روش اول:
1- شروع.
2- عدد اول را بگیر و در x قرار بده.
3- عدد دوم را بگیر و در y قرار بده.
4- اگر x≥y آنگاه x را چاپ کن.
5- اگر y>x، آنگاه y را چاپ کن.
6- پایان.
روش دوم:
1- شروع.
2- عدد اول را بگیر و در x قرار بده.
3- عدد دوم را بگیر و در y قرار بده.
4- اگر x≥y آنگاه x را چاپ کن و به 6 برو
5- y را چاپ کن.
6- پایان.
در روش دوم در دستور 4 از شرط استفاده کردیم و نوشتیم اگر شرط درست بود x رو چاپ کن و به 6 برو.
ما در برنامه نویسی از این ایده زیاد استفاده میکنیم، چه برای درست کردن ساختار تکرار چه برای درست کردن ساختار شرط که در قسمتهای بعدی آموزش در موردش صحبت میکنیم. اما الان بهتره بریم سراغ مفهوم بعدی یعنی فلوچارت!
وقتی مثالها و تمرینها رو جلوتر بریم و پیچیدگی سوالات بیشتر بشه خوانایی نوشتن الگوریتم به این صورتی که تا الان داشتیم پایین میاد. پس برای اینکه خوانایی الگوریتممون رو بیشتر کنیم از فلوچارتها استفاده میکنیم. فلوچارتها در واقع همون الگوریتمها هستند با این تفاوت که با استفاده از یه سری نماد خوانایی الگوریتم رو بالاتر میبرن. بریم و با این نمادها آشنا بشیم:
فلوچارت چیست؟
نمادهایی که در فلوچارت استفاده میشه رو در اسلاید زیر میتونید ببینید. بد نیست بهتون بگم که این آموزشی که داریداینجا میخونید رو من به صورت ویدیویی آماده کردم و در یوتیوب منتشر کردم. اگه دوست دارید میتونید فیلترشکنتون رو روشن کنید و روی دکمه زیر کلیک کنید
اسلاید بالا مربوط به پاورپویینت آموزش الگوریتم و فلوچارت در یوتیوب است. شما میتوانید اسلایدهای دیگر این پاورپوینت را در انتهای این آموزش ببینید.
فلوچارتها چیز عجیب و غریبی نیستند! کافیه الگوریتمهایی که نوشتیم رو با نمادهایی که الان یاد گرفتیم باز نویسی کنیم. یعنی اونجایی که تو الگوریتم نوشتیم شروع باید از نماد شروع استفاده کنیم. اونجایی که داریم یه سری محاسبات و دستورات انجام میدیدم (مثلا اونجا که تو الگوریتم گفتیم: حاصل x+y را در z قرار بده) باید از نماد پردازش در فلوچارت استفاده میکنیم. فقط حواستون باشه نماد شروع در فلوچارت یه فلش ازش خارج شده و نماد پایان یه فلش بهش وارد شده، چرا؟
چون نماد شروع، اولین نماد نوشته شده در فلوچارته و نماد پایان آخرین نماد نوشته شده در فلوچارت. نماد شرط هم یه فلش وارد میشه و دو تا خارج میشه، به این دلیل که شرط ما یا درسته یا غلط. پس به ازای هر شرط دو حالت داریم و باید دو تا فلش خارج بشه. البته در مورد شرطها جلسه بعدی بیشتر صحبت میکنیم. فعلا بریم سراغ مثالها!
مثال 3 - فلوچارت برنامهای رسم کنید که سه عدد دریافت کند و میانگین سه عدد را چاپ کند
برای حل این مساله الگوریتمش رو از ذهنمون بگذرونیم! باید سه تا عدد در قالب متغیرهای x و y و z دریافت کنیم. میانگین رو حساب کنیم و در خروجی چاپش کنیم. قبل از اینکه فلوچارت من رو ببینید بهتره اول خودتون فلوچارتش رو رسم کنید و بعدش بیاید سراغ فلوچارت من!
دو تا نکته اینجا وجود داره. اول اینکه در محاسبه sum من از فِلِش استفاده کردم و اینجوری میخونیمش:
مجموع x و y و z رو بریز تو sum. بهتره شما هم اینجوری فلوچارت بنویسید و حواستون باشه متن سبز رنگ در برنامه نویسی درسته و متن قرمز رنگ زیرش اشتباهه. یعنی تو برنامه نویسی متن قرمز رنگ بی معنیه
نکته بعدی اینکه در بعضی از زبانهای برنامه نویسی 10 تقسیم بر 3 برابر 3 میشه نه 3.33. چرا؟ به دلیل مفهوم تقسیم صحیح و اعشاری. یعنی اگر صورت و مخرج هر دو عدد صحیح باشه حاصل هم عدد صحیحه (پس اگه قسمت اعشاری درست شه، اون قسمت حذف میشه) با این توضیحات فکر کنم متوجه شدید که چرا باید sum رو ّبر 3.0 تقسیم کردم و AVG رو محاسبه کردم
مثال4- فلوچارت برنامهای را رسم کنید که طول ضلع مربعی را دریافت کند. و محیط و مساحتش را چاپ کند
این سوال نکته خاصی نداره. سعی کنید اول خودتون فلوچارتش رو رسم کنید و بعدش فلوچارت من رو ببینید
تمرین 1: فلوچارت برنامهای را رسم کنید که شعاع دایره ای را دریافت و محیط و مساحتش را چاپ کند.
تمرین 2: فلوچارت برنامهای را رسم کنید که قاعده و ارتفاع یک مثلث قائم الزاویه را دریافت کند و محیط و مساحت مثلث را چاپ کند.
دو تا تمرین بالایی رو هم انجام بدید. سخت نیست، درسته؟!
مثال5- فلوچارت برنامهای را رسم کنید که شعاع دایرهای را دریافت و اختلاف مساحت دایره و مربع محاط شده را در آن چاپ کند.
پیشنهاد میکنم اگر سوال براتون مبهمه یا روش حل فلوچارت رو رو درست متوجه نمیشید حتما ویدیوی من در یوتیوب رو ببینید.
حل مثال 5 در قالب دو اسلایده. از پایین اسلاید فلوچارت رو در صفحه 18 ببینید :
مثال6 - فلوچارت برنامهای را رسم کنید که دو مقدار را از ورودی خوانده و در x و y قرار دهد. سپس مقادیر x و y را با هم جا به جا کند.
این سوال از اون سوالاتیه که ممکنه شما با دیدنش بپرسید که خب چی؟! چرا باید دو تا عدد دریافت کنم و در دو تا متغیر ذخیره کنم و بعدش بیام جاشون رو عوض کنم؟!
در جواب باید بگم که اولا شما در مرحله یادگیری هستید، قاعدتا نمیشه انتظار داشت که در جلسه اول آموزش بیایم و با هم الگوریتم های مسیریابی گوگل رو طراحی کنیم! مورد بعد اینکه مثالهایی که من براتون آماده کردم تا حد زیادی هوشمندانه طراحی شده. یعنی جلوتر که میریم به یک مساله ای تحت عنوان مرتب سازی اعداد بر میخوریم که در قسمتی از حل مساله به ایده این مثال نیاز پیدا میکنیم. پس بهتره فعلا کاری به این نداشته باشیم که این مساله به چه دردی میخوره. تمرکز کنید و مساله رو حل کنید. بازم پیشنهاد میکنم که اول خودتون مساله رو حل کنید و بعد بیایید ادامه توضیحات رو بخونید.
برای حل این سوال ، اول فلوچارت سمت چپ رو ببینید. آیا این فلوچارت درسته؟ خیر! چرا؟ کافیه بیایید و با یک مثال فلوچارت رو دنبال کنید. فرض کنید کاربر x و y رو به ترتیب 20 و 10 وارد کنه. بقیه دستورات رو دنبال کنید متوجه میشید که خروجی نهایی اشتباهه و جفت متغیرها مقدار 10 رو چاپ میکنند.
مشکل چیه؟ مشکل اینه در مستطیل دوم که داریم X رو در Y ذخیره میکنیم ما انتظار داریم مقدار قبلی X که 20 است در Y ذخیره بشه اما تو مستطیل قبلی مقدار X تغییر میکنه. برای همین باید از یک متغیر کمکی به اسم TEMP استفاده کنیم و همون اول X رو بریزیم داخلش. فلوچارت سمت راستی رو نگاه کنید متوجه میشید.
اگه هنوز فکر میکنید که این فلوچارت رو درست متوجه نشدید حل این سوال رو در یوتیوب ببینید
روش دوم این مثال رو هم در صفحه 20 میتونید ببینید!
تمرین 3 - فلوچارت برنامه ای را رسم کنید که یک زمان مشخص بر حسب ساعت، دقیقه و ثانیه بگیرد و مشخص کند چند ثانیه از شروع روز گذشته است.
این مطلب برات مفید بود؟
من یک دوره کامل و در عین حال ارزان برای شمایی که در ابتدای راه برنامه نویسی هستید آماده کردم. تو این دوره شما الگوریتم و فلوچارتها رو به صورت کامل یاد میگیرید و در انتهای دوره به شما کمک میکنم که اولین زبان برنامه نویسی خودتون رو با یک دید خوب انتخاب کنید. پیشنهاد میکنم سرفصلهای این دوره رو ببینید
خواندن این مطالب را از دست ندهید:
- جلسه 2 – ساختار شرط در الگوریتم و فلوچارت
- آموزش الگوریتم و فلوچارت؛ مفاهیم و اصول اولیه
- جلسه 3 – ساختار تکرار در فلوچارت
- آموزش الگوریتم و فلوچارت؛ ساختار تصمیم
- آموزش الگوریتم و فلوچارت؛ ساختار تکرار
- نمونه سوالات الگوریتم و فلوچارت به همراه حل سوالات منتخب
- جلسه دوم ساختمان داده؛تحلیل الگوریتم ترتیبی
- جلسه 10 – استراکچر در c++ – مثالها
- جلسه 8 – بررسی یک مثال کاربردی و بازی در c++
- جلسه 11 – اشاره گر در c++
- جلسه 3 – ساختار تکرار در سی پلاس پلاس
- جلسه 12 – تخصیص حافظه پویا در c++
- جلسه 2 – ساختار شرط در سی پلاس پلاس
- جلسه 4 – تابع در سی پلاس پلاس
- جلسه 6 – آرایه دو بعدی در سی پلاس پلاس
عالی ومختصر ومفید
با یادگیری الگوریتم و فلوچارت میتوان دید واضعی برای نوشتن کد بکار برد و برای من کاملا مفید قرا گرفت چون یکی از مشگلات بزرگ من بود و طبیعی است که هنوز به ان حد برایم حل و فصل نشد ولی با اشنای این مبحث گامی بزرگتر از گذشته میتوانم بردارم.
یکی از مشگلات بزرگ برنامه نویسی یا بهتر بگم برای یاد گیری برنامه نویسی در انلاین این است که اکثرا با یکی از زبانهای برنامه نویسی شروع میکنن بدون اینکه به کاربر بگن که چطور میبایست کد را فهمید.
بله، کاملا درست میگید، الگوریتم و فلوچارت ها خیلی در شروع یادگیری برنامه نویسی مهمه که متاسفانه خیلی ها بهش توجه نمیکنند