زیر برنامه ها: رویه ها و عملکردها - 1


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

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

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

زیر روال ها یا روش ها دو نوع هستند -  عملکرد (آنهایی که نتیجه کار را برمی گرداند) وروش ها (آنهایی که انجام نمی دهند).

بیایید با نوع دوم شروع کنیم. بیایید سعی کنیم یک مثال ساده بنویسیم.
فرض کنید باید رشته "Error" را روی صفحه نمایش دهیم هر بار که ممکن است به دلیل خطای کاربر خطایی در کد رخ دهد (مثلاً وقتی داده های نادرست وارد می کند).
این را می توان با نوشتن عبارت
انجام داد <پیش> Console.WriteLine("Error"); حالا بیایید تصور کنیم که این خط باید در بسیاری از جاهای برنامه درج شود. البته، شما فقط می توانید آن را در همه جا بنویسید. اما این راه حل دو اشکال دارد.
1) این رشته بارها در حافظه ذخیره می شود؛
2) اگر بخواهیم خروجی خطا را تغییر دهیم، باید این خط را در طول برنامه تغییر دهیم، که نسبتاً ناخوشایند است.

برای چنین مواردی به روش ها و رویه هایی نیاز است.
یک برنامه با رویه ممکن است به این صورت باشد:

با استفاده از سیستم;
classProgram {
    static void PrintError() {
        Console.WriteLine("خطا");
   
    استاتیک void Main() {
        PrintError();
   
}

 

روش با کلمه void شروع می شود. بعد از نام رویه ؛ براکت های خالی نوشته شده است.
تمام دستوراتی که در یک رویه اجرا می شوند تورفتگی دارند. 
اصلاح کننده Static  به این معنی است که فیلد، متد یا ویژگی داده شده به هر شیء کلاس تعلق نخواهد داشت، بلکه به همه آنها با هم تعلق دارد.
متدها و رویه ها قبل از متد اصلی Main() نوشته می شوند.

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

حالا بیایید تصور کنیم که بسته به اینکه آیا باید پیام های مختلفی را در پاسخ به خطای کاربر نمایش دهیم. دقیقا چه اشتباهی مرتکب شد.
در این صورت، می توانید رویه خود را برای هر خطا بنویسید: 

 

void printErrorZero() {     Console.WriteLine("خطا. تقسیم بر صفر!"); }

 

 

<پیش> void printErrorInput() { Console.WriteLine ("خطا در ورودی!"); } اگر خطاهای احتمالی بسیار بیشتری وجود داشته باشد چه؟ سپس این راه حل برای ما مناسب نیست.
ما باید یاد بگیریم که چگونه رویه را با گفتن اینکه چه پیام خطایی نمایش دهد، کنترل کنیم.
برای این کار به پارامترهایی نیاز داریم که بعد از نام رویه در پرانتز می نویسیم
<پیش> void printError(string s) { Console.WriteLine(های)؛ } در این روش، s یک پارامتر است - یک متغیر ویژه که اجازه می دهد تا رویه را کنترل کنید.
پارامتر متغیری است که عملکرد زیربرنامه به مقدار آن بستگی دارد. نام پارامترها با کاما در هدر زیربرنامه از هم جدا شده اند. نوع پارامتر قبل از پارامتر نوشته می شود.

اکنون، هنگام فراخوانی رویه، باید مقدار واقعی را در پرانتزهایی که به آنها اختصاص داده می شود، مشخص کنید. به پارامتر ( متغیر s) داخل رویه ما <پیش> printError("خطا! تقسیم بر صفر!"); این مقدار آرگومان نامیده می شود.
Argument مقدار پارامتری است که هنگام فراخوانی به زیر روال ارسال می شود.
آرگومان می تواند نه تنها یک مقدار ثابت، بلکه یک متغیر یا یک عبارت حسابی باشد.< /span>< /span>

متغیرهای محلی و جهانی
اغلب لازم است از متغیرهای اضافی استفاده شود که فقط در زیربرنامه استفاده می شوند. چنین متغیرهایی محلی (یا محلی) نامیده می شوند و فقط می توانند در زیر برنامه ای که در آن ایجاد شده اند دستکاری شوند.
 
محدوده متغیر محلی بلوک پرانتزی مجعدی است که در آن تعریف شده است.
برنامه اصلی در سی شارپ نیز یک برنامه فرعی است، بنابراین همه متغیرهای اعلام شده در void Main() متغیرهای محلی هستند. ساير برنامه‌هاي فرعي چيزي درباره متغيرهاي محلي ساير برنامه‌ها نمي‌دانند.

بنابراین، می توان دامنه (حوزه) یک متغیر را فقط به زیربرنامه ای که واقعاً مورد نیاز است محدود کرد. در برنامه نویسی به این تکنیکencapsulation  - پنهان کردن متغیر از تغییر آن از بیرون.

اگر لازم باشد متغیری را تعریف کنیم که در هر نقطه از برنامه (در هر زیربرنامه) قابل مشاهده باشد، چنین متغیرهایی خارج از همه زیربرنامه ها اعلام می شوند (برنامه 3 را از جدول زیر ببینید).
چنین متغیرهایی جهانی نامیده می شوند.

در سی شارپ، وقتی برنامه شروع می شود، همه متغیرهای سراسری به طور خودکار روی صفر تنظیم می شوند (متغیرهای بولی مقدار false را می گیرند).

تجزیه و تحلیل سه برنامه: <بدن>
1) در این برنامه متغیر i محلی است. یک متغیر محلی در داخل یک زیربرنامه اعلان می شود. 2) در اینجا، حتی اگر یک متغیر i در برنامه اصلی (با مقدار 7) وجود داشته باشد، یک متغیر محلی جدید i با مقدار 5 ایجاد می شود. 
هنگامی که این برنامه اجرا می شود، مقدار 75 روی صفحه ظاهر می شود.
3) این برنامه دارای یک متغیر سراسری i است. مقدار آن را می توان در داخل زیربرنامه، و در داخل برنامه اصلی تغییر داد.
این رویه با متغیر سراسری i کار می کند و مقدار جدیدی برابر با 2 به آن اختصاص داده می شود. مقدار 2 نمایش داده می شود.
آزمون خلأ استاتیک () {   int i = 5; Console.Write("i"); } آزمون خلأ استاتیک () {   int i = 5;   Console.Write("i"); } استاتیک void Main() { int i = 7;   Console.Write("i");   تست()؛ } با استفاده از سیستم؛ برنامه کلاس { int i; آزمون خلأ استاتیک () {   i = 2; } استاتیک void Main() { تست()؛ Console.Write("i"); } }

