الروتين الفرعي: الإجراءات والوظائف - 1


روتين فرعي هو جزء منفصل من برنامج له اسم ويقوم بحل مهمة منفصلة خاصة به. يقع الروتين الفرعي في بداية البرنامج الرئيسي ويمكن إطلاقه (استدعاؤه) من البرنامج الرئيسي بتحديد الاسم.

يتيح لك استخدام الإجراءات الفرعية تجنب تكرار الكود إذا كنت بحاجة إلى كتابة نفس الرمز في برامج أماكن مختلفة . & نبسب ؛
تتكون المكتبات التي يتم استيرادها إلى برنامج (على سبيل المثال ، النظام ) من إجراءات قام شخص ما بتجميعها بالفعل. لا يتعين على المبرمجين التفكير في الخوارزميات التي يتم تنفيذها فيها ، فهم يطبقونها فقط ، ويفكرون فقط في ما يفعلونه بالضبط. هذا هو توفير كبير للوقت. ليست هناك حاجة لكتابة خوارزمية سبق أن كتبها شخص آخر.

كل روتين فرعي & nbsp؛ يجب أن يقوم بمهمة واحدة فقط ، إما حساب شيء ما ، أو إخراج بعض البيانات ، أو القيام بشيء آخر. & nbsp؛

الطرق الفرعية ، أو الطرق ، من نوعين - & nbsp ؛ وظائف (تلك التي تُرجع نتيجة العمل) & nbsp ؛ و الإجراءات (تلك التي لا تُرجع).

لنبدأ بالنوع الثاني. لنحاول كتابة مثال بسيط.
لنفترض أننا بحاجة إلى عرض السلسلة "خطأ" على الشاشة في كل مرة يمكن أن يحدث خطأ في الكود بسبب خطأ من المستخدم (على سبيل المثال ، عندما يقوم بإدخال بيانات غير صحيحة).
يمكن القيام بذلك عن طريق كتابة البيان
<قبل> Console.WriteLine (& quot؛ Error & quot؛)؛ الآن دعنا نتخيل أن هذا السطر يحتاج إلى إدراجه في العديد من الأماكن في البرنامج. بالطبع ، يمكنك كتابتها في كل مكان. لكن هذا الحل له عيبان.
1) سيتم تخزين هذه السلسلة في الذاكرة عدة مرات ؛
2) إذا أردنا تغيير الناتج عند الخطأ ، فسيتعين علينا تغيير هذا الخط في جميع أنحاء البرنامج ، وهو أمر غير مريح إلى حد ما.

في مثل هذه الحالات ، هناك حاجة إلى أساليب وإجراءات.
قد يبدو البرنامج الذي يحتوي على إجراء على النحو التالي:

using System؛
classProgram {
نبسب ؛ نبسب ؛ PrintError () باطل ثابت {
نبسب ؛ نبسب ؛ نبسب ؛ نبسب ؛ Console.WriteLine (& quot؛ Error & quot؛)؛
نبسب ؛ نبسب ؛ }
نبسب ؛ نبسب ؛ فراغ ثابت رئيسي () {
نبسب ؛ نبسب ؛ نبسب ؛ نبسب ؛ PrintError () ؛
نبسب ؛ نبسب ؛ }
}

على & nbsp؛

يبدأ الإجراء بالكلمة & nbsp؛ void . & nbsp؛ بعد اسم الإجراء & nbsp ؛ تتم كتابة الأقواس الفارغة.
يتم وضع مسافة بادئة لجميع العبارات التي يتم تنفيذها في إجراء. & nbsp؛
يعني المُعدِّل Static & nbsp؛ أن الحقل أو الطريقة أو الخاصية المعينة لن تنتمي إلى كل كائن في الفصل ، ولكن تنتمي جميعها معًا.
تتم كتابة الأساليب والإجراءات قبل الطريقة الرئيسية M ain () .

