أساسيات البرمجة بلغة السي شارب · الفصل 11 — العمليات الساكنة والدوالפעולות ופונקציות · יסודות התכנות בשפת C#‎⌂📚🏠
الفصل 11

العمليات الساكنة والدوال

פעולות ופונקציות

11.1 مقدمة عامة للعمليات والدوال – מבוא כללי לפעולות ולפונקציות

نستعرض بعض العمليات (الدوال) التي لكل منها اسم، مُدخلات ومُخرج.

(أسماء العمليات والمُتغيرات تم اختيارها بشكل اختياري وهي بمثابة أمثلة)

(1) عملية التربيع: F(x) = x2

F(x) = x2تربيعxx239

(2) عملية المُعدل: avg(x,y)=(x+y)/2

avg(x,y)=x+y2المُعدلxy42(x+y)23

(3) عملية القيمة الصُغرى: H(x,y,z) = Min(x,y,z)

H(x,y,z) = Min(x,y,z)القيمةالصغرى2x0.5y1zMin(x,y,z)0.5

11.2 العمليات في البرمجة – הפעולות בתכנות

العملية (פעולה/Method): هي مقطع برمجي كامل له اسم ويعمل لأجل هدف مُحدد.

العملية يمكنها الحصول على قيم مُعينة تسمى بارامترات (بمثابة المُدخلات) ويمكنها أن تُعطي نتيجة (تُعيد نتيجة بمثابة مُخرج). هذا المقطع من الأوامر يمكن تسميته أيضا دالة (פונקציה). كما أننا نستطيع النداء للعملية (استدعاء) من أي مكان نريد خلال برنامجنا.

ملاحظات:

أنواع العمليات الثابتة:

(a) مثال على عمليات لا تأخذ مُدخلات ولا تعيد مُخرجات:

عملية عند استدعائها تطبع على الشاشة سطرين من النجوم. مثلا نطلق عليها اسم stars.

هذه العملية ليس لها أي مُدخلات وليس لها أي قيمة مُعادة (لا تُعيد قيمة) ولكنها عندما نستدعيها تطبع على الشاشة سطرين من النجوم.

stars

سنتعلم لاحقا كيف نبنيها، ولكننا الان نفرض أننا أنشأناها وسنرى كيف تعمل عند استدعائها.

مثلا إذا أردنا ان نبني برنامج يطبع اسمنا بين أسطر النجوم نكتب ما يلي:

static void Main(string[] args)
{
  stars();
  Console.WriteLine("Hammam");
  stars();
}

وستكون النتيجة على الشاشة ما يلي:

Microsoft Visual Studio Debug Console
***********
***********
Hammam
***********
***********

(b) مثال على عمليات لا تأخذ مُدخلات وتعيد مُخرجات:

عملية "القاء حجر النرد"، مثلا نطلق عليها اسم nrd .

هذه العملية ليس لها أي مُدخلات ولكنها تُعيد قيمة (لها قيمة مُعادة)، عندما نستدعيها تعطينا قيمة مُعادة هي رقم عشوائي من المجموعة التالية (1,2,3,4,5,6)

nrdرقم صحيح عشوائيمن 1 حتى 6القاء مكعب نرد

عند استدعاء هذه العملية (تشغيل العملية) نحصل على قيمة صحيحة من 1 حتى 6 (يشمل 1 و 6)

مثلا عند استدعائها نحصل على الرقم 6 وعند استدعائها مرة أخرى نحصل على 2 وهكذا....

(c) مثال على عمليات تأخذ مُدخلات ولا تُعيد مُخرجات:

عملية تستقبل رقم صحيح (مُدخل) وتقوم بطباعة الكلمة Hi على الشاشة مكررة عددا من المرات حسب الرقم الصحيح المُدخل الى هذه العملية. مثلا نطلق على هذه العملية الاسم y

yمُدخل عددصحيح

مثال:

3y(3)العملية y لن تُعيد قيمةولكنها ستطبع على الشاشةكلمة Hi 3 مرات كما يلي:HiHiHi

مثال على استدعاء وتشغيل هذه العملية (العملية y) ضمن برنامج:

static void Main(string[] args)
{
    int n = 2;
    y(3);
    Console.WriteLine("##########");
    y(n);
}

سيتم طباعة ما يلي على الشاشة:

C:\Users\Hammam\source\repos
Hi
Hi
Hi
##########
Hi
Hi

مثال آخر:

عملية انتظار (השהייה – delay) نسميها delay ونبنيها مثلا بحيث تأخذ بمُدخلاتها رقماً يُعبر عن مدة الانتظار بوحدات ميلي ثانية والعملية تستغرق هذه المُدة حتى ينتقل الحاسوب لتنفيذ الأمر الذي يلي هذه العملية.

