• تعریف زیر برنامه زیربرنامه چیست. II. یادگیری مطالب جدید

    مفهوم رویه ها و توابع زیربرنامه ها

    که درتمایز توربو پاسکال دو نوع زیر روال عبارتند از رویه ها و توابع. یک رویه و یک تابع دنباله ای نامگذاری شده از اعلان ها و عبارات هستند. همچنین استفاده از رویه‌ها و توابع زمانی ضروری است که بتوان از برخی از قطعات الگوریتم‌های توسعه‌یافته قبلی استفاده کرد. علاوه بر این، از زیر روال ها برای شکستن برنامه های بزرگ به قسمت های معنایی جداگانه مطابق با اصل مدولار در برنامه نویسی استفاده می شود. روش- این قسمت نامگذاری شده مستقل از برنامه است که می توان آن را با نام فراخوانی کرد تا دنباله ای از اقدامات تعریف شده در آن را انجام دهد. رویه ها مجموعه ای از اقدامات را با هدف تغییر محیط برنامه در خارج از آنها تنظیم می کنند. در PASCAL، رویه های استاندارد وجود دارد: خواندن، خواندن، نوشتن، نوشتن. بنابراین، مفهوم رویه مفهوم عملگر را در PASCAL گسترش می دهد. تابعبا یک رویه تفاوت دارد زیرا نتیجه از نوع مشخص شده در توضیحات آن را برمی گرداند. فراخوانی تابع را می توان از عبارتی که در آن نام تابع به عنوان عملگر استفاده می شود، انجام داد. توابع یک مورد خاص از رویه ها هستند و لزوماً نتیجه را به عنوان مقدار نام این تابع به نقطه فراخوانی برمی گردانند. هنگام استفاده از توابع، باید سازگاری نوع در عبارات را در نظر بگیرید. در PASCAL، تعدادی توابع استاندارد برای هر برنامه ای شناخته شده است: sin، cos، eof، و همچنین توابع دیگر از جدول شماره 3. بنابراین، مفهوم تابع مفهوم یک عبارت را در زبان پاسکال گسترش می دهد.

    متغیرهای محلی و جهانی

    به یاد بیاورید که هر ماژول (رویه، تابع، برنامه) از یک هدر ( رویه…, عملکرد…, برنامه…) و مسدود کنید.

    اگر بلوکی از رویه‌های p1 حاوی رویه p2 در داخل باشد، می‌گویند p2 در p1 تودرتو است.

    رویه p1(x: real; var y: real);

    روش p2 (varz: real);

    …………………….

    …………………….

    هر شناسه‌ای که در داخل هر بلوک (رویه‌ها، توابع) برای توصیف متغیرها، ثابت‌ها، انواع، رویه‌ها معرفی می‌شود، برای این بلوک محلی نامیده می‌شود. چنین بلوکی همراه با ماژول های تو در تو، محدوده این متغیرها، ثابت ها، انواع و رویه های محلی نامیده می شود.

    var y1, y2: واقعی;

    var a, b, c,d: real;

    (متغیرهای a، b، c، d محلی برای sq1 هستند،

    دامنه آنها رویه sq1 است)

    ……………………………………

    (متغیرهای y1، y2 برای sq1 غیر محلی هستند،

    محدوده آنها t1 و sq1 است)

    ثابت ها، متغیرها، انواع توصیف شده در بلوک برنامه نامیده می شوند جهانی. به نظر می رسد که به طور کلی فقط با متغیرهای سراسری سروکار داشته باشیم، زیرا همه آنها را در برنامه توضیح داده ایم. اما استفاده از متغیرهای محلی به سیستم اجازه می دهد تا برنامه ها را بهتر بهینه کند، آنها را خواناتر کند و احتمال خطا را کاهش دهد.

    تعیین برنامه های فرعی.

    زیربرنامه ها در ابتدا به عنوان وسیله ای برای بهینه سازی برنامه ها از نظر مقدار حافظه اشغال شده ظاهر می شدند - آنها این امکان را فراهم می کردند که بلوک های یکسان کد را در برنامه تکرار نکنید، بلکه آنها را یک بار توصیف کنید و در صورت لزوم آنها را فراخوانی کنید. تا به امروز، این عملکرد زیربرنامه ها کمکی شده است، هدف اصلی آنها ساختار برنامه به منظور سهولت درک و نگهداری آن است.

    • جدا کردن مجموعه ای از اقدامات در یک زیربرنامه و فراخوانی آن در صورت نیاز به شما امکان می دهد تا به طور منطقی یک زیرکار انتگرال را انتخاب کنید که دارای یک راه حل معمولی است. چنین اقدامی یک مزیت دیگر (علاوه بر صرفه جویی در حافظه) نسبت به تکرار اقدامات مشابه دارد: هر تغییری (اصلاح خطا، بهینه سازی، گسترش عملکرد) در زیربرنامه به طور خودکار در تمام تماس های آن منعکس می شود، در حالی که هنگام کپی کردن، هر کدام تغییر باید در هر رخداد کد قابل تغییر ایجاد شود.
    • حتی در مواردی که مجموعه‌ای از اقدامات یک‌باره به یک زیر روال اختصاص داده می‌شود، این امر توجیه می‌شود، زیرا به شما امکان می‌دهد اندازه بلوک‌های یکپارچه کد را که برنامه را تشکیل می‌دهند، کاهش دهید، یعنی برنامه را قابل درک‌تر و قابل فهم‌تر کنید. قابل رویت ...

    مکانیسم زیربرنامه ها، شرح و فراخوانی آنها

    در مثال پاسکال زیر، subprog از برنامه اصلی سه بار فراخوانی می شود:

    برنامه SubProgExample; فرآیند فرعی؛ شروع // شروع بدنه زیربرنامه WriteLn ("بای"); پایان ؛ // انتهای بدنه زیربرنامهشروع WriteLn ("سلام") ; subprog; // اولین فراخوانی به subprog; // فرعی فراخوانی دوم؛ // پایان تماس سوم .

    نتیجه اجرای چنین برنامه ای خروجی رشته «سلام» و سه رشته «بای» خواهد بود.

    برخی از زبان های برنامه نویسی (مثلاً Pascal، Ada، Modula-2) به زیربرنامه های تو در تو اجازه می دهند، یعنی قرار دادن زیربرنامه ها در زیربرنامه های دیگر. چنین زیربرنامه های تو در تو را فقط می توان در زیربرنامه ای که در آن اعلان شده است استفاده کرد. در موارد دیگر (مثلاً در زبان C)، تودرتو کردن زیر روال ها مجاز نیست. زیربرنامه‌های تودرتو هیچ مزیت اساسی نمی‌دهند، اما می‌تواند برای ساختار منطقی‌تر برنامه راحت باشد (اگر برخی از زیربرنامه‌ها فقط در زیربرنامه دیگری استفاده می‌شوند، منطقی است که اولی را در برنامه دوم قرار دهیم).

    پارامترهای زیر برنامه

    تخصیص پارامترها

    زیربرنامه ها اغلب برای انجام مکرر اقدامات کلیشه ای روی داده های مختلف استفاده می شوند. زیربرنامه معمولاً به آبجکت های داده ای که در برنامه اصلی توضیح داده شده است (حداقل برخی از آنها) دسترسی دارد، بنابراین برای انتقال داده های پردازش شده به زیربرنامه، کافی است آنها را مثلاً به متغیرهای سراسری اختصاص دهیم. اما این راه به خصوص راحت و مملو از خطا نیست.

    برای اطمینان از انتقال کنترل شده پارامترها به زیربرنامه و بازگشت نتایج از آن، از مکانیزمی استفاده می شود. مولفه های. پارامترها در توضیحات زیر روال (در سربرگ آن) توضیح داده می شوند و می توانند در داخل رویه به همان روشی که متغیرهای توضیح داده شده در آن هستند، استفاده شوند. هنگامی که یک رویه فراخوانی می شود، مقادیر هر یک از پارامترها در دستور فراخوانی (معمولاً پس از نام زیربرنامه فراخوانی شده) مشخص می شود.

    برنامه SubProgExample2; // شرح زیربرنامه زیر برنامهپروسه subprog(خط: رشته) ; // هدر شامل نام زیربرنامهشروع // شروع بدنه زیربرنامه WriteLn(خط)؛ پایان ؛ // انتهای بدنه زیربرنامهشروع WriteLn ("سلام") ; subprog("خداحافظ" ); // 1st call subprog("عشق من," ); // دومین فراخوان subprog("خداحافظ!" ); // پایان تماس سوم .

    در مثال بالا، پارامتر خطکارهای روزمره برنامه فرعیدر هر تماس مقدار متفاوتی دریافت می کند که به همین دلیل خطوط مشابهی نمایش داده نمی شوند، بلکه خطوط متفاوتی نمایش داده می شوند.

    پارامترهای رسمی و واقعی

    برای تشخیص پارامترهای یک زیربرنامه که در سربرگ و بدنه آن توضیح داده شده است از پارامترهای مشخص شده هنگام فراخوانی زیربرنامه، اولی پارامترهای رسمی و دومی پارامترهای واقعی هستند. بنابراین، در آخرین مثال، پارامتر خطدر سربرگ و بدنه زیربرنامه برنامه فرعییک پارامتر رسمی است و رشته "خداحافظ"مورد استفاده در اولین فراخوانی این زیربرنامه، پارامتر واقعی است. هنگامی که یک زیربرنامه فراخوانی می شود، پارامترهای واقعی مشخص شده در فرمان فراخوانی به مقادیر پارامترهای رسمی مربوطه تبدیل می شوند که انتقال داده ها به زیربرنامه را تضمین می کند.

    نحوه ارسال پارامترها به یک زیر برنامه

    راه های مختلفی برای ارسال پارامترها به یک زیربرنامه وجود دارد.

    • عبور پارامترها بر اساس مقدارپارامتر رسمی اختصاص داده شده است معنیپارامتر واقعی در این حالت، پارامتر رسمی حاوی یک کپی از مقدار موجود در مقدار واقعی خواهد بود و هر اثری که در داخل زیربرنامه روی پارامترهای رسمی ایجاد شود در پارامترهای واقعی منعکس نمی شود. بنابراین، اگر یک متغیر به عنوان یک پارامتر واقعی استفاده شود، و مقدار پارامتر رسمی مربوطه در داخل زیربرنامه تغییر کند، آنگاه پارامتر واقعی بدون تغییر باقی می‌ماند.

    int func1(int x) (x=x+1; بازگشت x;)

    • انتقال پارامترها توسط مرجعپارامتر رسمی را می توان قرار داد خودمپارامتر واقعی (معمولاً این کار با قرار دادن ارجاع به پارامتر واقعی در پارامتر رسمی انجام می شود). در این حالت، هر تغییری در پارامتر رسمی در زیربرنامه در پارامتر واقعی منعکس خواهد شد - هر دو پارامتر در طول فراخوانی زیربرنامه یکسان هستند. پارامترهای ارسال شده توسط مرجع این امکان را فراهم می کند که نه تنها پارامترها را در زیر روال ارسال کنید، بلکه مقادیر محاسبه شده را به نقطه تماس نیز برگردانید. برای انجام این کار، به پارامتر داخل زیربرنامه به سادگی مقدار مورد نظر اختصاص داده می شود و پس از بازگشت از زیربرنامه، به متغیر مورد استفاده به عنوان پارامتر واقعی آن مقدار اختصاص می یابد.

    void func2(int &x) (x=x+1;)

    • انتقال پارامترها بر اساس نامیک عبارت دلخواه را می توان در یک پارامتر رسمی قرار داد. در این حالت، محاسبه این عبارت در لحظه ای که مقدار آن مورد نیاز است، در زیربرنامه اتفاق می افتد. اگر این مقدار چندین بار ظاهر شود، چندین بار نیز محاسبه می شود. پارامترهایی که با نام ارسال می شوند، نوشتن برنامه های فرعی نسبتاً همه کاره را ممکن می کنند. این روش انتقال پارامترها برای مثال در زبان های Algol یا Algol 68 استفاده می شود.
    • انتقال پارامترها در پشتهاین در واقع نوعی پارامتر است که از مقدار "با درایو دستی" عبور می کند، در این مورد هیچ مفهومی از پارامترهای رسمی و واقعی وجود ندارد. همه پارامترها روی پشته قرار دارند و نوع، تعداد و ترتیب آنها توسط کامپایلر کنترل نمی شود. این رویکرد در زبان Forth پیاده سازی شده است.

    یک زبان برنامه نویسی ممکن است توانایی ارسال پارامترها به زیر روال ها را فقط بر اساس مقدار (این کار در زبان C انجام می شود) یا با مقدار و با مرجع (این در Pascal، Ada، C ++ پیاده سازی شده است)، یا با نام و مقدار (این در الگول و الگول 68 پیاده سازی شده است). در دو مورد آخر، ساختارهای نحوی جداگانه برای تمایز بین روش های ارسال یک پارامتر استفاده می شود (در پاسکال، این یک کلمه کلیدی است. varهنگام توصیف پارامتر). در واقع، اگر زبان حاوی مفهوم پیوند (اشاره گر) باشد، می توانید بدون ارسال یک پارامتر توسط مرجع انجام دهید (همیشه می توان با توصیف پارامتری از نوع "مرجع" مدل سازی کرد)، اما این ویژگی راحت است، زیرا این به شما امکان می دهد با یک مرجع پارامتر رسمی بدون ارجاع کار کنید و همچنین قابلیت اطمینان و امنیت برنامه را افزایش می دهد.

    محدودیت‌های طبیعی بر روی پارامترهایی اعمال می‌شود که با مرجع ارسال می‌شوند: پارامتر واقعی که جایگزین چنین پارامتری می‌شود در هنگام فراخوانی باید یک متغیر باشد (یعنی یک آدرس داشته باشد)، و در زبان‌هایی که به شدت تایپ شده‌اند، باید دقیقاً همان نوع داده را داشته باشد.

    انواع زیربرنامه ها

    دو نوع زیربرنامه در زبان های برنامه نویسی سطح بالا استفاده می شود: رویه ها و توابع.

    • تابع یک زیربرنامه از نوع خاص است که علاوه بر دریافت پارامترها، انجام اقدامات و انتقال نتایج کار از طریق پارامترها، یک ویژگی دیگر نیز دارد - می تواند نتیجه بازگشت. فراخوانی تابع از دیدگاه زبان برنامه نویسی یک عبارت است که می تواند در عبارات دیگر یا به عنوان سمت راست یک انتساب استفاده شود. ادامه مطلب را در مقاله بخوانید

    زیر برنامه - بخش نسبتاً مستقلی از برنامه که نام خاص خود را دارد و اقدامات خاصی را انجام می دهد.

    زیربرنامه ها قابلیت اطمینان و دید برنامه ها را افزایش می دهند، زیرا. به شما امکان می دهد هر بلوک برنامه را به طور مستقل توسعه و اشکال زدایی کنید (مثلاً توسط افراد مختلف).

    ساختار زیر برنامهتقریباً به طور کامل ساختار کل برنامه را تکرار می کند و از بخش های زیر تشکیل شده است:

      سربرگ زیربرنامه

      بخش توضیحات

      بدنه زیر روال

    دو نوع زیربرنامه در پاسکال وجود دارد رویه هاو کارکرد. آنها از نظر هدف و نحوه استفاده متفاوت هستند. رویه ها برای انجام دنباله خاصی از اقدامات با هدف تغییر محیط برنامه (تغییر مقادیر متغیرها، ورودی / خروجی داده و غیره) خدمت می کنند. کارکرد برای ارزیابی ارزش یک عبارت

    5.1 رویه ها

    روش <имя>(لیست پارامترهای رسمی)؛

    <раздел описаний>;

    شروع

    < بدن رویه>;

    مثال 1:روش محاسبه و نمایش مکعب یک عدد.

    روش توله (x: واقعی);

    تعیین نام رویه در برنامه منجر به فعال شدن رویه و فراخوانی می شود چالش. بلافاصله پس از فعال سازی رویه، دستورات موجود در آن شروع به اجرا می کنند. پس از اجرای آخرین دستور رویه، کنترل به برنامه اصلی منتقل می شود و سپس دستورات پس از فراخوانی رویه اجرا می شوند. یک رویه را می توان چندین بار در برنامه اصلی فراخوانی کرد.

    مثلا:

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

    مثال 2:برنامه ای که موارد زیر را نمایش می دهد:

    var a,b: عدد صحیح;

    رویه ستاره ها; (بدون گزینه)

    var i: عدد صحیح;

    برای i:=1 تا 9 بنویسید('*');

    برای یک: = 1 تا 4 انجام دهید

    writeln('a=',a,'b=',b);

    ستاره ها؛ (روش فراخوانی ستاره ها)

    مثال3:

    var a,b: عدد صحیح;

    رویه رشته (ch: char، n: عدد صحیح);

    var i: عدد صحیح;

    برای i:=1 تا n انجام دهید write(ch);

    رشته ('+',4);

    برای یک: = 1 تا 3 انجام دهید

    writeln('a=',a,'b=',b);

    رشته ('*',8);

    بیایید فراخوانی رویه Stroka('*',8) را تجزیه و تحلیل کنیم: '*' و 8 پارامترهای واقعی هستند (یعنی آنهایی که در پرانتزها بعد از نام رویه هنگام فراخوانی مشخص می شوند)، هنگام فراخوانی رسمی به آنها اختصاص داده می شود. پارامترهای ch و n (t یعنی آنهایی که در داخل پرانتز بعد از نام رویه هنگام توصیف آن نشان داده شده اند).

    اظهار نظر:تعداد، ترتیب و نوع پارامترها هنگام فراخوانی یک رویه باید با تعداد، ترتیب و نوع پارامترهای مشخص شده در هنگام توصیف رویه مطابقت داشته باشد.

    نتیجه صفحه نمایش:

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

    هدف از برنامه های فرعی

    زیربرنامه ها در ابتدا به عنوان وسیله ای برای بهینه سازی برنامه ها از نظر مقدار حافظه اشغال شده ظاهر می شدند - آنها این امکان را فراهم می کردند که بلوک های یکسان کد را در برنامه تکرار نکنید، بلکه آنها را یک بار توصیف کنید و در صورت لزوم آنها را فراخوانی کنید. تا به امروز، این عملکرد زیربرنامه ها کمکی شده است، هدف اصلی آنها ساختار برنامه به منظور سهولت درک و نگهداری آن است.

    • جدا کردن مجموعه ای از اقدامات در یک زیربرنامه و فراخوانی آن در صورت نیاز به شما امکان می دهد تا به طور منطقی یک زیرکار انتگرال را انتخاب کنید که دارای یک راه حل معمولی است. چنین اقدامی یک مزیت دیگر (علاوه بر صرفه جویی در حافظه) نسبت به تکرار اقدامات مشابه دارد: هر تغییری (اصلاح خطا، بهینه سازی، گسترش عملکرد) در زیربرنامه به طور خودکار در تمام تماس های آن منعکس می شود، در حالی که هنگام کپی کردن، هر کدام تغییر باید در هر رخداد کد قابل تغییر ایجاد شود.
    • حتی در مواردی که مجموعه‌ای از اقدامات یک‌باره به زیر روال اختصاص داده می‌شود، این امر توجیه می‌شود، زیرا به کاهش اندازه بلوک‌های انتگرال کدی که برنامه را تشکیل می‌دهند، می‌پردازد، یعنی برنامه را قابل درک‌تر می‌کند. و قابل مشاهده است.

    مزایای

    مزایای تقسیم یک برنامه به زیر روال ها عبارتند از:

    • تجزیه یک کار برنامه نویسی پیچیده به مراحل ساده: این یکی از دو ابزار اصلی برنامه نویسی ساخت یافته و ساختار داده است.
    • کاهش کدهای تکراری
    • امکان استفاده مجدد از کد در برنامه های دیگر
    • تقسیم یک کار برنامه نویسی بزرگ بین برنامه نویسان مختلف یا مراحل مختلف یک پروژه
    • پنهان کردن جزئیات پیاده سازی از کاربران زیربرنامه
    • بهبودهای ردیابی (بیشتر زبان ها راهی برای دریافت ردیابی تماس ارائه می دهند که شامل نام برنامه های فرعی درگیر و شاید حتی اطلاعات بیشتری مانند نام فایل ها و شماره خطوط است). بدون تجزیه کد به زیر روال ها، اشکال زدایی به طور جدی با مشکل مواجه می شود.

    مکانیسم زیربرنامه ها، شرح و فراخوانی آنها

    در مثال پاسکال زیر، subprog از برنامه اصلی سه بار فراخوانی می شود:

    برنامه SubProgExample ; فرآیند فرعی ; شروع // شروع بدنه زیربرنامه WriteLn ("بای"); پایان ؛ // انتهای بدنه زیربرنامهشروع WriteLn ("سلام") ; subprog ; // اولین فراخوانی به subprog ; // فرعی فراخوانی دوم ; // پایان تماس سوم .

    نتیجه اجرای چنین برنامه ای خروجی رشته «سلام» و سه رشته «بای» خواهد بود.

    برای ذخیره و بازیابی زمینه اجرای رویه فراخوانی، به منظور از بین بردن عوارض جانبی مرتبط با تغییرات نامطلوب احتمالی در رجیسترهای ماشین مورد استفاده، کامپایلر دنباله‌های خاصی از دستورات را برای هر رویه تولید می‌کند که به آن مقدمه و پایان رویه می‌گویند.

    برخی از زبان های برنامه نویسی (مثلاً Pascal، Ada، Modula-2) به زیربرنامه های تو در تو اجازه می دهند، یعنی قرار دادن زیربرنامه ها در زیربرنامه های دیگر. چنین زیربرنامه های تو در تو را فقط می توان در زیربرنامه ای که در آن اعلان شده است استفاده کرد. در موارد دیگر (مثلاً در زبان C)، تودرتو کردن زیر روال ها مجاز نیست. زیربرنامه‌های تودرتو هیچ مزیت اساسی نمی‌دهند، اما می‌تواند برای ساختار منطقی‌تر برنامه راحت باشد (اگر برخی از زیربرنامه‌ها فقط در زیربرنامه دیگری استفاده می‌شوند، منطقی است که اولی را در برنامه دوم قرار دهیم).

    پارامترهای زیر برنامه

    تخصیص پارامترها

    زیربرنامه ها اغلب برای انجام مکرر اقدامات کلیشه ای روی داده های مختلف استفاده می شوند. زیربرنامه معمولاً به آبجکت های داده ای که در برنامه اصلی توضیح داده شده است (حداقل برخی از آنها) دسترسی دارد، بنابراین برای انتقال داده های پردازش شده به زیربرنامه، کافی است آنها را مثلاً به متغیرهای سراسری اختصاص دهیم. اما این راه به خصوص راحت و مملو از خطا نیست.

    برای اطمینان از انتقال کنترل شده پارامترها به زیربرنامه و بازگشت نتایج از آن، از مکانیزمی استفاده می شود. مولفه های. پارامترها در توضیحات زیر روال (در سربرگ آن) توضیح داده می شوند و می توانند در داخل رویه به همان روشی که متغیرهای توضیح داده شده در آن هستند، استفاده شوند. هنگامی که یک رویه فراخوانی می شود، مقادیر هر یک از پارامترها در دستور فراخوانی (معمولاً پس از نام زیربرنامه فراخوانی شده) مشخص می شود.

    برنامه SubProgExample2 ; // شرح زیربرنامه زیر برنامهفرآیند فرعی (خط: رشته) ; // هدر شامل نام زیربرنامهشروع // شروع بدنه زیربرنامه WriteLn (خط)؛ پایان ؛ // انتهای بدنه زیربرنامهشروع WriteLn ("سلام") ; subprog("خداحافظ" ); // 1st call to subprog ("عشق من") ; // دومین فراخوانی به subprog ("خداحافظ!") ; // پایان تماس سوم .

    در مثال بالا، پارامتر خطکارهای روزمره برنامه فرعیدر هر تماس مقدار متفاوتی دریافت می کند که به همین دلیل خطوط مشابهی نمایش داده نمی شوند، بلکه خطوط متفاوتی نمایش داده می شوند.

    پارامترهای رسمی و واقعی

    برای تشخیص پارامترهای یک زیربرنامه، که در سربرگ و بدنه آن توضیح داده شده است، از پارامترهای مشخص شده هنگام فراخوانی زیربرنامه، از پارامترهای رسمی و واقعی استفاده می شود. پارامترهای رسمی هنگام اعلام یا تعریف یک زیربرنامه مشخص می شوند و پارامترهای واقعی مستقیماً هنگام فراخوانی آن مشخص می شوند. بنابراین، در آخرین مثال، پارامتر خطدر سربرگ و بدنه زیربرنامه برنامه فرعییک پارامتر رسمی است و رشته "خداحافظ"مورد استفاده در اولین فراخوانی این زیربرنامه، پارامتر واقعی است. هنگامی که یک زیربرنامه فراخوانی می شود، پارامترهای واقعی مشخص شده در فرمان فراخوانی به مقادیر پارامترهای رسمی مربوطه تبدیل می شوند که انتقال داده ها به زیربرنامه را تضمین می کند.

    نحوه ارسال پارامترها به یک زیر برنامه

    راه های مختلفی برای ارسال پارامترها به یک زیربرنامه وجود دارد.

    • عبور پارامترها بر اساس مقدارپارامتر رسمی اختصاص داده شده است معنیپارامتر واقعی در این حالت، پارامتر رسمی حاوی یک کپی از مقدار موجود در مقدار واقعی خواهد بود و هر اثری که در داخل زیربرنامه روی پارامترهای رسمی ایجاد شود در پارامترهای واقعی منعکس نمی شود. بنابراین، اگر یک متغیر به عنوان یک پارامتر واقعی استفاده شود، و مقدار پارامتر رسمی مربوطه در داخل زیربرنامه تغییر کند، آنگاه پارامتر واقعی بدون تغییر باقی می‌ماند.

    int func1(int x)

    (x=x+2؛ بازگشت x;

    • انتقال پارامترها توسط مرجعپارامتر رسمی را می توان قرار داد خودمپارامتر واقعی (معمولاً این کار با قرار دادن ارجاع به پارامتر واقعی در پارامتر رسمی انجام می شود). در این حالت، هر تغییری در پارامتر رسمی در زیربرنامه در پارامتر واقعی منعکس خواهد شد - هر دو پارامتر در طول فراخوانی زیربرنامه یکسان هستند. پارامترهای ارسال شده توسط مرجع این امکان را فراهم می کند که نه تنها پارامترها را در زیر روال ارسال کنید، بلکه مقادیر محاسبه شده را به نقطه تماس نیز برگردانید. برای انجام این کار، به پارامتر داخل زیربرنامه به سادگی مقدار مورد نظر اختصاص داده می شود و پس از بازگشت از زیربرنامه، به متغیر مورد استفاده به عنوان پارامتر واقعی آن مقدار اختصاص می یابد.
    • انتقال پارامترها بر اساس نامیک عبارت دلخواه را می توان در یک پارامتر رسمی قرار داد. در این حالت، محاسبه این عبارت در لحظه ای که مقدار آن مورد نیاز است، در زیربرنامه اتفاق می افتد. اگر این مقدار چندین بار ظاهر شود، چندین بار نیز محاسبه می شود. پارامترهایی که با نام ارسال می شوند، نوشتن برنامه های فرعی نسبتاً همه کاره را ممکن می کنند. این روش انتقال پارامترها برای مثال در زبان های Algol یا Algol 68 استفاده می شود.
    • انتقال پارامترها در پشتهاین در واقع نوعی پارامتر است که از مقدار "با درایو دستی" عبور می کند، در این مورد هیچ مفهومی از پارامترهای رسمی و واقعی وجود ندارد. همه پارامترها روی پشته قرار دارند و نوع، تعداد و ترتیب آنها توسط کامپایلر کنترل نمی شود. این رویکرد در زبان Forth پیاده سازی شده است.

    یک زبان برنامه نویسی ممکن است توانایی ارسال پارامترها به زیر روال ها را فقط بر اساس مقدار، یا بر اساس مقدار و مرجع، یا با نام و مقدار فراهم کند. در دو مورد آخر، ساختارهای نحوی جداگانه برای تمایز بین روش های ارسال یک پارامتر استفاده می شود (در پاسکال، این یک کلمه کلیدی است. varهنگام توصیف پارامتر). در واقع، اگر زبان حاوی مفهوم پیوند (اشاره گر) باشد، می توانید بدون ارسال یک پارامتر توسط مرجع انجام دهید (همیشه می توان با توصیف پارامتری از نوع "مرجع" مدل سازی کرد)، اما این ویژگی راحت است، زیرا این به شما امکان می دهد با یک مرجع پارامتر رسمی بدون ارجاع کار کنید و همچنین قابلیت اطمینان و امنیت برنامه را افزایش می دهد.

    این یک زیربرنامه از نوع خاصی است که علاوه بر دریافت پارامترها، انجام اقدامات و عبور نتایج کار از طریق پارامترها، یک ویژگی دیگر نیز دارد - همیشه باید یک نتیجه را برگرداند. فراخوانی تابع از دیدگاه زبان برنامه نویسی یک عبارت است که می تواند در عبارات دیگر یا به عنوان سمت راست یک انتساب استفاده شود.

  • روال یک قسمت نامگذاری شده مستقل از یک برنامه است که پس از یک توضیح واحد، می توان آن را به طور مکرر با نام از قسمت های بعدی برنامه برای انجام اقدامات خاصی فراخوانی کرد.
  • در زبان های مشابه، یک زیر برنامه همیشه به عنوان یک تابع توصیف می شود. این روش به عنوان تابعی از نوع اجرا می شود خالی، یعنی داشتن نوع خالی و بر این اساس، هیچ مقداری را بر نمی گرداند.

    زیربرنامه هایی که بخشی از کلاس ها در زبان های برنامه نویسی شی هستند معمولا متد نامیده می شوند. این اصطلاح به هر زیربرنامه عضو یک کلاس، هم توابع و هم رویه اشاره دارد. وقتی نیاز به توضیح است، از آن صحبت می شود روش ها - رویه هایا روش های عملکرد.

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

    کل برنامه را می توان به طور مشروط به دو بخش اصلی و کمکی تقسیم کرد. در بخش اصلی، ساده ترین پردازش اطلاعات انجام می شود، درخواستی برای انواع مختلف ماژول های کمکی (زیر روال ها).

    یک الگوریتم کمکی می‌تواند الگوریتم‌های کمکی دیگری را نیز فراخوانی کند، طول چنین زنجیره‌ای از فراخوانی از نظر تئوری نامحدود است. در اینجا و زیر، از جفت کلمات زیر به عنوان مترادف استفاده می شود: الگوریتم و برنامه، الگوریتم و زیربرنامه کمکی، فرمان و عملگر، برنامه و ماژول. الگوریتم های کمکی و اصلی به خودی خود نیستند، بلکه در ارتباط با یکدیگر هستند.

    هنگام استفاده از الگوریتم های کمکی، لازم است نحوه انتقال مقادیر داده های اولیه برای آنها و به دست آوردن نتیجه از آنها در نظر گرفته شود. استدلال های کمکیاینها متغیرهایی هستند که داده های اولیه باید در آنها قرار گیرد تا تکلیف فرعی مربوطه حل شود. نتایج الگوریتم کمکیاینها نیز متغیرهایی هستند که حاوی نتایج حل این وظایف فرعی هستند و نتیجه می تواند یک عمل خاص باشد که رایانه تحت عمل زیربرنامه انجام می دهد.

    زیربرنامه ها می توانند دو نوع باشند: زیربرنامه بدون پارامتر و زیربرنامه با پارامتر. تماس با یک برنامه فرعی را می توان از هر نقطه در برنامه اصلی یا زیربرنامه دیگر هر تعداد دفعه سازماندهی کرد.

    هنگام کار با زیربرنامه ها، مفاهیم مهم هستند پارامترهای رسمی و واقعی. پارامترهای رسمیشناسه داده های ورودی برای روتین هستند. اگر پارامترهای رسمی مقادیر خاصی را دریافت کنند، آنها فراخوانی می شوند واقعی. پارامترهای رسمی فقط در برنامه ای که ماژول-زیر روال داده شده فراخوانی می شود می توانند مقادیر خاصی را دریافت کنند. تایپ کنیدو سفارشورودی های پارامتر واقعی باید با ورودی های پارامتر رسمی یکسان باشد. در غیر این صورت، نتیجه برنامه غیرقابل پیش بینی خواهد بود. از این نتیجه می شود که هنگام دسترسی به زیربرنامه از اصلی از پارامترهای واقعی استفاده می شود ، در حالی که پارامترهای رسمی فقط در خود ماژول استفاده می شود.

    یک برنامه فرعی با پارامترها برای ضبط اقدامات مکرر تکرار شده با داده های اولیه متفاوت استفاده می شود.

    هنگام کامپایل زیربرنامه با پارامترها، قوانین زیر باید رعایت شود:

    1) هر زیربرنامه نام و لیستی از پارامترهای رسمی خود را دارد.

    2) رویه از برنامه اصلی با دستور فراخوانی فراخوانی می شود که از نظر شکل با فراخوانی دستور اجرا کننده تفاوتی ندارد. نتیجه به یک یا چند متغیر که در لیست پارامترهای رسمی قرار دارند، اختصاص داده می شود. اما نتیجه، البته، می تواند نه تنها مقادیر متغیرها، بلکه برخی اقدامات انجام شده توسط رایانه باشد.

    مثال 1 ما از الگوریتم برای یافتن بزرگترین مقسوم علیه دو عدد طبیعی به عنوان کمکی در حل مسئله استفاده می کنیم: برنامه ای برای تفریق کسری بنویسیم ( آ, ب, ج, داعداد طبیعی). نتیجه را به صورت کسر غیر قابل تقلیل معمولی بیان کنید.

    زیر برنامه

    1. اعداد طبیعی M، N را وارد کنید.
    2. اگر M=N به مرحله 5 بروید و در غیر این صورت به مرحله بعد بروید.
    3. اگر M>N، M:=M-N، در غیر این صورت N:=N-M.
    4. به مرحله 2 بروید.
    5. مقدار M را به برنامه اصلی منتقل کنید.
    6. پایان زیربرنامه

    برنامه اصلی

    1. مقادیر A، B، C، D را وارد کنید.
    2. E:=A*D - B*C.
    3. F:= B*D.
    4. اگر E=0، مقدار E را چاپ کنید و به مرحله 9 بروید، در غیر این صورت به مرحله بعد بروید.
    5. M:=|E|، N:=F، به زیربرنامه محاسبه GCD بروید.
    6. G: = M.
    7. E و F به طور کامل بر G تقسیم می شوند.
    8. مقادیر E و F را چاپ کنید.
    9. پایان برنامه.

    همانطور که از مثال می بینید، اعلان تابع زیر روال در بخش اعلان های نمونه اولیه تابع و اجرای پس از تابع اصلی است. اصلی. هدر زیربرنامه حاوی لیستی از پارامترهای رسمی است که نوع آنها را نشان می دهد، که می تواند به طور مشروط به پارامترهای ورودی و خروجی تقسیم شود (قبل از آنها &). به طور کلی هنگام دسترسی به یک تابع با لیستی از پارامترهای بدون &، کپی هایی از پارامترها در داخل تابع استفاده می شود که پس از اجرا حذف می شوند. علامت & به کامپایلر می گوید که از خود متغیر استفاده کند نه یک کپی از آن. هنگامی که یک تابع فراخوانی می شود، نام آن و لیستی از پارامترهای واقعی مشخص می شود. پارامترهای رسمی و واقعی باید از نظر تعداد و نوع مطابقت داشته باشند.

    توضیح یک تابع در C++ به شرح زیر است:

    return_value_type();

    مثلا،

    Void Nod(int e, int f, int &k); int f1(float a); طولانی f2();

    تابع همیشه یک مقدار واحد را برمی گرداند. همانطور که از مثال 1 می بینید، ما از نوع استفاده کردیم خالیبه عنوان نوع برگشتی آن ها به کامپایلر نشان داد که تابع ما هیچ مقداری را بر نمی گرداند.

    بیایید نشان دهیم که اگر زیربرنامه از مثال به عنوان تابعی نوشته شود که خود مقدار GCD را برمی گرداند (بدون استفاده از متغیر بازگشت) چگونه تغییر می کند.

    Int Nod(int m, int n) ( while (m!=n) if (m > n) m -=n؛ در غیر این صورت n -= m؛ بازگشت (n)؛ )

    بنابراین، در بدنه تابع، دستور بازگشت حداقل یک بار رخ می دهد که نشان می دهد کدام مقدار را به عنوان مقدار تابع برگردانیم.

    فراخوانی تابع در حالت اصلی به صورت زیر خواهد بود:

    G = Nod(fabs(e)، f);

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

    هنگام حل مسائل، توصیه می‌شود شرایط را تجزیه و تحلیل کنید، راه‌حل را در بلوک‌های بزرگ بنویسید (که عبارت‌های C++ نیستند)، جزئیات هر یک از بلوک‌ها (نوشتن به شکل بلوک، شاید باز هم عبارت‌های C++) و غیره را ادامه دهید، ادامه دهید. تا زمانی که هر یک از بلوک ها با استفاده از عملگرهای زبان پیاده سازی شوند.

    مثال 2 با یک عدد طبیعی n. اولین و آخرین رقم این عدد را عوض کنید.

    در اینجا لازم است تابع Number را به تفصیل بیان کنیم، که تعداد ارقام را در نماد یک عدد طبیعی برمی گرداند (از آنجایی که تابع Impossible شامل فراخوانی با آن است، تابع Number باید قبل از آن در قسمت نمونه های اولیه قرار گیرد).

    زیربرنامه هایی که خود را فراخوانی می کنند نیز امکان پذیر است. آنها نامیده می شوند بازگشتی. ایجاد چنین زیربرنامه هایی یک تکنیک برنامه نویسی زیبا است، اما به دلیل مصرف بیش از حد حافظه رایانه، همیشه توصیه نمی شود.

    مثال 3 حداکثر رقم را در یک عدد طبیعی معین پیدا کنید.

    هنگام ایجاد تابع Maximum، از ملاحظات زیر استفاده شده است: اگر عدد شامل یک رقم باشد، حداکثر است، در غیر این صورت، اگر رقم آخر حداکثر نباشد، باید در بین ارقام دیگر عدد جستجو شود. هنگام نوشتن یک الگوریتم بازگشتی، باید مراقب شرایط مرزی زمانی بود که زنجیره فراخوانی های بازگشتی شکسته شد و "باز کردن" معکوس آن آغاز شد. در مثال ما، این شرط ن

    جزئیات بیشتر در مورد بازگشت در مقاله زیر بحث شده است.

    سوالات و وظایف را کنترل کنید
    1. به چه الگوریتم هایی کمکی می گویند؟
    2. چند الگوریتم کمکی می تواند در الگوریتم اصلی وجود داشته باشد؟
    3. آیا الگوریتم های کمکی نوشته شده برای حل این مسئله می توانند در حل مسائل دیگر که استفاده از آنها مناسب است استفاده شود؟
    4. به چه پارامترهایی رسمی می گویند؟ واقعی؟
    5. چه تناسبی بین پارامترهای رسمی و واقعی باید رعایت شود؟
    6. آیا پارامترهای رویه (عملکرد) واقعی بیشتر از پارامترهای رسمی وجود دارد؟ در مورد کمتر چطور؟
    7. آیا برنامه های فرعی بدون پارامتر وجود دارد؟
    8. آیا محدودیتی در تعداد پارامترهای زیربرنامه وجود دارد؟ اگر نه، پس چگونه این تعداد در C++ محدود شده است؟
    9. در کدام بخش اعلان شده و در کدام زیرروال در C++ پیاده سازی شده است؟
    10. چه نوع مقدار تابعی می تواند باشد؟
    11. در مورد روش جزئیات پیشرونده در توسعه برنامه ها بگویید.
    12. به چه زیر برنامه هایی بازگشتی می گویند؟
    13. هنگام سازماندهی یک زیربرنامه بازگشتی، شرط مرزی چیست؟