مقاله ی دوم-فلوچارت

فلوچارت چیه؟
ساده ترین تعریف اینه :
بیان تصویری الگوریتم را فلوچارت گویند.
ممكنه در برخی از كتابا از اسامی دیگه ی فلوچارت استفاده كنند ، از جمله : كارنما ، روندنما ، شمای عملیاتی و یا نمودار گردشی.
در واقع مزیت فلوچارت نسبت به الگوریتم اینه كه با دیدن فلوچارت یك الگوریتم ، روند اون الگوریتم با سادگی بیشتری جلوی چشماتون قرار می گیره و برای فهمیدن روند الگوریتم مذكور فقط كافیه كه مسیر فلوچارت را دنبال كنید.
البته امروزه روش بسیار ساده تر و جالب تری برای نمایش الگوریتم در حال ترویجه كه توسط دانشگاه MIT (مهد كامپیوتر جهان!) طراحی شده و Scratch نام داره. این روش را در یه مقاله ی جدا بهتون معرفی می كنم .و اما فلوچارت...
برید به ادامه ی مطلب...
تنها چیزی كه برای رسم فلوچارت یك الگوریتم نیاز دارید خود الگوریتمه و دونستن اشكال استاندارد رسم فلوچارت.
تعدادی از این اشكال كه اكثرأ مورد استفاده قرار می گیرند را با هم مرور می كنیم :
اشکال استاندارد فلوچارت :

  • از بیضی برای نشون دادن شروع و خاتمه ی مراحل کار استفاده می کنیم.
  • از مستطیل برای نشون دادن عملیات دستی استفاده می کنیم.
  • برای ورودی و خروجی (در اکثر موارد ) از متوازی الاضلاع استفاده می کنیم.
  • برای شرط گذاری و عملیات شرطی از لوزی و دو راه انتخاب استفاده می کنیم که بسته به جواب شرط در زمان اجرا یکی از راهها انتخاب خواهد شد.
  • پس از رسیدن به هر لوزی اگر شرط برقرار باشد الگوریتم را از مسیر "بله" و در غیر این صورت از مسیر "خیر "ادامه خواهیم داد.
  • برای نشون دادن نحوه ی ارتباط اشکال گفته شده و روند و ترتیب اجرای اونا از خط و فلش استفاده می کنیم تا در زمان انجام عملیات مسیرها کاملأ مشخص باشند.
البته اشکال بیشتری هم در رسم فلوچارت ها استفاده میشند که در مقالات بعدی که سطح مسائل پیشرفته تر میشند اونا رو مطرح می کنم و ازشون استفاده می کنم.
در ادامه به حل چند مسئله می پردازم تا توضیحات بالا رو بهتر درک کنید :
مثال اول : مجموع چند عدد :
الگوریتم :
1.شروع
2.عدد a را در نظر گرفته و مقدار اولیه ی اونو "صفر" در نظر می گیریم.
3.یک عدد را خوانده و به عدد a اضافه می کنیم.
4.اگه عدد دیگه ای وجود داره به مرحله ی 3 بر می گردیم.
5.عدد a مجموع اعداد رو نشون  میده.
6.پایان
خب...
در مورد چگونگی طراحی الگوریتم مسائل در مقالات بعدی توضیح بیشتری میدم ، اما بهتره بپردازیم به طراحی فلوچارت مسئله.
فلوچارت این مسئله رو ببینید ، تا نکاتش رو توضیح بدم :
فلوچارت

و اما چه جوری این فلوچارت رو رسم کنیم :
خب ، الگوریتم ما یک شروع و یک پایان داره که برای نشون دادن اونا در فلوچارت از بیضی استفاده می کنیم.
سپس خط به خط شروع می کنیم به خوندن الگوریتم و سعی می کنیم اون رو به فلوچارت تبدیل کنیم :

2.عدد a را در نظر گرفته و مقدار اولیه ی اونو "صفر" در نظر می گیریم :
نکته ای که برای تبدیل این خط از الگوریتم باید بدونید اینه که تعریف یک متغیر (محلی واسه نگهداری یک عدد ) یک عملیات دستی محسوب میشه. بنابراین برای نشون دادن a=0 از مستطیل استفاده می کنیم.