هذه العملية لا تُعيد قيمة.

tdelay( t )عملية لا تُعيد قيمة عنداستدعائها، بل تسببانتظار للحاسوب بالمُدةالزمنية المُدخلة إليها.

(d) مثال على عمليات تأخذ مُدخلات وتُعيد مُخرجات:

عملية تستقبل رقم عشري وتُعيد قيمته المُطلقة، نُسميها absolute. هذه العملية تأخذ رقما عشرياً في مُدخلاتها وتُعيد رقماً عشريا في مُخرجاتها الذي هو القيمة المُطلقة للرقم من المُدخل.

xabsolute(x)|x|

مثلا:

-2.5absolute(x)2.5
absolute(4.8) => 4.8
absolute(-9) =>9
absolute(0)=> 0

سنبني برنامج فيه استدعاء للطريقة absolute :

static void Main(string[] args)
{
    double x = 2.5, y= -7;
    double res;
    res = absolute(-6);
    Console.WriteLine("res={0}",res);
    res = absolute(x);
    Console.WriteLine("res={0}", res);
    Console.WriteLine("result is: {0}",absolute(y));
    Console.ReadLine();
}

النتيجة ستكون ما يلي:

C:\Users\Hammam\source\repos
res=6
res=2.5
result is: 7

بعد أن فهمنا ما هي الأنواع الممكنة للعمليات الثابتة سنتعلم كيف يمكننا بناء وإنشاء هذه العمليات.

11.3 بناء العملية – בניית הפעולה

نبني العملية خارج إطار العملية الرئيسية Main ويجب أن تحتوي على ما يلي:

لكل عملية يتوجب علينا تحديد ما يلي:

  1. نوع البيانات (טיפוס) التي تعيدها هذه العملية.
  2. اسم العملية.
  3. نوع البيانات (טיפוס) التي تحصل عليها هذه العملية واسم المُتغيرات التي تُخزن فيها هذه البيانات من المُدخلات.
  4. جسم ومبنى العملية (أوامر العملية).
  5. إذا كانت هناك قيمة تُعيدها هذه العملية يجب أن يكون هناك أمر return (إعادة) لهذه القيمة داخل جسم ومبنى العملية.
(1)(2)(3)staticنوع البياناتالمُعادةاسم العملية(نوع البياناتالمُدخلة){جسم ومبنى العملية(أوامر العملية)(4)(5)returnالقيمة التي تُعيدهاهذه العملية;}
الكلمة المحفوظة static تعني أن العملية تتبع للفئة (لفئة عامة معينة) ولا تتبع لكائن مُعين، حيث نستطيع استعمالها وتشغيلها واستدعاءها بدون ان تكون تابعة لكائن (لا يشغلها كائن بواسطة العملية نقطة dot).

مثال: نبني عملية تربيع للأعداد الصحيحة (الرفع للقوة 2):

العملية تستقبل رقم صحيح نضعه بين الأقواس وترفعه للقوة 2 (أي تُعيد تربيعه).

static int Pow2(int x)
{
    return x * x;
}

(1) نوع البيانات المُعادة:

هو عبارة عن نوع البيانات التي تُعيدها العملية لمن استدعى هذه العملية وشغلها. نوع البيانات المُعادة يمكن أن يكون: int, double, char , string , int[] , bool , char[] ...

اذا كانت هذه العملية لا تُعيد قيمة فإننا نضع نوع البيانات void .

(2) اسم العملية:

هو الاسم الذي نكتبه لكي نستدعي العملية ونُشغلها. يجب أن لا يبدأ اسم العملية برقم، ويُمنع أن يحتوي رموزا عدا الخط السفلي _ ويُمنع أن يكون اسم العملية احدى كلمات اللغة المحفوظة.

العملية تعمل من كل مكان يكون فيه ظهور اسمها (حيث يتم استدعائها) ومن الجدير بالذكر أنها لا تعمل في المكان الذي فيه تعريفها.

(3) نوع البيانات المُدخلة:

البرامترات التي تحصل عليها العملية وهي متغيرات يتم تعريف نوعها. يجب اختيار اسم البرامتر ونوعه، وعند استدعاء العملية يتم ارسال قيم يتم وضعها داخل هذه البرامترات. العملية تستطيع أن تحصل على برامتر واحد، اثنان، ثلاثة أو أكثر ....

مثلا:

static void example (int num, double avg, int[] arr, string name)
{

}

اذا كانت العملية لا تأخذ قيماً فإننا لا نكتب أي شي داخل الأقواس ويكون فارغا ( ) .

(4) جسم ومبنى العملية (أوامر العملية):