للإشارة إلى إجراء ، في البرنامج الرئيسي ، تحتاج إلى تسميته & nbsp ؛ بالاسم ولا تنس كتابة الأقواس.
يمكنك استدعاء إجراء & nbsp؛ في برنامج أي عدد من المرات.

الآن دعنا نتخيل أننا بحاجة إلى عرض رسائل مختلفة ردًا على خطأ المستخدم ، اعتمادًا على ما إذا كان بالضبط ما الخطأ الذي ارتكبه.
في هذه الحالة ، يمكنك كتابة الإجراء الخاص بك لكل خطأ: & nbsp؛

نبسب ؛

printErrorZero () باطلة { على & nbsp ؛ على & nbsp ؛ على & nbsp ؛ Console.WriteLine ("خطأ. قسمة على صفر!")؛ }

نبسب ؛

نبسب ؛

<قبل> void printErrorInput () { Console.WriteLine ("خطأ في الإدخال!")؛ } ماذا لو كان هناك العديد من الأخطاء المحتملة؟ ثم هذا الحل لن يناسبنا.
نحتاج إلى معرفة كيفية التحكم في الإجراء من خلال إخباره برسالة الخطأ التي سيتم عرضها.
للقيام بذلك ، نحتاج إلى معلمات نكتبها بين قوسين بعد اسم الإجراء
<قبل> خطأ طباعة باطل (سلاسل) { Console.WriteLine (ق) ؛ } في هذا الإجراء ، s هي معلمة - متغير خاص يسمح بالتحكم في الإجراء.
المعلمة هي متغير تعتمد قيمته على تشغيل الروتين الفرعي. يتم سرد أسماء المعلمات مفصولة بفواصل في عنوان البرنامج الفرعي. نوع المعلمة مكتوب قبل المعلمة.

الآن ، عند استدعاء الإجراء ، تحتاج إلى تحديد القيمة الفعلية بين قوسين سيتم تعيينها إلى المعلمة ( المتغير s ) داخل إجراءاتنا <قبل> printError ("Error! Division by zero!")؛ تسمى هذه القيمة الوسيطة.
الوسيطة هي قيمة المعلمة التي يتم تمريرها إلى الروتين الفرعي عندما يتم استدعاؤها.
لا يمكن أن تكون الوسيطة قيمة ثابتة فحسب ، بل أيضًا متغيرًا أو تعبيرًا حسابيًا. < / span>

المتغيرات المحلية والعالمية غالبًا ما يكون من الضروري استخدام متغيرات إضافية سيتم استخدامها فقط في الروتين الفرعي. تسمى هذه المتغيرات محلية (أو محلية) ولا يمكن معالجتها إلا ضمن الروتين الفرعي الذي تم إنشاؤها فيه.
نبسب ؛
نطاق المتغير المحلي هو الكتلة المتعرجة بين قوسين والتي تم التصريح بداخلها.
البرنامج الرئيسي في C # هو أيضًا روتين فرعي ، لذا فإن جميع المتغيرات المعلنة داخل void Main () هي متغيرات محلية . لا تعرف الإجراءات الفرعية الأخرى أي شيء عن المتغيرات المحلية للروتينات الفرعية الأخرى.

وبالتالي ، من الممكن قصر نطاق (نطاق) المتغير فقط على الروتين الفرعي حيث يكون مطلوبًا بالفعل. في البرمجة ، تسمى هذه التقنية encapsulation & nbsp؛ - إخفاء المتغير من تغييره من الخارج.

إذا كان من الضروري التصريح عن متغير يكون مرئيًا في أي مكان في البرنامج (في أي روتين فرعي) ، فسيتم الإعلان عن هذه المتغيرات خارج جميع الإجراءات الفرعية (انظر البرنامج 3 من الجدول أدناه).
تسمى هذه المتغيرات عمومية .