وظیفه
روشی بنویسید که مقادیر دو متغیر را تعویض کند.

ویژگی این کار این است که ما به تغییرات ایجاد شده در رویه نیاز داریم تا برای برنامه فراخوانی شناخته شود.

بیایید سعی کنیم روال را به این صورت بنویسیم: جابجایی خالی استاتیک (int a، int b) // با چنین توصیفی از پارامترهای رویه، { // مقادیر آرگومان ها را کپی می کند (x و y) int c; // متغیرهای a و b متغیرهای مستقلی هستند که به x و y مرتبط نیستند c = a; a = b; b=c; } استاتیک void Main() { int x=1, y=2; مبادله (x, y); //مقادیر متغیرهای x و y (آگومان ها) در پارامترهای a و b، x = 1، y = 2 کپی می شوند. } اگر این برنامه را اجرا کنید، می بینید که مقادیر متغیرهای x و y تغییر نکرده اند. برای اینکه پارامترها مقادیر آرگومان ها را تغییر دهند، باید از انتقال داده با مرجع استفاده کنید. . void Swap ( ref int a, ref int b ) // اکنون متغیرهای a و b آدرس متغیرهای x و y را در حافظه دریافت می کنند { int c; c = a; a = b; b=c; } استاتیک void Main() {   int x=1, y=2;   مبادله (ref x، ref y); کاربرد: اگر یک آرگومان را با مرجع ارسال کنید، آنگاه فقط نام متغیر (نه یک عدد و نه یک عبارت حسابی) می تواند در این مکان هنگام فراخوانی رویه قرار گیرد.

شما نمی توانید رویه ای مانند این را فراخوانی کنید: <پیش> مبادله (x, 4); مبادله (5+x، y)؛