جسم العملية هو أسطر من البرمجة وأوامر سي شارب (كود)، هذه الأسطر تنفذها العملية في حال تم استدعاء العملية.

نستطيع كتابة كل شيء في جسم العملية (أوامر تكرار، مصفوفات، نعرف مُتغيرات، طباعة، استقبال قيم، عمليات، حسابات، استدعاء عملية أخرى من داخل هذه العملية، وحتى يمكننا استدعاء العملية نفسها من داخل هذه العملية حيث تستدعي نفسها).

(5) الأمر return والقيمة التي تُعيدها العملية:

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

القيمة المُعادة بعد return يجب أن تكون ملائمة لنوع القيمة المُعادة الذي تم تعريفه قبل اسم العملية.

مثال:

اكتب عملية (دالة) التي تحصل على 3 أرقام صحيحة وتُعيد مُعدل هذه الأرقام

static double Avg3(int x, int y, int z)
{
    double avg;
    avg = (double)(x + y + z) / 3;
    return avg;
}

وبكتابة مُختصرة يمكن كتابة ما يلي:

static double Avg3(int x, int y, int z)
{
    return (double)(x+y+z)/3;
}

ملاحظات مهمة:

  1. كل مُتغير يتم تعريفه داخل العملية (الدالة) يكون موجوداً فقط داخل العملية ولا يُمكن استخدامه خارج هذه العملية (لأنه غير معرف خارجها).
  2. يمكن تعريف واستخدام نفس اسم المُتغير في عدة عمليات (لأنه يكون في كل عملية المُتغير مُختلف ولا علاقة له مع باقي المُتغيرات التي تحمل نفس اسمه لكن بعمليات أخرى) وذلك للسبب المذكور بالبند السابق (بند 1)
  3. عند استدعاء عملية لكي نُشغلها يجب أن نكتب اسمها وأن نُرسل لها البارامترات المطلوبة في مُدخلاتها بشكل يلائم نوع هذه البارامترات وحسب نفس عدد وترتيب تعريف هذه البارامترات.

11.4 تشغيل العمليات واستعمالها ضمن البرنامج الرئيسي Main – הפעלת הפעולות ושימוש בהן בתוך Main

بعد ان تعلمنا أن نبني العمليات، نستطيع أن نستعملها ونستدعيها (أن نشغلها) ضمن برنامج Main حيث تقوم بأداء وظيفتها. فمثلا إذا أردنا تشغيل عملية كتبناها مسبقا يجب أن نستدعيها وذلك بكتابة اسمها وارسال البارامترات المطلوبة لها (مُدخلاتها).

مثال:

static int Pow2(int x)
{
    return x * x;
}
static void Main(string[] args)
{
    int x, y, z;
    x = Pow2(4);     // x = 16
    z = Pow2(-3);    // z = 9
    y = Pow2(z);     // y = 81
    Console.WriteLine("{0}", Pow2(2)); // سيتم طباعة 4
    Console.WriteLine(Pow2(-5));       // سيتم طباعة 25
}

مثال:

(أ) عرف عملية تحصل على رمز ورقم صحيح وتُعيد الرمز الذي رقمه التسلسلي أكبر من الرمز الذي استقبلته هذه العملية بمقدار الرقم الصحيح الذي استقبلته.

'A'3Nxtchr'D'
'e'1Nxtchr'f'
static char Nxtchr(char x, int n)
{
    char newtav;
    newtav = (char)((x + n) % 128);   // %128 is for cycling
    return newtav;
}

(ب) اكتب برنامج Main يستخدم العملية Nxtchr لكي يستقبل اسم مستخدم (user name) ويطبع على الشاشة اسم مستخدم جديد مطابق للاسم الذي استقبله ولكن الحرف الأول في المستخدم الجديد هي ليست الحرف الأصلية ولكن الحرف التي تليها مباشرة

أمثله: اذا استقبلنا Karem نطبع Larem ، أما اذا استقبلنا Abed نطبع Bbed ، أما اذا استقبلنا Samir نطبع Tamir وأما اذا استقبلنا rb7i نطبع sb7i

static void Main(string[] args)
{
    string name;
    Console.Write("Insert your name: ");
    name = Console.ReadLine();
    name = Nxtchr(name[0], 1) + name.Substring(1, name.Length - 1);
    Console.WriteLine("your new name is: {0}",name);
}
C:\Windows\system32\cmd.exe
Insert your name: rb7i
your new name is: sb7i
Press any key to continue . . .
قوانين وتنبيهات:
  • استدعاء عملية يتطلب منا أن نكتب اسمها كما تم تعريفها، وأن نرسل لها البارامترات المطلوبة بالترتيب المُحدد حسب تعريف تلقيها للبارامترات وبنفس كمية (عدد) البارامترات.
  • إذا كانت العملية تُعيد قيمة مُعينة ونريد أن نحفظ هذه القيمة علينا تخزينها بمُتغير يُلائم نوع القيمة المُعادة.
  • على نوع البارامترات المُرسلة للعملية عند استدعائها أن يكون مطابقا للنوع الذي تم تعريفه عند استقباله كبارامتر بين الأقواس عند تعريف العملية.