في C # ، عندما يبدأ البرنامج ، يتم تعيين جميع المتغيرات العامة تلقائيًا على الصفر (تأخذ المتغيرات المنطقية القيمة false).

حلل ثلاثة برامج: <الجسم>
1) في هذا البرنامج ، المتغير i محلي. يتم التصريح عن متغير محلي داخل روتين فرعي. 2) هنا ، حتى لو كان هناك متغير i في البرنامج الرئيسي (بقيمة 7) ، سيتم إنشاء متغير محلي جديد i بقيمة 5. & nbsp؛
عند تنفيذ هذا البرنامج ، ستظهر القيمة 75 على الشاشة.
3) يحتوي هذا البرنامج على متغير عام i. يمكن تغيير قيمته داخل الروتين الفرعي وداخل البرنامج الرئيسي.
سيعمل الإجراء مع المتغير العام i وسيتم تعيين قيمة جديدة له تساوي 2. يتم عرض القيمة 2.
اختبار الفراغ الثابت () { نبسب ؛ int أنا = 5 ؛ Console.Write (& quot ؛ أنا & quot ؛) ؛ } اختبار الفراغ الثابت () { نبسب ؛ int أنا = 5 ؛ نبسب ؛ Console.Write (& quot ؛ أنا & quot ؛) ؛ } فراغ ثابت رئيسي () { int أنا = 7 ؛ نبسب ؛ Console.Write (& quot ؛ أنا & quot ؛) ؛ نبسب ؛ امتحان()؛ } باستخدام النظام ؛ برنامج الفصل { إنت أنا اختبار الفراغ الثابت () { نبسب ؛ أنا = 2 ؛ } فراغ ثابت رئيسي () { امتحان()؛ Console.Write (& quot ؛ أنا & quot ؛) ؛ } }

مهمة اكتب إجراء يتبادل قيم متغيرين.

خصوصية هذه المهمة هي أننا نحتاج إلى التغييرات التي تم إجراؤها في الإجراء حتى تصبح معروفة للبرنامج المتصل.

دعنا نحاول كتابة الإجراء مثل هذا: تبديل الفراغ الثابت (int a، int b) // مع هذا الوصف لمعلمات الإجراء ، {// سينسخ قيم الوسيطات (س وص) كثافة العمليات ج ؛ // المتغيرات a و b هي متغيرات مستقلة لا علاقة لها بـ x و y ج = أ ؛ أ = ب ؛ ب = ج ؛ } فراغ ثابت رئيسي () { int س = 1 ، ص = 2 ؛ المبادلة (س ، ص) ؛ // قيم المتغيرات x و y (الوسائط) يتم نسخها إلى المعلمات a و b ، x = 1 ، y = 2 } إذا قمت بتشغيل هذا البرنامج ، يمكنك أن ترى أن قيم متغيري x و y لم تتغير. لكي تغير المعلمات قيم الوسيطات ، يجب عليك استخدام البيانات المارة حسب المرجع. & nbsp ؛ للقيام بذلك ، قبل اسم نوع البيانات في رأس الروتين الفرعي ، يجب عليك كتابة المرجع . مبادلة باطلة (المرجع int a ، المرجع int b) // الآن المتغيرات a و b تحصل على عناوين المتغيرات x و y في الذاكرة { كثافة العمليات ج ؛ ج = أ ؛ أ = ب ؛ ب = ج ؛ } فراغ ثابت رئيسي () { نبسب ؛ int س = 1 ، ص = 2 ؛ نبسب ؛ المبادلة (المرجع x ، المرجع y) ؛ التطبيق: إذا قمت بتمرير وسيطة من خلال المرجع ، فعندئذٍ فقط اسم المتغير (ليس رقمًا وليس تعبيرًا حسابيًا) يمكن أن يقف في هذا المكان عند استدعاء الإجراء.

لا يمكنك استدعاء إجراء مثل هذا: <قبل> المبادلة (× ، 4) ؛ المبادلة (5 + س ، ص) ؛