الگوریتم چیست و چه کاربردی دارد
نویسنده : نازنین رحمانی | زمان انتشار : 06 آذر 1400 ساعت 17:31
جهت انجام پروژه های دانشجویی و یا تمرینهای برنامه نویسی رشته کامپیوتر میتوانید به آی دی تلگرام زیر پیام دهید
@AlirezaSepand
ای همه هستی ز تو پیدا شده / خاک ضعیف از تو توانا شده
زیر نشین علمت کائنات / ما به تو قائم چو تو قائم به ذات
سرآغاز
نبوغ و استعداد اعطا شده از سوی خداوند بزرگ به انسان، سبب اکتشافات، اختراعات و ابداعات گوناگونی گردیده است که از آن جمله می توان ابداع کامپیوتر را نام برد. این ماشین که در اغاز به صورت مکانیکی و سپس به صورت الکترومکانیکی ابداع گردید با پیدایش لامپ خلاء به صورت الکترونیکی ابداع و عرضه گردید، و ابداع ترانزیستور و به دنبال آن مدارهای مجتمع سبب تکامل آن گردید.
ریز گرائی مدارهای الکترونیکی سبب پیدایش کامپیوتر برروی تراشه گردیده است که هزاران کاربرد دارد و اکثر آنها را امروزه لمس میکنیم. این کامپیوترهای روی تراشه تقریبا در هریک از انواع ماشینهای مدرن از کامپیوترها تا آدمکهای ماشینی، از دستگاههای الکتریکی هوشمند خانگی تا صندوقهای حساب سخنگو و از داشبرد اتومبیلها تا سفینههای فضائی یافت میشوند.
کامپیوتر نیروی محرکه انتقال انسان به یک جامعه طلاعاتی می باشد. کامپیوتر و جامعه اطلاعاتی پدید آمده از آن اثری شگرف بر جامعه ادراری و تجاری دارند و پدید آورنده اثری برجسته و بهساز در روش زندگی و کار انسان ها می باشند.
کامپیوتر با وجود کاربردهای گوناگون بدون درستورالعمل های دقیق و قدم به قدم قادر به انجام محاسبات یا پردازش داده ها نمی باشد. مجموعهء این دستور العملها که بیانگر راه حل قدم به قدم مسئله ای یا نشانگر ترتیب توالی انجام مراحل یک عمل یا رویداد می باشند برنامه کامپیوتری نامیده می شود.
نوشتن برنامه در مرحله پنجم از فرایند برنامه سازی انجام می گیرد و قبل از آن در مراحل سوم و چهارم باید منطق برنامه طراحی گردد، سپس بر اساس منطق ريال برنامه نوشته شود. بیان منطق برنامه به صورت کلامی است و یا به صورت نمایش تصویر می باشد.
یکی از روش های بیان منطق به صورت کلامی ارائه آن به صورت الگوریتم است و یکی از روش های نمایش تصویری منطق برنامه فلوچارت یا روندنما می باشد که دقت و پیوستگی یک الگوریتم را به عنوان منطق کلامی یا کمک یک طرح یا دیاگرام توام می سازد.
هرچند نه الگوریتم وارد کامپیوتر می شود و نه فلوچارت، با این وجود به علت این که نرم افزار مترجم برنامه قادر به تشخیص خطای منطقی نیست ایجاب می نماید قبل از نوشتن برنامه از منطق صحیح اجرائی آن اطمینان حاصل شود. حصول اطمینان از منطق درست برنامه پس از تهیه منطق به صورت کلامی یا نمایش تصویری میسر می گردد.
الگوریتم چیست؟
الگوریتم یا خوارزمی، مجموعهای متناهی از دستورالعملها است که به ترتیب خاصی اجرا میشوند و مسئلهای را حل میکنند. به عبارت دیگر، یک الگوریتم، روشی گامبهگام برای حل مسئله است. شیوهی محاسبه معدل در مدرسه، یکی از نمونههای الگوریتم است.
در کل به مجموعهای از دستورالعملها و فرمولهایی که با زبان رسا و دقیق، به همراه جزئیات لازم و به صورت مرحله به مرحله به گونه اجرا شده باشند که هدف خاصی را دنبال کنند و شروع و پایان آنها نیز مشخص باشد، الگوریتم گفته میشود.کلمه الگوریتم از نام ریاضیدان برجستهی ایرانی، ابو جعفر محمد بن موسی الخوارزمی و به پاس خدمات ارزنده او به توسعه دانش بشری گرفته شدهاست. همچنین او اولین کسی است که علم جبر را کشف کرد.
در اينجا دو تعريف را براي الگوريتم بيان ميكنيم:
- مجموعهای خاص از روال منطقی و یا ریاضی ساده و خوب تبیین شده میباشد که میتواند در حل یک مسئله مشخص کمک کند.
الگوریتم دستورالعملی برای یافتن پاسخ درست یک مساله سخت به وسیله شکستن آن مساله به مراحل ساده و آسان میباشد. - هر روال محاسباتی خوش تعریفی است که مقداری، یا مجموعهای از مقادیر را بعنوان ورودی میگیرد و مقداری، یا مجموعهای از مقادیر را بعنوان خروجی تولید میکند.
بنابراین یک الگوریتم یک توالی از گامهای محاسباتی است که ورودی را به خروجی تبدیل میکند.
یک الگوریتم یابد سه شرط اساسی زیر را تأمین کند
- لیست دستورالعملها باید محدود بوده و به اندازهای کوتاه باشد تا قابل اجرا گردد.
- هر دستورالعمل باید دارای قابلیت اجرا باشد، شما هم باید بتوانید اجرا کارهای یاد شده را به اجرا برسانید.
- الگوریتم باید روند اجرا را قادر سازد تا در یک نقطه به پایان برسد.
مثلا اين جوک معروف را در نظر بگيريد:
ميدوني يک فيل را چطوري با سه حرکت مي گذارند توي يخچال؟ اول در يخچال را باز مي کنند، بعد فيل را مي گذارند توش، بعد هم در يخچال را مي بندند.
شايد جواب اين جك ظاهرا يك الگوريتم باشد، اما اينطور نيست چون ويژگي دوم يعني قابل اجرا بودن را ندارد.
خصوصیات یک الگوریتم
تمام الگوریتمها باید شرایط و معیارهای زیر را دارا باشند:
ورودی:
یک الگوریتم باید هیچ یا چندین پارامتر را به عنوان ورودی بپذیرد؛
خروجی:
الگوریتم بایستی حداقل یک کمیت به عنوان خروجی (نتیجه عملیات) تولید کند؛
قطعیت:
دستورهای الگوریتم باید با زبانی دقیق، و بیابهام بیان شوند. هر دستورالعمل نیز باید انجامپذیر باشد. دستورهایی نظیر «مقدار ۶ یا ۷ را به x اضافه کنید» یا «حاصل تقسیم پنج بر صفر را محاسبه کنید» مجاز نیستند؛ چرا که در مورد مثال اول، معلوم نیست که بالاخره چه عددی باید انتخاب شود، و در خصوص مثال دوم هم تقسیم بر صفر در ریاضیات تعریف نشدهاست.
محدودیت:
الگوریتم باید دارای شروع و پایان مشخصی باشد، به نحوی که اگر دستورهای آن را دنبال کنیم، برای تمامی حالات، الگوریتم پس از طی مراحل شمارا و متناهی خاتمه یابد. به علاوه، زمان لازم برای خاتمه الگوریتم هم باید به گونهای معقول، کوتاه باشد.
ریشه واژهٔ الگوریتم
واژه الگوریتم از نام ریاضیدان و ستارهشناس و جغرافیدان نامی ایرانی، ابوجعفر محمد بن موسی خوارزمی (الخوارزمی)، گرفته شده است، که در خوارزم زاده شد و در دانشگاه «بیت الحکمه» بغداد به اوج شهرت رسید.
خوارزم یکی از شهرهای «ایران بزرگ» بود، که امروزه در ازبکستان واقع شده است و خیوه نام دارد. رسالهای که خوارزمی در قرن ۹ میلادی به عربی نگاشته بود، در قرن ۱۲ به لاتین با نام “Algoritmi de numero Indorum” ترجمه شد؛ یعنی “[کتابی بدست] «الگوریتمی» در مورد اعداد هندی”، که «الگوریتمی» نام الخوارزمی بود که مترجم در تبدیل به لاتین نام وی را جلوی نام اصلی کتاب (در مورد اعداد هندی) آورده بود. در قرن ۱۳ میلادی واژه الگوریسموس(algorismus) به معنای «سیستم شمارش عربی (دهدهی)» (یعنی اعداد ۱ تا ۹ به علاوه صفر، و نیز مفهوم اعشار) بود؛
که هنوز هم یکی از معانی واژه الگوریسم(algorism) است. معنای دیگر الگوریسم «حساب کردن با کمک اعداد عربی» است؛ یعنی فن انجام أعمال حسابی پایه، مانند جمع و ضرب، با قرار دادن اعداد در زیر هم و إعمال قواعدی خاص، که جایگزین به کارگیری اعداد رومی و استفاده از چرتکه شد.
حتی روش انجام دستی تقسیم و جذر گرفتن (رادیکال) هم الگوریسم نامیده میشود. در قرن ۱۹ این کلمه در فرانسوی به algorithme تغییر شکل پیدا کرد، البته معنایش ثابت ماند.
طولی نکشید که این کلمه به شکل algorithm وارد زبان انگلیسی شد؛ ولی فقط در اواخر قرن ۱۹ میلادی بود که معنای عامتر امروزیاش را یافت، و به «هر مجموعه قواعدی برای انجام یک رویه محاسباتی یا روال رایانهای به کار رود» الگوریتم گفته شد.
تبدیل نام الخوارزمی به الگوریسم و سپس الگوریتم احتمالاً تحت تأثیر واژه یونانی arithmos (به معنای عدد) و arithmetic (به معنای محاسباتی) بوده است. برخی منابع هم کلمه لگاریتم را هم در تبدیل الگوریسم و الگوریتم بی تأثیر ندانستهاند.
نقش الگوریتمها در علوم رایانه
در علوم رایانه، یک الگوریتم را یک روال محاسباتی خوشتعریف میدانند، که مقدار یا مجموعهای از مقادیر را به عنوان ورودی (Input) دریافت کرده و پس از طی چند گام محاسباتی، ورودی را به خروجی (Output) تبدیل میکند. بجز این، الگوریتم را ابزاری برای حل مسائل محاسباتی نیز تعریف کردهاند. ساخت و طراحی الگوریتم مناسب در مرکز فعالیتهای برنامهسازی رایانه قرار دارد. یک برنامه رایانهای، بیان یک یا چند الگوریتم با یک زبان برنامهنویسی است.
مفهوم الگوریتم
مفهوم الگوریتم را معمولاً با تشبیه به دستور آشپزی توضیح میدهند. مثلاً اگر بخواهیم آبگوشت درست کنیم (عمل مورد نظر) با فرض اینکه مواد خام را داریم (حالت اولیه) مراحل مشخصی را باید طبق دستور آشپزی طی کنیم (دستورالعملها) تا به آبگوشت آماده (حالت پایانی) برسیم. البته الگوریتمها معمولاً پیچیدهتر از این هستند.
الگوریتم گاه دارای مراحلی است که تکرار میشود (در مثال آبگوشت مثلاً چند بار باید نمک زد یا آب اضافه کرد) و یا در مرحلهای نیازمند تصمیمگیری است (اگر نمک کافی است دیگر نمک نمیزنیم، اگر کافی نیست نمک میزنیم).
اگر الگوریتم برای عمل مورد نظر مناسب نباشد و یا غلط باشد به نتیجه مورد نظر نمیرسیم. مثلاً اگر الگوریتم آبگوشت را با مواد اولیه کباب انجام دهیم واضح است که به آبگوشت نمیرسیم.
باید بدانیم برای هر الگوریتم تعریف متغیرها و طراحی مرحله به مرحله بسیار مهم است. زیرا الگوریتم باید بداند بر روی چه متغیرهایی، چه اعمالی را انجام دهد و نتیجه را در غالب چه متغیرها یا پارامترهایی نشان دهد.
تحلیل بر روی الگوریتم و خواص آن
معمولاً برای حل یک مسئله، روشها و الگوریتمهای گوناگونی وجود دارند؛ یک الگوریتم ممکن است عمل مورد نظر را با دستورهای مختلف در مدت زمان و یا کار کمتر یا بیشتری نسبت به الگوریتم دیگر انجام دهد. به همین دلیل، انتخاب الگوریتم مناسب و کارا اهمیت زیادی در موفق بودن و کارایی برنامه رایانهای دارد. الگوریتمها به عنوان یک فناوری مطرح هستند و دانشمندان آنها را طراحی، تحلیل، و مطالعه میکنند. مطالعه الگوریتمها زمینههای متعددی را در بر میگیرد. در زیر به چند نمونه اشاره میکنیم که میتوان آنها را چرخه حیات یک الگوریتم نامید.
الف) طراحی الگوریتمها: روشهای مختلفی برای طراحی الگوریتمها وجود دارد که عبارتند از:روشهای تقسیم و غلبه، روشهای حریصانه، روشهای برنامه نویسی پویا، روشهای پسگرد و روشهای انشعاب و تحدید.
ب) معتبر سازی یا اثبات درستی الگوریتمها:بعد از طراحی باید اثبات شود که الگوریتم مزبور درست است. الگوریتمی درست است که به ازای هر ورودی مناسب خروجی صحیحی بدهد. اثبات درستی الگوریتمها به اثبات قضایا در ریاضی میماند و مرحله بسیار مهمی در زمینه مطالعه الگوریتمها است
پ) تحلیل الگوریتمها (تحلیل مقدم، ارزیابی کارایی الگوریتمها): یک الگوریتم در زمان اجرا از cpuی رایانه برای اجرای دستورالعملها و از حافظه برای ذخیرهسازی برنامه و دادهها استفاده میکند تحلیل یک الگوریتم مشخص میکند که الگوریتم در زمان اجرا چه مدت زمان از cpuبرای اجرای دستورالعمل (پیچیدگی زمانی) و چه مقدار از حافظه (چه اصلی و چه جانبی) برای ذخیرهسازی برنامه و دادهها (پیچیدگی فضایی) نیاز دارد.
ت) پیادهسازی الگوریتمها: پیادهسازی یک الگوریتم نوشتن آن به زبان برنامه نویسی خاص است که معمولاً بعد از تحلیل مقدم آن صورت میگیرد و نام برنامه به آن اطلاق میشود.
ث) تست برنامه: تست یک برنامه شامل۱:اشکال زدایی و ۲:تحلیل مؤخر (اندازهگیری کارایی) است. اندازهگیری کارایی عبارت است از فرایند اجرای الگوریتم صحیح بر روی دادههای نمونه گیری شده برای به دست آوردن زمان و حافظه مورد نیاز توسط کامپایلر. زمان اجرای یک الگوریتم به پارامترهای مختلفی بستگی دارد که از جمله میتوان به نوع دستورالعملها (دستورالعملهای جمع، ضرب، نوشتن، خواندن، شرطی و…)کامپایلر مورد استفاده، زبان برنامه نویسی، سختافزار به کار رفته و پارامتری مثل nکه میتواند معرف تعداد ورودیها و خروجیها و یا هر دو باشد اشاره کرد
تحلیل الگوریتمها رشتهای است که به بررسی کارایی الگوریتمها میپردازد. تحلیل الگوریتمها یعنی پیشبینی منابع مورد نیاز برای اجرای یک الگوریتم، همچون: حافظه، پهنایباند ارتباطی، سختافزار، و از همه مهمتر، زمان. کارایی یا پیچیدگی هر الگوریتم را با تابعی نشان میدهند که تعداد مراحل لازم برای اجرای الگوریتم را برحسب طول داده ورودی، یا میزان محلهای لازم حافظه را بر حسب طول داده ورودی نشان میدهد.
بررسی الگوریتم و مراحل پنج گانه برنامه نویسی
الگوريتم هر برنامه، می بايست دارای يک طرح و يا الگو بوده تا برنامه نويس بر اساس آن عمليات خود را دنبال نمايد.از ديدگاه برنامه نويسان ، هر برنامه نيازمند يک الگوريتم است . بعبارت ساده ، الگوريتم ، بيانه ای روشمند بمنظور حل يک مسئله بخصوص است . از منظر برنامه نويسان ،الگوريتم بمنزله يک طرح کلی و يا مجموعه دستورالعمل هائی است که با دنبال نمودن آنان ، برنامه ای توليد می گردد.
الگوريتم های ميکرو در مقابل ماکرو
الگوريتم ها دارای ويژگی های متفاوتی میباشند. ما میتوانيم در رابطه با الگوريتم استفاده شده به منظور نوشتن يک برنامه مشخص صحبت نمایيم.
از اين زاويه، ما صرفا در رابطه با الگوريتم در سطح ماکرو (macro level) ، صحبت نموده ايم. در چنين مواردی ، الگوريتم ارائه شده ، سعی در بدست آوردن جنبه های عمومی برنامه از طريق يک مرور کلی به برنامه در مقابل درگير شدن در جزئيات را دارد.ما می توانيم در رابطه با الگوريتم ها ، از سطح “ميکرو” صحبت نمائيم .
از اين زاويه، به سطوح پايين تر رفته و به عوامل اساسی ونگهدارنده ای که يک جنبه خاص از برنامه را با يکديگر مرتبط می نمايد، صحبت کرد.
مثلا در صورتيکه شما دارای داده هائی هستيد که می بايست قبل از استفاده مرتب گردند، الگوريتم های مرتب سازی متعددی در اين زمينه وجود داشته و می توان يکی از آنها را بمنظور تامين اهداف مورد نظر خود انتخاب نمود. انتخاب يک الگوريتم مرتب سازی، صرفا باعث حل شدن يکی از جنبه های متفاوت برنامه میگردد. پس از مرتب سازی داده ها ،می بايست از يک الگوريتم ميکرو ديگر بمنظور نمايش داده ها ی مرتب شده استفاده گردد.
همانگونه که احتمالا حدس زده ايد، ما می توانيم تمام الگوريتم های ميکرو را بمنظور ايجاد يک الگوريتم ماکرو، جمع آوری نمایيم. اگر ما با الگوريتم های ميکرو، آغاز نمایيم و حرکت خود را به سمت نمايش ماکروی يک برنامه، پيش ببريم، کاری را انجام داده ايم که موسوم به طراحی پايين به بالا (buttom-up) است.
اگر ما فعاليت خود را با يک الگوريتم ماکرو آعاز و حرکت خود را به سمت پائين و الگوريتم های ميکرو ، ادامه دهيم ، طراحی از نوع ” بالا به پايين ” (top-down) را انجام داده ايم .
شايد اين سوال مطرح گردد که کدام روش بهتر است؟
اگر شما تمام مقالاتی را که تاکنون در اين زمينه نوشته شده اند را دنبال نمایيد، هرگز به يک نتيجه قابل قبول دست نخواهيد يافت. هر رويکرد، دارای نکات مثبت و منفی مربوط به خود است.
صرفنظر از رويکرد طراحی استفاده شده، می بايست دارای الگویی (طرحی) مناسب برای برنامه باشيم. حداقل، نيازمند يک اعلاميه از مسئله برنامه نويسی و يک طرح ( الگو) برای برخورد با مسئله، خواهيم بود. پس از شناخت مسئله، می توان نحوه حل مسئله را ترسيم کرد
شناخت عميق و مناسب نسبت به مسئله ای که قصد حل آن را داريم ، شرط اساسی و ضروری برای طراحی يک برنامه است.
با توجه به اينکه اين اعتقاد وجود دارد که شناخت جامع و کلی از مسئله ای که حل آن را داريم، بخشی ضروری در اولين مرحله برنامه نويسی است، ما در ادامه از رويکرد بالا – پايين، تبعيـت می نمایيم.
فراموش نکنيم که رويکرد فوق ، امکان مشاهده مجازی از هر مسئله برنامه نويسی را فراهم خواهد نمود.
مراحل پنج گانه
هر برنامه را صرفنظر از ميزان پيچيدگی آن ، می توان به پنج مرحله اساسی تجزيه کرد :
مقدار دهی اوليه
ورودی
پردازش
خروجی
پاکسازی
در ادامه به بررسی هريک از مراحل فوق ، خواهيم پرداخت .
مرحله مقداردهی اوليه
مرحله مقداردهی اوليه ، اولين مرحله ای است که می بايست در زمان طراحی يک برنامه در رابطه با آن فکر کرد . مرحله فوق ، شامل تمامی عمليات مورد نيازی است که برنامه می بايست قبل ازبرقراری ارتباط با کاربر ، انجام دهد . در ابتدا ممکن است اين موضوع که عملياتی را قبل از برقراری ارتباط با کاربر می بايست انجام داد ، تا اندازه ای عجيب بنظر رسد ولی احتمالا” برنامه های زيادی را مشاهده نموده ايد که در اين راستا عمليات مشابهی را انجام می دهند. مثلا” ، در زمان استفاده از برنامه هائی نظير Word ، Excel و يا برنامه های مشابه ديگر ، با چنين مواردی برخورد نموده ايم . مثلا” با انتخاب گزينه منو File ، می توان ليستی از فايل هائی را که با آنها کار کرده ايم در بخش انتهائی منوفوق ، مشاهده کرد. ( مشاهده آخرين فايل های استفاده شده در يک برنامه خاص ، با استفاده از جادو! ميسر نشده است ) . برنامه مورد نظر شايد ، ليست فايل های اخير را از ديسک خوانده و آنها را به ليست مربوطه در منوی File ، اضافه کرده باشد . با توجه به اينکه ليست فايل های فوق ، می بايست قبل از اينکه برنامه هر چيز ديگر را برای کاربر نمايش دهد ، خوانده و نمايش داده شوند ، می توان انجام عمليات فوق را نمونه ای از مرحله مقداردهی اوليه، در نظر گرفت.
يکی ديگر از عمليات متداول که به اين مرحله مرتبط می باشد ، خواندن فايل های Setup است . چنين فايل هائی ممکن است حاوی اطلاعاتی در رابطه با نام مسيرهائی باشند که بانک ها ی اطلاعاتی خاصی و يا فايل های ذخيره شده ديگری را بر روی ديسک را مشخص می نمايند . با توجه به نوع برنامه ای که اجراء می گردد ، فايل های Setup می توانند شامل اطلاعاتی در رابطه با فونت های نمايش ، نام و محل چاپگر ، رنگ های زمينه و رويه ، وضوح تصوير صفحه نمايشگر و اطلاعات مشابهی ديگر باشند . ساير برنامه ها ممکن است مستلزم خواندن اطلاعاتی در رابطه با اتصالات شبکه ، مجوزهای امنيتی و دستيابی به اينترنت ، رمزهای عبور و ساير اطلاعات حساس ديگر باشند . در چنين مواردی فايل های Setup دارای نقشی مهم خواهند بود.
در زمان طراحی يک برنامه ، همواره می بايست در رابطه با اطلاعاتی که يک برنامه قبل آغاز خدمات و عمليات خود به آنها نيازمند است ، انديشيد و برای آنان در مرحله مقداردهی اوليه راهکار مناسب را انتخاب کرد . مرحله مقداردهی اوليه احتمالا” جائی است که می بايست از طريق آن اقدام به ارائه راهکار مناسب در جهت پاسخ به نيازهای فوق ، کرد.
مرحله ورودی
مرحله ورودی ، در حقيقت چيزی است که انتظار داريد باشد! مرحله فوق ، شامل اخذ ( جمع آوری ) هر آنچيزی است که يک برنامه برای انجام فعاليت های خود به آنها نياز خواهد داشت . دراکثر موارد، اگر استنباط مناسبی از عملياتی را که يک برنامه قصد انجام آنان را دارد ، حاصل گردد، مشخص نمودن ليستی از ورودی ها ، کاری ساده خواهد بود. مثلا” اگر شما قصد نوشتن يک برنامه وام را داريد ، می دانيد که می بايست از کاربر ميزان وام درخواستی ، بهره موردنظر و مدت زمان وام ، درخواست گردد.
در حالات ديگر، لازم است در رابطه با نوع ورودی هائی که می بايست از کاربر اخذ گردد، بررسی لازم و مبتنی بر انديشه را دنبال نمود. مثلا” در صورتيکه قصدنوشتن يک برنامه دفترچه آدرس را داريد ، آيا می خواهيد نام فايل حاوی دفترچه تلفن و محل ذخيره فايل مربوطه را در هر مرتبه که برنامه اجراء می گردد ، از کاربر درخواست نمائيد ؟ بعبارت ديگر برخی از مراحل ورودی می توانند و شايد می بايست ، توسط مرحله مقدار دهی انجام شوند. ماهيت واقعی ميزان اطلاعاتی که می توان آنها را در مرحله مقداردهی خواند ، بستگی به رفتار برنامه دارد. بعنوان يک قانون عمومی می توان به اين مورد اشاره داشت که اکثر کاربران تمايل دارند که اطلاعات تکراری در يک فايل Setup و يا مقداردهی اوليه ذخيره گردد (در مقابل اينکه هر مرتبه که برنامه اجراء می گردد ، مجبور به ورود اطلاعات تکرای باشند ) .
فايل های Setup بسيار مناسب بوده و در هرموردی که امکان بخدمت گرفتن آنان منطقی بنظر می آيد ، می بايست از آنان استفاده گردد . برخی ديگر از اطلاعات اوليه دارای ماهيت خاص خود بوده و تا زمانيکه کاربر آنها را تايپ ننمايد ، شناخته نمی گردند . در مثال وام اشاره شده ، می توان از TextBox های متعددی بمنظور احذ اطلاعات از کاربر و استفاده از آنان در برنامه ، کمک گرفت . با توجه به اينکه کاربر می بايست با اين TextBox ها مرتبط تا اطلاعات موردنياز برنامه را وارد نمايد ، روشی را که شما بمنظور ارائه Textbox ,Labels ,Menus و ساير عناصر برنامه ، استفاده می نمائيد ، يکی از بخش های مهم يک برنامه يعنی رابط کاربر ( user interface ) را مشخص خواهد کرد . فراموش نکنيم يکی از عوامل موفقيت هر نرم افزار ، بخش رابط کاربر آن است . طراحی مناسب بخش فوق ، امروزه بعنوان تخصصی خاص در طراحی و پياد ه سازی نرم افزار مطرح و دارای جايگاه خاص خود است .
مرحله پردازش
مرحله پردازش ، شامل انجام عمليات بر روی ورودی (ورودی ها ) ، بمنظور توليد نتايج مورد نظر برای برنامه است . در مثال وام ، برنامه پس از دريافت ورودی های مورد نظر ( ميزان وام ، درصد بهره و زمان وام ) آنها را از طريق يک معادله مالی بيکديگر مرتبط و پس از حل معادله ، نتيجه مورد نظر حاصل خواهد شد( ميزان پرداخت ماهانه ) . بعبارت ديگر ، مرحله پردازش قادر به دريافت ورودی ، برخورد با آنها و توليد پاسخ مناسب به مسئله است . توجه داشته باشيد که مرحله پردازش همواره باعث نمايش چيزی بر روی نمايشگر نخواهد شد. هدف ، عمل ( عمليات ) برروی داده ( داده ها ) بمنظور توليد يک نتيجه ( نتايج ) است . در اين رابطه هيچگونه استثنائی وجود ندارد . در صورتيکه در برنامه ای از قبل می دانيم که مرحله پردازش زمان زيادی طول خواهد کشيد ، منطقی است که فيدبک های لازم بمنظور آگاهی کاربر از ميزان و درصد انجام پردازش ( پردازش ها ) در اختيار وی گذاشته شود ( در زمانيکه برنامه در حال اجراء است ) . در اين رابطه می توان از روش های متعددی استفاده کرد . ( ارائه يک ميله پيشرفت ، برآورد زمان تقريبی بمنظور اتمام عمليات ) .
مرحله خروجی
مرحله فوق ، پاسخ ( پاسخ ها ی) مناسب و مورد انتظار را به کاربران مبنی بر حل مسئله مورد نظر ، ارائه می نمايد. تعداد زيادی ازبرنامه ها ، پاسخ نهائی ( نتيجه ) خود را از طريق يک Textbox ، نمايش و در اختيار کاربر قرار می دهند . ، مثلا” اگر برنامه ای نوشته شده است که قصد محاسبه و نمايش ميزان پرداخت ماهيانه يک وام دريافتی را داشته باشد ، می توان نتيجه بدست آمده (پرداخت ماهانه) را از طريق يک textbox ، ارائه تا پاسخی مناسب در ارتباط با مرحله خروجی يک برنامه، داده شده باشد . ساير برنامه ها ممکن است دارای وضعيتی بمراتب پيچيده تر باشند .مثلا” می توان برنامه ای را در نظر گرفت که نام ، آدرس ، شماره تلفن و ساير اقلام اطلاعاتی را از بانک اطلاعاتی خوانده و در ادامه آنها را بر روی صفحه نمايشگر ، نشان دهد. برنامه هائی اينچنين ، نيازمند شکل مناسبتری از نمايش خروجی بوده و نمی توان با استفاده از چند textbox به خواسته خود دست يافت ( ارائه يک خروجی مطلوب و انعطاف پذير) در اينگونه موارد می بايست از راهکارهای مناسبتری استفاده گردد . مثلا” می توان از جداول خاصی بمنظور نمايش اطلاعات مورد نظر استفاده کرد .( استفاده از grid و يا List box که برنامه در صورت ضرورت آنان را تکميل نمايد ) . نکته مهمی که می بايست در رابطه با مرحله خروجی رعايت گردد ، آگاهی از اين موضوع است که با توجه به نمايش نتايج خروجی برای کاربر، بخش فوق را می توان جزئی از بخش رابط کاربر يک نرم افزار در نظر گرفت . در زمان ورود اطلاعات ( مرحله ورودی ) از عناصر متفاوتی بمنظور اخذ اطلاعات توسط کاربر در بخش رابط استفاده می گردد ، در مرحله خروجی ، بخش رابط کاربر با کاربر بگونه ای ديگر مرتبط خواهد شد ( ارتباطی بمراتب غير فعالتر نسبت به مرحله ورود اطلاعات ) .
مرحله پاکسازی ( Cleanup )
مرحله پاکسازی ، بمنظور خاتمه بخشيدن مودبانه يک برنامه، پس از تکميل عمليات مربوطه است. می توان اين مرحله را بعنوان مکمل مرحله مقداردهی اوليه در نظر گرفت .با اينکه تعداد زيادی از برنامه های ساده قادرند بسادگی و بدون انجام عمليات تکميلی توسط برنامه نويس ، خاتمه يابند ولی برنامه های پيچيده زيادی نيازمند برخی کمک ها در اين زمينه می باشند. مثلا” اگر برنامه ای يک فايل Setup را بمنظور مقداردهی برخی از متغيرها در زمان مرحله مقداردهی اوليه ، خوانده باشد ، مرحله پاکسازی می تواند شامل بهنگام سازی آندسته از متغيرهای موجود در فايل Setup باشد که نشاندهنده آخرين اطلاعات کاربر است . مرحله پاکسازی ، اغلب شامل بستن فايل ها ( فايل های Setup و بانک اطلاعاتی) است . برخی برنامه ها ميزان استفاده از برنامه توسط کاربران را ثبت و اطلاعات مربوطه را در مکانهائی که Log file ناميده می شوند ، ذخيره می نمايند( ثبت مشخصات افراديکه برنامه را اجراء نموده بهمراه ساير اطلاعات مرتبط نظير تاريخ و زمان آغاز و توقف برنامه ، در خيلی از برنامه ها به امری ضروری تبديل شده است ) .
يکی ديگر از انواع فايل های Log به فايل های ثبت خطاء برمی گردد( error log file ) . هدف اين نوع از فايل ها ، ثبت اطلاعاتی در رابطه با هر نوع خطائی است که ممکن است در مدت زمان اجرای يک برنامه ، محقق گردد. برنامه نويسان با استفاده از محتويات اين نوع فايل ها ، قادر به اشکال زدائی برنامه خواهند بود .
عمليات واقعی و مورد نظری که می بايست در مرحله پاکسازی ، انجام گردد ، به نيازهای يک برنامه بستگی خواهد داشت . معمولا” اگر در برخی برنامه ها عمليات خاصی را در مرحله مقدار دهی اوليه انجام می هيم ، می بايست برخی از عمليات متناظر با آنان را در مرحله پاکسازی انجام داد . باز نمودن و بستن فايل های مورد نياز در يک برنامه ، نمونه ای متداول از دو مرحله فوق می باشد .
آيا هر برنامه شامل پنج مرحله گفته شده است؟
در پاسخ به سوال فوق می بايست با صراحت پاسخ منفی داده شود. در اين راستا ، برنامه های متعددی وجود دارد که مثلا” به مراحل مقداردهی اوليه و يا پاکسازی ، نياز نخواهند داشت . مراحل مقداردهی اوليه و پاکسازی در مرحله طراحی برنامه های پيچيده مورد توجه جدی قرار خواهند گرفت. بموازات افزايش تجربه در نوشتن برنامه ، شناخت مناسبی در اين رابطه بوجود می آيد( کدام برنامه به تمام مراحل پنج گانه نياز و کداميک نياز ندارند).طراحان می بايست همواره يک مسئله برنامه نويسی را با فرض وجود پنج مرحله ياد شده ،دنبال نمائيد . قطعا” حذف يک مرحله در زمان طراحی بمراتب ساده تر از ناديده گرفتن ! اوليه آن خواهد بود.
پالايش يک طرفه ( Sideways Refinement )
همانگونه که قبلا” اشاره گرديد ، ما علاقه مند به طراحی بالا به پايين می باشيم .( الگوريتم ماکرو بعنوان يک نقطه شروع در فرآيند طراحی برنامه) . پس از انتخاب رويکرد فوق ، می بايست شناخت مناسبی نسبت به مسئله ای که قصد حل آن وجود دارد ، ايجاد گردد. تا رسيدن به سطح ميکرو( ارائه الگوريتم های ميکرو) بمنظور حل مسئله مورد نظر راه زيادی را در پيش خواهيم داشت. بموازات حرکت از سطح مرور کلی برنامه به خصوصيات و ويژگی های يک برنامه ، می بايست دانش خود را نسبت به جرئيات مربوطه افزايش داد .
از پنج مرحله گفته شده ، می توان بمنظور نقطه شروع ديد ماکرو خود در زمان فرآيند طراحی استفاده کرد. درادامه ، می توان هر يک از مراحل را بدقت بررسی تا جزئيات بيشتری در رابطه با مرحله مورد نظر ، مشخص گردد ( استخراج جزئيات لازم در رابطه با تحقق هر مرحله ) . فرآيند فوق ، ” پالايش يک طرفه ” ، ناميده می شود . در ادامه ، بمنظور شناخت مناسب فرآيند پالايش يک طرفه ، به بررسی يک نمونه می پردازيم .
فرض کنيد ، کاربری دارای يک فايل بانک اطلاعاتی است که در آن تمام قرار ملاقات های وی ، ذخيره شده اند . قرار ملاقات ها در بانک اطلاعاتی با نظم و ترتيب خاص ( تاريخ قرار ملاقات ) ذخيره شده اند . کاربر ، می خواهد قادر به مشاهده قرار ملاقات های خود بر اساس حروف الفبائی و بر اساس نام خانوادگی اشخاص مورد نظری که قصد ملاقات با وی را دارند ، باشد. چگونه می توان از پالايش يک طرفه ، بمنظور طراحی يک را ه حل استفاده کرد؟
شبه کد ( Pseudo Code )
عمليات پالايش را می توان در رابطه با هر مرحله با استفاده از “شبه – کد ” ، دنبال کرد. شبه کد ،الگوريتمی برای بيان عملياتی است که می بايست توسط يک روتين محقق گردد . در اين راستا از يک گرامر مشابه انگليسی ، استفاده می گردد . مثلا” شبه کد ، روتين IsValidUser بصورت زير خواهد بود:
IsValidUser() If CurrentUserName NotinValidUserList Display Invalid User Error Message Terminate Program Else ReturnValidUserIDNumber End |
شبه کد ، عملياتی را که يک روتين می بايست انجام دهد ، بدون اتکاء به گرامر يک زبان برنامه نويسی خاص ، تشريح می نمايد. شبه کد ، زبانی مبتنی بر گرامری خاص نبوده و الگوريتمی از عمليات مورد نظر که می بايست توسط يک روتين انجام شود را مشخص می نمايد. مزيت شبه کد، شباهت زياد آن به زبان انگليسی است و می توان آن را با افراديکه برنامه نويس نبوده و بنوعی در فاز طراحی صاحبنظر می باشند ، به اشتراک تا صحت استنباطات حاصل شده تائيد و يا اصلاح گردد.( در فاز طراحی می بايست يک ارتباط مستمر با کاربران صاحبنظر برقرارگردد، ما قرار است مسئله آنان را حل نمائيم نه مسئله خود را و يا نمی خواهيم مسئله ای ديگر را بر حجم مسائل آنان اضافه نمائيم!) بدين ترتيب ، امکان تشخيص خطاء و اعمال تعييرات لازم در خصوص برخورد با خطاهای احتمالی در ابتدا فراهم می گردد ( يکی از اصول مهندسی نرم افزار در اين رابطه به اين موضوع اشاره می نمايد که به هر ميزان که زمان کشف يک خطاء در چرخه حيات يک برنامه سريعتر باشد ، هزينه برخورد با خطاء کاهش خواهد يافت ) .
پس از آگاهی از اهداف ارائه شده در شبه کد، می توان بسادگی اقدام به ترجمه شبه کد مربوطه به کدهای برنامه نويسی با استفاده از زبان مورد نظر نمود. فراموش نکنيم که طراحی خوب ، همواره پياده سازی ساده تر برنامه ها را بدنبال خواهد شد.
در بخش دوم اين مقاله ، با متدولوژی UML)Unified Modeling Language ) آشنا خواهيم شد. UML ، يک متدولوژی طراحی متداول خصوصا” در زمينه برنامه نويسی شی گراء است.
در حالت کلی الگوريتم ها بايد ويژگی های زير را داشته باشند
- الگوريتم بايد ما را به نتيجه مورد نظر برساند.
- در زمان محدود پايان يابد.
- دستورالعملها بايد به ترتيب منطقی پشت سرهم قرار گيرند.
- جملات الگوريتم ها بايد به صورت امری ، سؤالی باشند.
- هر الگوريتم بايد نقطه آغاز و پايان داشته باشد.
مثال: الگوريتمی بنويسيد که دو عدد از ورودی دريافت شود و سپس تعيين شود که مجموع دو عدد بزرگتر از 20 است يا نه.
- شروع .
- دو عدد a و b را از ورودی در يافت کن.
- a+b را محاسبه کن.
- آيا a+b>20 است؟ اگر بلی به مرحله 6 برو.
- بنويس خير.
- به مرحله 7 برو.
- بنويس بلی.
- پايان.
با برنامه ريزی و ساماندهی دقيق می توان به راه حلی مناسب جهت حل يک مسئله به کمک کامپيوتر رسيد. هرگونه کم توجهی و بی دقتی در نوشتن الگوريتم ضمن بروز مشکلات بسيار، برنامه نويس را نيز از هدف خود دور خواهد کرد؛ لذا برای به هدف رسيدن بايد درک صحيح و کاملی از صورت مسئله داشت و سپس راه حل مورد نظر را به صورت الگوريتم بنويسيم. و در نهايت الگوريتم مورد نظر را به زبان برنامه نويسی مورد نظر تبديل کنيم. برای درک بهتر شيوه حل مسائل و نوشتن الگوريتم به مثالهای زير توجه کنيد:
مثال: الگوريتمی بنويسيد که مجموع اعداد طبيعی مضرب 7 و کوچکتر از 50 را حساب کند.
برای نوشتن اين الگوريتم به دو خانه حافظه نياز داريم.
- شروع.
- در خانه حافظه sum عدد صفر را قرار بده.
- در خانه حافظه index عدد 7 را قرار بده.
- مقدار index را با مقدارsum جمع کن
و حاصل را در sum قرار بده. - مقدار 7 را با مقدار index جمع کن
و حاصل را در index قرار بده. - آياindex بزگتراز 50 است،اگر خير به مرحله 3 برو.
- محتوای sum را چاپ کن.
- پايان.
در الگوريتم فوق همانند شکل مقادير حافظه sum و index تغيير می کند، تا اينکه سرانجام شرط ” آيا index بزرگتر از 50 است ” بلی می شود لذا محتوای sum در خروجی چاپ خواهد شد و الگوريتم به پايان می رسد. اما در مراحل قبلی شرط فوق خير می باشد، لذا همانند شکل فوق الگوريتم ادامه پيدا می کند.
مثال : الگوريتمی بنويسيد که 1000 عدد را از ورودی دريافت کرده و کوچکترين را چاپ کند.
فرض کنيد که به شما ليستی از اعداد را می دهند، برای پيدا کردن کوچکترين عدد در ليست اولين عدد را به عنوان کوچکترين در نظر می گيريد سپس عدد بعدی را با آن مقايسه می کنيد، اگر عدد جديد از عدد قبلی کوچکتر بود عدد جديد را به عنوان کوچکترين در نظر می گيريد و گر نه همان عدد قبلی کوچکترين خواهد بود. اين روند را تا انتهای ليست ادامه می دهيد؛ در پايان عددی که در هر بررسی به عنوان کوچکترين عدد بود، جواب مورد نظر ما خواهد بود. توجه کنيد که در اين روال شما همواره يک عدد را در ذهن خود در نظر گرفته بوديد، برای نوشتن الگوريتم مورد نظر ما يک خانه حافظه را به کوچکترين عدد درهر مرحله اختصاص می دهيم.
- شروع.
- min را دريافت کن.
- i =1 .
- a را دريافت کن.
- اگر a
- i = i + 1 .
- اگر i>=1000 به مرحله 8 برو.
- به مرحله 3 برو.
- min را چاپ کن.
- پايان.
الگوريتم های قبلی به صورت جملات فارسی بودند که سبب طولانی و حجيم شدن الگوريتم می شدند. ولی الگوريتم اخير بيشتر به صورت جملات رياضی بود. اين شيوه سبب راحتی درک الگوريتم و ساده شدن نگارش آن می شود. از اين به بعد نيز الگوريتم ها را به شيوه جديد نگارش خواهيم کرد. شما نيز سعی کنيد از اين شيوه استفاده کنيد.
مثال : الگوريتمی بنويسيد که سه عدد از ورودی دريافت شود و تعيين شود که اين اعداد می توانند اضلاع مثلث باشند يا خير.
- شروع.
- a وb وc را از ورودی بگير.
- اگر a>b+c به 7 برو.
- اگر b>a+c به 7 برو.
- اگرc>a+b به 7 برو.
- بنويس ” بلی “.
- به 8 برو.
- بنويس ” خير “.
- پايان.
در عمل برای نمايش الگوريتم از يک فلوچارت ( شمای جريان عمليات ) استفاده می شود. در حقيقت فلوچارت روش تصويری و استاندارد نمايش الگوريتم است.
در رسم فلوچارت علائم و نمادهای استانداردی به کار می رود که هر کدام دارای معانی ويژه ای هستند:
- از شکل بيضی افقی برای شروع و پايان عمليات استفاده می شود.
- از شکل مستطيل برای نمايش مراحل پردازشی استفاده می شود و در داخل آن عمل مورد نظر نوشته می شود. اين نماد ممکن است چندين ورودی داشته باشد ولی تنها يک خروجی دارد.
- از متوازی الاضلاع برای نشان دادن ورودی يا خروجی استفاده می شود.
منبع: fullkade.com