11.5 تطبيق وأمثلة لبناء العمليات من الأنواع المُختلفة واستدعائها – יישום ודוגמאות לבניית פעולות מן הסוגים השונים ולקריאה להן

(a) عمليات لا تأخذ مُدخلات ولا تعيد مُخرجات:

كمثال أولي يمكننا ان نعتبر العملية الرئيسية التي كنا نكتبها وتعاملنا معها سابقا عملية لا تأخذ مُدخلات ولا تُعيد مُخرجات

static void Main( )
{
   Console.WriteLine("Hello everyone");
}

عملية لها اسم وهو Main وهي العملية الرئيسية ولا تُعيد قيمة (void) وهي فقط تطبع على الشاشة الجملة التالية: Hello everyone

مثال:

نبني عملية تطبع على الشاشة اطاراً من النجوم فيه مكتوب Program By: Hammam كختم نستطيع استعماله في البرنامج الرئيسي. أي تطبع على الشاشة ما يلي:

*********************************************
***********   Program By: Hammam. ***********
*********************************************

نُسمى العملية stamp وهي عملية لا تأخذ مُدخلات (لا تأخذ بيانات) ولا تُعيد قيمة.

نبنيها على النحو التالي:

static void stamp( )
{
    Console.WriteLine("*********************************************");
    Console.WriteLine("***********   Program By: Hammam. ***********");
    Console.WriteLine("*********************************************");
}

الان نستطيع كلما أردنا وضع هذا الإطار على الشاشة ضمن برمجتنا أن نستدعي العملية. نستدعي العملية ضمن برنامجنا الرئيسي Main.

مثال على استدعاء العملية ضمن برنامج Main كالتالي:

static void Main( )
{
    stamp();
    int x = 3;
    Console.WriteLine("our program is here ....");
    Console.WriteLine(x+2);
    stamp();
}

نتيجة تشغيل عملية Main هي ما يلي:

C:\Users\Hammam\source\repos\ConsoleApp44\ConsoleApp44\bin\Debug\netcoreapp3.1\ConsoleApp44.exe
*********************************************
***********   Program By: Hammam. ***********
*********************************************
our program is here ....
5
*********************************************
***********   Program By: Hammam. ***********
*********************************************

(b) عمليات لا تأخذ مُدخلات وتعيد مُخرجات:

نبني عملية "القاء حجر نرد" وهي عملية لا تأخذ مُدخلات ولكنها تُعيد لنا قيمة (تُعطي مُخرج) وهو رقم عشوائي من 1 الى 6. نطلق عليها مثلا اسم zhr (من كلمة حجر الزهر).

مبنى العملية هو:

static int zhr( )
{
    int n;
    Random rnd = new Random();
    n = rnd.Next(1, 7);
    return n;
}

نكتب هذه العملية كعملية مستقلة خارج برنامجنا الرئيسي Main وليس داخله.

الان نستطيع كلما اردنا القاء حجر نرد والحصول على رقم عشوائي من 1-6 أن نستدعي عملية zhr() دون أن نعطيها مُدخلات (ليس لها مُدخلات).

مثال:

static void Main( )
{
    int n;
    Console.Write("First attempt: ");
    n = zhr();
    Console.WriteLine(n);
    Console.Write("Second attempt: ");
    Console.WriteLine(zhr());
}

النتيجة ستكون:

C:\Users\Hammam\source\repos
First attempt: 1
Second attempt: 3

(c) عمليات تأخذ مُدخلات ولا تُعيد مُخرجات:

نبني عملية تحصل على رقمين صحيحين وتطبع هذين الرقمين بينهما الرمز &

class Program
{
    static void PrntWithTav(int x, int y)
    {
        Console.WriteLine("{0}&{1}", x, y);
    }

    static void Main(string[] args)
    {
        PrntWithTav(7, -4);
    }
}
C:\Windows\system32\cmd.exe
7&-4
Press any key to continue . . .

(d) عمليات تأخذ مُدخلات وتُعيد مُخرجات:

مثلا إذا بنينا العملية القيمة المطلقة ونسميها Absolute تأخذ رقما عشريا وتعيد القيمة المطلقة لهذا الرقم.