3.یک عدد را خوانده و به عدد a اضافه می کنیم :
این دستور دو قسمت داره : "خواندن عدد " و "اضافه کردن اون عدد به a".
خواندن یک عدد همون وارد کردن یک عدده .در واقع این عدد ورودی برنامه ی ما محسوب میشه ، پس برای نشون دادن خوندن اون عدد (یعنی استفاده از ورودی) از متوازی الأضلاع استفاده می کنیم.
اضافه کردن عدد هم یک عملیات دستی محسوب میشه ، پس برای نشون دادنش از مستطیل استفاده می کنیم.
اصلأ بذارید خیالتونو راحت کنم ! : در رسم فلوچارت اکثر الگوریتم ها ، هر دستوری غیر از  شروع و پایان و بررسی شرط و ورودی و خروجی ، یک عملیات دستی محسوب شده و برای نشون دادنش در فلوچارت از مستطیل استفاده می کنیم.

4.اگه عدد دیگه ای وجود داره به مرحله ی 3 بر می گردیم :
خوب به این قسمت مهم توجه کنید !! :
در فلوچارت ،ترتیب اجرای دستورات یک الگوریتم یا در واقع همون مسیر الگوریتم را با "فلش" ها مشخص می کنند. یعنی اگه شما بخواهید مسیر یه الگوریتمو از روی فلوچارتش تشخیص بدید فقط کافیه فلش ها رو دنبال کنید!
مثلأ تو همین فلوچارت ، فلشی که از "یک عدد را بخوان" به "آن عدد را به a اضافه کن" وجود داره نشون میده که برنامه اول باید عدد رو بخونه و بعدش باید اونو به a اضافه کنه.
دو مورد را در رابطه با مسیر فلوچارت باد بدونید :
در اکثر موارد نیازی نیست مسیر برنامه تفکیک بشه ، منظور این که برای مثال بعد از انجام شدن مرحله ی الف از یک فلوچارت ، یک مرحله ی مشخص  مثلأ مرحله ی ب باید انجام بشه. به بیان واضح تر برای انجام شدن مرحله ی ب بعد از مرحله ی الف ، نیاز نداریم شرط بگذاریم و در نتیجه از مرحله ی الف ،یه فلش مستقیم به مرحله ی ب زده میشه.
اما ...
در مواقعی ، ما نیاز داریم مسیر برنامه را با توجه به نتیجه ی یک شرط تفکیک کنیم. مثلأ بعد از این که مرحله ی ب از یک فلوچارت اجرا شد ، یک شرط بررسی میشه . اگر شرط برقرار بود مرحله ی پ انجام میشه ، در غیر این صورت مرحله ی ت. :
فلوچارت

تفکیک مسیرها در فلوچارت شامل دسته ی بسیار مهمی به نام "حلقه ها" میشه که در مقالات بعدی مفهوم حلقه ها را مفصل توضیح میدم.
تا اینجای کار با مفهوم "مسیر مستقیم (یا یکتا)" و "مسیر تفکیک شده ( یا چندگانه)" آشنا شدیم.
برگردیم به خط چهارم از الگوریتم خودمون :
ببینید ، این خط با کلمه ی "اگر" شروع شده. به محض اینکه به این کلمه برخورد کردید بدونید که با یک "شرط" و در نتیجه با یک "تفکیک" مسیر طرفید. معمولأ در فلوچارت شرط ها را به شکل سوالات بله و خیر (Y,N Questions )  یا گزاره های منطقی در میاریم .پس شرط مورد نظر ما در این خط به این شکل در میاد:
اگر عدد دیگری وجود دارد ...  ←  آیا عدد دیگری وجود دارد؟
بعد از این که شرطمون را به یکی از این دو شکل (سوالی یا منطقی) تبدیل کردیم ، اون را داخل یک لوزی قرار می دهیم.
 یکی از رأس های این لوزی را برای مسیر "بله " قرار میدیم. اگه شرط  مورد نظر  برقرار  باشه  برنامه  از  این مسیر ادامه پیدا می کنه .
یکی دیگه از رآس هاش را هم برای مسیر "خیر" قرار میدیم. اگه شرط مورد نظر برقرار نباشه برنامه از این مسیر ادامه پیدا می کنه.
معمولآ پیدا کردن مسیر "بله" آسون تر از پیدا کردن مسیر "خیر" ه.
دستور شماره 4 الگوریتم خودمون ،مسیر بله را به صورت کاملأ آماده در اختیارمون قرار داده :
"اگر عدد دیگری وجود داشت به مرحله ی 3 برگرد."
بنابراین مسیر بله ی ما ، فلشی میشه که انتهای اون مرحله ی سومه.
اما ،مسیر "خیر" ... :
دوست دارم یک بار دیگه خودتون الگوریتم رو خط به خط اجرا کنید. وقتی که به مرحله ی چهارم برسید چه کاری انجام میدید؟
خب ، مشخصه ، اگر شرط برقرار باشه به مرحله ی سوم بر می گردید . اما اگر برقرار نباشه...
باز هم مشخصه ، کار خاصی انجام نمیدید و به مرحله ی پنجم میرید !!
پس مسیر "خیر" هم مشخص شد : فلشی مستقیم به مرحله ی پنجم .

