زیرالگوریتم

در الگوریتم‌هایی که نوشته شده‌اند، ملاحظه می‌کنیم که الگوریتم ممکن است از بخش‌های تکرار شونده تشکیل شده باشد. محاسبه فاکتوریل اعداد، محاسبه قدر مطلق، بخش خواندن عناصر آرایه، بخش چاپ عناصر آرایه، و… از بخش‌هایی بودند که در الگوریتم‌ها به وفور مورد استفاده قرار گرفته‌اند. می‌توان برای هر بخش از مسئله یک الگوریتم نوشت و سپس آن‌ها را در الگوریتم کلی با هم ترکیب کرد. الگوریتمی که برای حل بخشی از مسئله نوشته می‌شود، **زیراَلگوریتم** نام دارد.

## امتیازات زیر الگوریتم‌ها
نوشتن زیر الگوریتم‌ها برای حل مسئله، امتیازاتی دارند که بعضی از ان‌ها را برمی‌شماریم:

۱. همکاری افراد را امکان‌پذیر می‌سازد، به طوری که یک مسئله را می‌توان به چند بخش تقسیم کرد و نوشتن الگوریتم هر بخش را به عهده افراد مختلفی گذاشت و سپس ان الگوریتم‌ها را با هم ترکیب کرد.

۲. از تکرار نوشتن دستور العمل‌ها جلوگیری می‌کند.

۳. عیب‌یابی و اشکال‌زدایی الگوریتم‌ها ساده‌تر می‌شود.

۴. زیرالگوریتم‌هایی را که در یک الگوریتم نوشته شدند، به همان صورت یا با تغییر اندک می‌توان آن‌ها را در الگوریتم‌های دیگر به کار برد.

## جنبه‌های زیر الگوریتم
هر زیر الگوریتم دارای دو جنبه‌است:

۱. جنبه تعریف

۲. جنبه فراخوانی

**جنبه تعریف** زیر الگوریتم، مجموعه دستورهایی است که عملکرد زیر الگوریتم را مشخص می‌کند.

**جنبه فراخوانی **زیر الگوریتم، دستوری است که زیر الگوریتم را فراخوانی می‌کند. فراخوانی زیر الگوریتم با نام آن انجام می‌شود.

هر زیر الگوریتم دارای نامی است که توسط ان فراخوانی می‌شود. نامگذاری برای زیر الگوریتم‌ها از قانون نام گذاری برای متغیرها تبعبت می‌کند.

هر الگوریتم برای ارتباط با زیر الگوریتم یا تبادل اطلاعات با آن، می‌تواند تعدادی از متغیرهای خودش را به زیر الگوریتم بفرستد یا اطلاعاتی را از الگوریتم دریافت کند. این اطلاعات را که بین زیر الگوریتم و الگوریتم تبادل می‌شود، **[[پارامتر]]** می‌گویند؛ بنابراین پارامترها می‌توانند ورودی یا خروجی باشند.
**پارامترهای ورودی** آنهایی هستند که از الگوریتم به زیر الگوریتم فرستاده می‌شوند و **پارامترهای خروجی** آنهایی هستند که از زیر الگوریتم به الگوریتم فرستاده می‌شوند.
زیر الگوریتم ممکن است هم دارای پارامتر ورودی و هم خروجی باشد، ممکن است فقط پارامتر ورودی داشته باشد، ممکن است فقط پارامتر خروجی داشته باشد، یا اصلاً پارامتر نداشته باشد. اگر زیر الگوریتم دارای پارامتر باشد، اسامی پارامترها در جلوی نام زیر الگوریتم و در داخل پرانتز قرار می‌گیرند و با کاما(,) از هم جدا می‌شوند. به عنوان مثال، زیر الگوریتم زیرا در نظر بگیرید:

MAX(X,Y,Z)

نام این زیر الگوریتم **MAX** است و دارای سه پارامتر **X,Y،Z** می‌باشد.

## انواع زیرالگوریتم‌ها
الگوریتمی که زیر الگوریتمی را **فراخوانی**می‌کند، انتظار دارد که زیر الگوریتم مقادیری را به الگوریتم فراخوان برگرداند. زیر الگوریتم‌ها را می‌توان به دو دسته تقسیم کرد:

۱. زیر الگوریتم‌های تابع(FUNCTION)

۲. زیر الگوریتم‌های زیر روال(SUBROUTINE)

**زیر الگوریتم‌های تابع**، فقط می‌تواند یک مقدار را به الگوریتم فراخوان برگردانند. این مقدار، در نامشان قرار می‌گیرد؛ لذا در بدنهٔ الگوریتم، نام تابع، حداقل یکبار باید مقدار گیرد.

**زیر الگوریتم‌های زیر روال**می‌توانند هیچ مقداری را برنگردانند، یک مقدار یا چند مقدار را برگردانند؛ ولی باید دقت داشت که زیر الگوریتم‌هایی که یک مقدار را برمی‌گردانند، بهتر است به صورت تابع نوشته شوند.

### خصوصیات زیرالگوریتم‌های تابع
۱. تمام دستورها الگوریتم را می‌توان در آن نوشت.

۲. فقط یک مقدار را به الگوریتم اصلی منتقل می‌کند.

۳. تغییرات بروی پارامترها را به الگوریتم اصلی منتقل نمی‌کند.

۴. نام زیر الگوریتم، مقدار را به الگوریتم فراخوان منتقل می‌کند. پس باید نام زیر الگوریتم حتماً در سمت چپ قرار گیرد.

### خصوصیات زیر الگوریتم‌های زیر روال
۱. تمام دستورها الگوریتم را می‌توان در آن نوشت.

۲. صفر یا بیش از یک خروجی را به الگوریتم اصلی منتقل می‌کند.

۳. تغییرات بر روی پارامترها به الگوریتم اصلی منتقل خواهد شد.

۴. به نام زیر الگوریتم رویه هیچ وقت مقداری نسبت داده نمی‌شود.

همان‌طور که مشاهده کردید می‌توان یک زیر الگوریتم تابع را به فرم زیر الگوریتم رویه نوشت ولی هیچ وقت نمی‌توان وقتی بیش از یک خروجی داریم از زیر الگوریتم تابع استفاده کنیم.

## نمادهای زیر الگوریتم در فلوچارت
برای فراخوانی زیر الگوریتم، و برگشت از زیر الگوریتم، از نمادهای زیر در فلوچارت استفاده می‌شود.

۱. از مستطیل برای فراخوانی زیر الگوریتم (داخل آن نام زیر الگوریتم (مثلاً: (MAX(X,Y,Z))

۲. از بیضی برای برگشت به الگوریتم

## پانویس

## منابع
* http://www.ida.liu.se/~mohto/OO_Modelica_course/Lecture06%20-%20Algorithms%20and%20Functions.pdf
* https://web.archive.org/web/20140204023511/https://cleo.whi.org/data/Supplemental%20Documentation/menoage.pdf
* http://www.cse.iitd.ernet.in/~ssen/csl356/notes/root.pdf

رده:الگوریتم‌ها