Absolute(x) تُعيد القيمة المُطلقة (عدد موجب) للرقم العشري x .

num = Absolute(3);      =>   num = 3
num = Absolute(-7.3);   =>   num = 7.3

يجب تعريف نوع (טיפוס) القيمة التي تُعيدها العملية (int, double, char, …) ولكن هنا العملية تُعيد عدد عشري (double) لأنها تستقبل عددا عشريا.

العملية Absolute نبنيها على النحو التالي:

static double Absolute(double x)
{
    if (x >= 0)
        return x;
    else
        return -x;
}

يمكن تشغيلها على النحو التالي:

static void Main(string[] args)
{
    Console.WriteLine(Absolute(-4));
}
C:\Windows\system32\cmd.exe
4
Press any key to continue . . .

تمرين:

نبني العملية التالية:

static int Elakbr(int x, int y)
{
    if (x > y)
        return x;   // it returns x because x is bigger
    else
        return y;   // it returns y because y is bigger or equal
}

إذا أردنا استعمال هذه العملية (الدالة) واستدعاها بواسطة البرنامج التالي:

static void Main(string[] args)
{
    Console.WriteLine("***");
    Elakbr(3, 6);               // it returns 6
    Console.WriteLine("+++");
    Elakbr(-1, -11);            // it returns -1
}

ماذا سيظهر على الشاشة بعد تشغيل البرنامج Main ؟

النتيجة التي ستظهر على الشاشة هي:

C:\Windows\system32\cmd.exe
***
+++
Press any key to continue . . .

وذلك لأننا لم نستعمل القيمة التي تمت اعادتها من العملية، حيث لم نطبعها ولا حفظناها في مُتغير.

أما إذا أردنا استعمال القيمة المُعادة من العملية يمكننا التعديل على البرنامج على النحو التالي:

static void Main(string[] args)
{
    int num;
    Console.WriteLine("***");
    num = Elakbr(3, 6);         // it returns 6
    Console.WriteLine(num);
    Console.WriteLine("+++");
    num = Elakbr(-1, -11);      // it returns -1
    num += 10;
    Console.WriteLine(num);
}

الان ما هي نتيجة تشغيل البرنامج؟

النتيجة هي:

C:\Windows\system32\cmd.exe
***
6
+++
9
Press any key to continue . . .

11.6 عمليات ودوال تتعامل مع المصفوفات والجمل النصية – פעולות ופונקציות שמטפלות במערכים ובמחרוזות

11.6.1 العمليات والمصفوفات – הפעולות והמערכים

يمكننا ارسال المصفوفة للعملية كبارامتر كما أنه يمكننا أن نُعيد مصفوفة كناتج تفعيل العملية.

لإرسال المصفوفة كبارامتر علينا ان نضع نوع المصفوفة واسم البارامتر (اسم المصفوفة في العملية) في أقواس البارامترات المُتلقاه بواسطة العملية، مثلا اذا كانت العملية Example ستأخذ مصفوفة كبارامتر ولن تعيد أي قيمة سنكتبها على النحو التالي:

static void Example(int[] arr)
 {
     //هنا نكتب مبنى العملية
 }

نتذكر أننا دائما نستطيع معرفة طول المصفوفة بواسطة استعمال اسمها والعملية Length مثلا arr.Length سيكون عدد خانات المصفوفة arr (طولها).

يمكننا أن نجري عمليات على المصفوفات وأن تُعيد هذه العمليات قيما ويمكن أن تكون القيمة المُعادة مصفوفة أيضا، مثلا العملية Example تُعيد مصفوفة (نفترض لا تأخذ أي بارامترات رغم انه نستطيع أن نعرفها كعملية تأخذ بارامترات عند الحاجة) وستكون على النحو التالي:

static int[] Example()
 {
     int[] msfofa = new int[10];
     //هنا نكتب مبنى العملية
     return msfofa;
 }

كما يظهر لدينا على المصفوفة التي تعيدها العملية أن تكون موجودة (اما تتلقاها كبارامتر أو يتم تعريفها داخل العملية) ثم نستخدم أمر إعادة القيمة ونرسل المصفوفة بواسطة اسمها.

قانون: يتم ارسال المصفوفات (كذلك ارجاعها) بواسطة استخدام اسمها فقط.

بالمثال رأينا مصفوفات من نوع عدد صحيح int [ ] ولكننا كنا نستطيع ان نجعل العملية تتلقى أي نوع من المصفوفات double [ ] و char [ ] الخ .. وكذلك بالنسبة للمصفوفة المُعادة يمكن أن تكون أي نوع مصفوفة.

لفهم الموضوع تطبيقيا سنضع أمثلة على ذلك بالصفحة التالية