5.عدد a مجموع اعداد رو نشون  میده :
هدف ما از این الگوریتم این بوده که مجموع چند عدد رو بدست بیاریم که در این الگوریتم ، از متغیر a برای نگهداری نتیجه ی این مجموع استفاده کردیم.
در واقع هدف از مرحله ی پنجم ، تحویل متغیر a به عنوان خروجی برنامه ست. بنابراین برای نشون دادن تحویل a ،به عنوان خروجی برنامه ، از متوازی الأضلاع استفاده می کنیم.
خب... امیدوارم ، در این مثال تا حدودی با چگونگی رسم فلوچارت از روی الگوریتم آشنا شده باشید.
مطلب قابل توجه اینه که هدف من از این دو مقاله ی اول ،آشنا کردن شما با  مفاهیم اولیه ی  الگوریتم و  فلوچارته ، تا  در مقالات بعدی بتونم از این مفاهیم در حل مسأله استفاده کنم.
به مثال دیگه ای توجه کنید :
مثال دوم : تعیین میانگین تعدادی عدد :
الگوریتم :
1.شروع
2.متغیر a و متغیر b را در نظر گرفته و مقدار اولیه ی هر دو را صفر در نظر بگیر.
3.یک عدد بخوان و آن را به a اضافه کن.
4. به b یک واحد اضافه کن.
5.اگر عدد دیگری وجود دارد به مرحله ی 3 برگرد.
6. a را بر b تقسیم کن و نتیجه را در متغیر c ذخیره کن.
7. c را چاپ کن.
8.پایان.
فلوچارت :
فلوچارت این مسئله را با هم ببینیم :
فلوچارت

توضیح جزء به جزء این فلوچارت مشابه مثال قبله.
اما در یک توضیح کلی باید بگم مسئله ی تعیین میانگین از دو قسمت تشکیل میشه :
  1. محاسبه ی جمع اعداد
  2. محاسبه ی تعداد اعداد
محاسبه ی جمع اعداد را به طور کامل در مثال قبل بررسی کردیم.
برای محاسبه ی تعداد اعداد ،متغیری به نام b را در نظر میگیریم. این متغیر در ابتدای مسئله مقدار صفر داره و هر دفعه که عددی خونده میشه ، یک واحد به اون اضافه میشه ، بنابراین وقتی که خوندن اعداد به پایان برسه ، این متغیر تعداد اعداد خونده شده را در خودش نگه می داره.
به متغیرهایی (مثل b در این مثال) که برای شمارش تعداد عناصری استفاده میشند "Counter" یا "شمارنده" میگن. با نقش این متغیرها در حل مسئله ، در مقالات بعدی آشنا میشیم.
واما ...
چند تمرین :
پنج تمرین براتون در نظر گرفتم. الگوریتم و فلوچارت اونها را رسم کنید.
اگر در طراحی الگوریتم یا تبدیل اون به فلوچارت مشکل داشتید ، اصلأ نگران نباشید. در مقاله های "تاکتیک های حل مسائل" (در حال حاضر در حال نوشتنشم و به موقعش در اختیارتون میگذارم.) قسمت زیادی از مشکلاتتون بر طرف میشه.
تمرین اول : الگوریتمی بنویسید که مجموع 20 عدد را محاسبه کند.(راهنمایی : از "شمارنده" استفاده کنید.)
تمرین دوم : الگوریتمی بنویسید که کوچکترین عدد را در بین 20 عدد مشخص کند.
تمرین سوم : الگوریتمی بنویسید که سه عدد را خوانده و آنها را از بزرگ به کوچک نمایش دهد.
تمرین چهارم : الگوریتمی بنویسید که دو عدد را خوانده و حاصل چهار عمل اصلی را بر روی آنها نشان دهد.
تمرین پنجم : الگوریتمی بنویسید که یک عدد صحیح از صفر تا شش را خوانده و روز متناظر عدد را در هفته نشان دهد :
مثلأ : 1 ← یکشنبه ، 0 ← شنبه.

دوستان ،اگر در حل این مسائل مشکلی داشتید ، کامنت بگذارید .
همچنین اگر مایل بودید از درستی حل خودتون مطمئن بشید ، کامنت بگذارید و جوابهای خودتونو واسم ایمیل کنید.

تا مقاله ی بعدی... بدرود.

































برچسب : الگوریتم عدد کامل