11.6.2 العمليات والجمل النصية string – הפעולות והמחרוזות

يمكننا ارسال الجمل النصية للعملية كبارامتر كما أنه يمكننا أن نُعيد جُملة نصية كناتج تفعيل العملية.

يوجد أهمية لاستعمال العمليات بالتعامل مع الجمل النصية في البرمجة. سنرى بالأمثلة بالصفحة التالية عمليات فيها استعمال نوع البيانات جمل نصية.

11.6.3 أمثلة على عمليات ودوال تتعامل مع المصفوفات والجُمل النصية – דוגמאות לפעולות שמטפלות במערכים ובמחרוזות

سنضع أمثله لمسائل فيها عمليات تتعامل مع مصفوفات وجمل نصية ويتم استخدامها في البرنامج الرئيسي Main

مثال 11.1
(أ) اكتب عملية تحصل على مصفوفة أعداد عشرية وتُعيد أكبر رقم في هذه المصفوفة.
static double MaxInArray(double[] nums)
{
    double max = nums[0];
    for(int i=1; i<nums.Length;i++)
    {
        if (nums[i] > max)
            max = nums[i];
    }
    return max;
}

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

static void Main(string[] args)
{
    double[] a = new double[12];
    double max;
    for(int i=0;i<12;i++)
    {
        Console.Write("Insert a number: ");
        a[i] = double.Parse(Console.ReadLine());
    }
    max = MaxInArray(a);
    Console.WriteLine("The maximum in the array is: {0}",max);
}

نتيجة تشغيل البرنامج الرئيسي هي:

C:\Windows\system32\cmd.exe
Insert a number: 11
Insert a number: 4
Insert a number: -2.5
Insert a number: 17.4
Insert a number: 32
Insert a number: -90
Insert a number: 32.7
Insert a number: -70
Insert a number: 1
Insert a number: 0
Insert a number: -1
Insert a number: 2
The maximum in the array is: 32.7
مثال 11.2
(أ) اكتب عملية اسمها BuildArr تستقبل رقم صحيح كبارامتر يمثل عدد حدود فيبوناتشي المرغوبة. على العملية أن تُعيد مصفوفة عدد خاناتها (حجمها) مطابق للرقم الذي تلقته ويكون في كل خانات هذه المصفوفة أرقام متوالية فيبوناتشي. (متوالية فيبوناتشي تعلمناها سابقا في موضوع التكرار والمتواليات).
(ب) اكتب عملية اسمها PrntArr تستقبل مصفوفة وتطبعها على الشاشة.
(ج) استعمل العمليتان من الفرعين السابقيين لكتابة برنامج رئيسي يستقبل من المستخدم رقما صحيحا يمثل عدد حدود فيبوناتشي المرغوب طباعته على الشاشة ويطبع حدود فيبوناتشي المطلوب
using System;
namespace ConsoleApp1
{
    class Program
    {
        static int[] BuildArr(int n)
         {
             int[] fib = new int[n];
             if (n == 1) fib[0] = 1;
             else if (n == 2)
             {
                 fib[0] = 1;
                 fib[1] = 1;
             }
             else
             {
                 fib[0] = 1;
                 fib[1] = 1;

                 for (int i = 2; i < n; i++)
                 {
                     fib[i] = fib[i - 1] + fib[i - 2];
                 }
             }
             return fib;
         }

        static void PrntArr(int[] arr)
        {
            for(int i=0;i<arr.Length;i++)
            {
                Console.Write("{0}|",arr[i]);
            }
            Console.WriteLine();
        }
        static void Main(string[] args)
        {
            int num;
            Console.WriteLine("Insert a number: ");
            num = int.Parse(Console.ReadLine());
            int[] arr = new int[num]; // A
            arr = BuildArr(num);      // B
            PrntArr(arr);             // C
            // we can remove rows A,B,C and use row D
            PrntArr(BuildArr(num));   // D
        }
    }
}
مثال 11.3
(أ) اكتب عملية اسمها Appearance تتلقى رمزا وتتلقى جملة نصية، وعلى هذه العملية أن تُعيد عدد مرات ظهور هذا الرمز في الجملة النصية.
(ب) اكتب برنامج رئيسي Main يستقبل من المستخدم جُملة ورمزاً، وباستخدام العملية من الفرع السابق على البرنامج أن يطبع على الشاشة كم مرة يظهر هذا الرمز من الجملة التي استقبلناها.
(ج) للمُدخلات التالية:
الجملة النصية: Hammam والرمز هو: m
ماذا سيكون نتيجة تشغيل البرنامج؟ ابنِ جدول متابعة.
الحل:
ترقيم أوامر البرنامج في جدول المتابعة: أوامر العملية Appearance مرقمة 1–8، وأوامر Main مرقمة 9–15.
static int Appearance(char tav, string sentence)
{
    int cnt = 0;
    for (int i = 0; i < sentence.Length; i++)
    {
        if (sentence[i] == tav)
            cnt++;
    }
    return cnt;
}
static void Main(string[] args)
{
    string se;
    char c;
    Console.Write("Insert a char: ");
    c = char.Parse(Console.ReadLine());
    Console.Write("Insert a sentence: ");
    se = Console.ReadLine();
    Console.WriteLine("The char {0} appears in {1} {2} times!",c,se,Appearance(c,se));
}
C:\Windows\system32\cmd.exe
Insert a char: m
Insert a sentence: Hammam
The char m appears in Hammam 3 times!

جدول المتابعة في الصفحة التالية.

رقم الأمرsectavsentencecntii<6Sentence[i] == tav
9,10
11,12mInsert a char: m
13,14HammamInsert a sentence: Hammam
15The char m appears in Hammam
15->1mHammam
15->20
15->30
15->4true
15->6false
15->5,41true
15->6false
15->5,42true
15->6true
15->71
15->5,43true
15->6true
15->72
15->5,44true
15->6false
15->5,45true
15->6true
15->73
15->5,46false
15->8
The char m appears in Hammam 3 times!
تمرين 1
(أ) اكتب عملية تتلقى كبارامتر مصفوفتان طولهما 10 خانات تحتويان أرقاماً صحيحة وتتلقى أيضا رقماً صحيحاً num على العملية أن تُعيد المصفوفة التي يتكرر فيها ظهور الرقم num الذي تلقته عددا أكبر من المرات.
(ب) اكتب برنامج رئيسي فيه يتم بناء المصفوفات التالية:
A={90,87,100,98,100,99,75,68,100,92};
B={80,100,93,95,80,58,85,80,75,80};

على البرنامج أن يستقبل من المستخدم رقما ويستخدم العملية من الفرع (أ) للحصول على المصفوفة التي يتكرر فيها الرقم ظهورا اكثر من المرات، ثم اطبع حدود هذه المصفوفة.

تمرين 2
(أ) اكتب عملية تتلقى مصفوفة أرقام صحيحة كبارامتر وتتلقى عدد صحيح كبارامتر. العملية تُعيد عدد مرات ظهور الرقم في خانات المصفوفة.
(ب) اكتب برنامج رئيسي Main يُعرف المصفوفة n والتي تحتوي على الأرقام التالية: {4,-3,4,8,2,-12,16,4,9,2,0} ويستقبل من المُستخدم رقما صحيحا ثم يطبع على الشاشة عدد مرات ظهور الرقم الذي استقبلناه من المُستخدم في المصفوفة وذلك بالاستعانة بالعملية من الفرع السابق.
(ج) اكتب برنامج رئيسي آخر Main يُعرف المصفوفة n والتي تحتوي على أرقاما عشوائية بالمجال 1-6 (نتيجة القاء حجر نرد مثلا) بواسطة استخدام Random ويستقبل من المُستخدم رقما صحيحا ثم يطبع على الشاشة عدد مرات ظهور الرقم الذي استقبلناه من المُستخدم في المصفوفة وذلك بالاستعانة بالعملية من الفرع (أ).

11.7 تلخيص وتمارين محلولة – סיכום ותרגילים פתורים

وأخيرا سنضع مُلخص للقانون:

يجب الإعلان (تعريف) العملية وكتابة أوامرها على النحو التالي:

voidintdoublecharboolint[ ]…القيمة المُعادةstaticاسم العملية(البارامترات التي تحصل عليهاالعملية ونوع هذه البارامترات){جسم العملية.يحتوي على أوامر العملية(الكود)}
تمرين 11.4
(أ) اكتب عملية تحصل على رقمين صحيحين وتُعيد مساحة المستطيل الذي يشكل هذان الرقمان اطوال ضلعاه.
aba*bالمساحة =
static int AreaRec(int a, int b)
{
    int s;
    s = a*b;
    return s;
}

(ب) اكتب عملية تحصل على رقمين صحيحين وتُعيد مساحة المثلث الذي يشكل هذان الرقمان طول القاعدة فيه وطول الارتفاع على هذه القاعدة.

xyx*y2المساحة =
static double AreaTri(int x, int y)
{
    double s;
    s = (x * y) / 2.0;
    return s;
}

(ج) اكتب برنامج يسأل المستخدم مساحة أي يشكل يريد أن يحسب مساحته (مساحة مستطيل أم مساحة مُثلث) وتطلب منه رقمين يمثل كل واحد منهما المُدخلات المطلوبة لحساب المساحة وعلى البرنامج أن يطبع على الشاشة المساحة المطلوبة للشكل.

static void Main(string[] args)
{
    char tav;
    int num1, num2;

    Console.Write("Insert the first number: ");
    num1 = int.Parse(Console.ReadLine());
    Console.Write("Insert the second number: ");
    num2 = int.Parse(Console.ReadLine());
    Console.Write("Shape area: for rectangle insert r for triangle insert t");
    tav = char.Parse(Console.ReadLine());
    if(tav=='r')
        Console.WriteLine("The area is: {0}",AreaRec(num1,num2));
    else if(tav=='t')
        Console.WriteLine("The area is: {0}", AreaTri(num1, num2));
    else
        Console.WriteLine("you inserted wrong letter!");
}
تمرين 11.5
كتابة عمليات خارجية ثابتة (static).
(أ) اكتب عملية خارجية ثابتة (static) اسمها IsBin تأخذ رقما صحيحاً وتُعيد true إذا كان الرقم يصلح أن يكون رقما في الميزان الثنائي بينما تُعيد false إذا كان الرقم الصحيح الذي حصلت عليه العملية لا يمكنه أن يكون رقما في الميزان الثنائي. (العملية تأخذ رقما صحيحا (int) وتُعيد قيمة true أو false (بولاينيه bool).)
(ب) اكتب عملية اسمها Bin2Dec تأخذ رقما صحيحاً وتعتمد على العملية من الفرع السابق لكي تفحص إذا كان الرقم يمكنه أن يكون في الميزان الثنائي أم لا، حيث أنه إذا كان يمكنه ان يكون في الميزان الثنائي فإنها تُعيد قيمة الرقم في الميزان العشري أما إذا كان الرقم لا يمكنه أن يكون في الميزان الثنائي فإن العملية ستُعيد القيمة 1- وتكتب على الشاشة أن الرقم لا يمكنه أن يكون في الميزان الثنائي.
(ج) اكتب عملية اسمها Dec2Bin تأخذ رقما صحيحاً في الميزان العشري وتحول هذا الرقم الى رقما في الميزان الثنائي وتُعيد هذا الرقم (إما كجملة string أو كرقم int حسب اختيارك).
(د) اكتب برنامج يسأل المستخدم في أي ميزان يريد ادخال رقم (إما عشري d أو ثنائي b) وعلى البرنامج أن يحوله على النحو التالي: إذا استقبلنا رقماً عشريا من المستخدم نحوله لرقم ثنائي ونطبع النتيجة. إذا استقبلنا رقما ثنائيا من المستخدم نحوله لرقم عشري ونطبع النتيجة.
الحل:
using System;

namespace ConsoleApp109
{
    class Program
    {
        // Part (A) **************************************
        static bool IsBin(int num)
        {
            int digit;
            digit = num % 10;
            while (num > 0)
            {
                if (digit != 1 && digit != 0)
                {
                    return false;
                }
                num = num / 10;
                digit = num % 10;
            }
            return true;
        }
        // Part (B) **************************************
        static int Bin2Dec(int num)
        {
            int dig = 0, weight = 1, result = 0;
            if (IsBin(num))
            {
                while (num > 0)
                {
                    dig = num % 10;
                    result += dig * weight;
                    num = num / 10;
                    weight *= 2;
                }
                return result;
            }
            else
            {
                Console.WriteLine("It`s can`t be binary");
                return -1;
            }
        }
        // Part (c) ***************************************
        static string Dec2Bin(int num)
        {
            int d;
            string res = "";
            while (num > 0)
            {
                d = num % 2;
                res = d + res;
                num = num / 2;
            }
            return res;
        }
        // Part (d) ***************************************
        static void Main(string[] args)
        {
            char x;
            Console.WriteLine("Press d for decimal or b for binary");
            x = char.Parse(Console.ReadLine());
            if (x =='d')
            {
                Console.Write("Enter a decimal number: ");
                Console.WriteLine("The number in binary is: {0}",Dec2Bin(int.Parse(Console.ReadLine())));
            }
            else if (x=='b')
            {
                Console.Write("Enter a binary number: ");
                Console.WriteLine("The number in decimal is: {0}", Bin2Dec(int.Parse(Console.ReadLine())));
            }
            else
                Console.WriteLine("You must press d or b");
        }
    }
}
همام عبد اللطيف وتد — جميع حقوق هذا الكتاب محفوظة للمؤلف. النسخة الإلكترونية منشورة في fahed-lab.com بإذنه، مع تصحيحات وافق عليها. للتواصل مع المؤلف: hammam4112@gmail.com