كتب jasmine: المهم انت يا عبد الله تقلنا أيمتى بتفوت مشان نكسبك بكم سؤال وجزاك الله خيرا" .... والله هاليومين ما في وقت محدد بس رح حاول فوت المسا شي 8 أو 9. كتب jasmine: وبالنسبة لمسائل امتحان العملي تبع البرمجة لومعنا الحل يا الله كتير بيفيدونا بس منين يا حسرة ..... إذا بدكم حطوا المسائل كلها وبحللكم ياها انشاء الله. كتب jasmine: هلأ شو مشان العودية ما فهمتها وهذا الغبي التابع والإجرائية كل ما أسأل حدا بيقلي الأولاني بيرجع قيمة والتاني لأ.. واللهي فهمت بس كيف ؟ شو يعني ؟؟؟ حدا عندو مثال سهل يصلح لدخول معالج مخي بسهولة رح حاول بسط المفاهيم قدر الإمكان انشاء الله: التابع:
برنامج صغير جزئي من برنامج أكبر منه, وهذا التابع كتوابع الرياضيات التي نعرفها, الفرق الوحيد بينهم أنه في الرياضيات وحتى الآن ما أخذنا تابع يأخذ أكثر من متحول واحد ( Parameter ) يعني طول عمرنا منعرف التابع بالرياضيات من الشكل : y = f(x) بينما بالبرمجة ممكن نلاقي تابع بياخد أكتر من متحول واحد, متل تابع القوة: e ^ x = Power(e,x) طبعا ً بالرياضيات التابع إلو قاعدة ربط بيعتمد عليها لإعادة قيمة ما اعتمادا ً على قيمة x , وبالبرمجة التابع رح يعيد للمستخدم قيمة معينة هي ناتج عملية أو عدة عمليات بين المتحولات, متل: في تابع القوة يعيد التابع قيمة تساوي حاصل جداء e بنفسها x مرة.
وممكن بالبرمجة أنو التابع يقوم بتغيير قيم المتغيرات يلي مررنالو ياها مثل: Function Modulus(x:Integer;y:Integer):Integer; Begin While x > y do x := x - y; Modulus := x; End; بالتابع السابق ( إيجاد باقي قسمة x على y ) المتغير x عمبيتغير, لكن لو اعتبرنا أنو أنا عندي متغير ولنفرض اسمه X1 وبدي أعرف باقي قسمته على Y1 وبعدها أطبع للمستخدم عبارة "إن باقي قسمة X1 على Y1 هو *** " مع تبديل كل من X1 و Y1 بقيمهم فرح نعمل التالي: Modulo := Modulus(X1,Y1); WriteLn('The modulus of dividing ',X1,' by ',Y1,' is ',Modulo); هون التابع رح يقوم بالعملية المطلوبة ويعيد باقي القسمة, بس التابع عدل قيمة X1, لكن البرنامج الأساسي ما اتعدلت فيه قيمة X1, يعني بهالحالة رح تكون العبارة صحيحة
مثال: X1 := 7; Y1 := 3; Modulo := Modulus(X1,Y1); WriteLn('The modulus of dividing ',X1,' by ',Y1,' is ',Modulo); فيكون خرج البرنامج: The modulus of dividing 7 by 3 is 1 أما في حالة تعريف التابع Modulus بالطريقة التالية: Function Modulus(var x:Integer;y:Integer):Integer; فرح بيكون خرج البرنامج: The modulus of dividing 1 by 3 is 1 والسبب أنو عندما أضفنا عبارة var اتغيرت قيمة المغير بالبرنامج الأساسي كمان, فبهي الحالة نحنا قدرنا ناخد من التابع خرجين واحد حطينا بالمتغير Modulo والتاني بالـ X1, فعمليا ً إذا كان بدنا ناخد أكتر من خرج من تابع واحد فرح منضيف كلمة var قبل المتغير يلي بدنا نستخدمو كخرج أيضا ً, متل الطلب الرابع بالمسألة 22 قدرنا نحصل على التواتر والقيمة ذات التواتر الأكبر من تابع واحد. الإجرائية: تعريف الإجرائية نفس تعريف التابع إلا أن الفرق الوحيد بيناتهم أنو التابع مضطر يعيد قيمة لأنو تعريفه من الشكل : Function [Function Name] (P0 : Type0 ; P1 : Type1 ; .... ; Pn : Typen) : Type فالتابع دائما ً بيعيد قيمة من النوع يلي بالسطر السلبق محطوط باللون الأحمر, متل التابع Modulus بيعيد قيمة من النوع Integer, بينما الإجرائية تعريفها من الشكل: Procedure [Procedure Name] (P0 : Type0 ; P1 : Type1 ; .... ; Pn : Typen) فالإجرائية مو مضطرة أنها تعيد قيمة لذلك منستخدمها بالبرامج منشان العمليات المتكررة بعدد كبير دون الحاجة إعادة قيمة ما, انشاء الله منوضحها بهالمثال: Type Matrix : Array [0..m,0..n] of Integer;
Procedure PrintArray(Ary:Matrix); Var I,J : Integer; Begin For I := 0 to m Do Begin For J := 0 to n Do Write(Ary[I,J], ' ' ) ; WriteLn; End; End; الإجرائية السابقة تقوم بطباعة مصفوفة ثنائية الأبعاد سطر سطر مع إذافة بعض الفراغات بين كل عنصر ويلي بعدو, لنعتبر أنو عنا برنامج بياخد المصفوفة من المستخدم, يطبعها قبل التعديل, يقوم بتبديل كل عنصر بنظيره بالنسبة للمحور الرئيسي, يرجع يطبع المصفوفة, وبعدين يزيد لكل عنصر واحد, ويرجع يطبع المصفوفة. إذا لاحظتو طبعنا المصفوفة 3 مرات, وممكن نحتاج لنطبعها مرة رابعة وخامسة إلخ ... , فلحتى ما نكتب الكود ست مرات لنطبع المصفوفة فينا نحطو بإجرائية ونستدعيها كل ما بدنا تطبع المصفوفة, ( بعرف أنو الدكاترة قالو أنو ما نحط تعليمات القراءة أو الكتابة بالتوابع أو الإجرائيات بس يللا مشوها هالمرة ) , الإجرائية السابقة ما بترجعلنا أي قيمة, لكن إذا بتتذكرو بالتابع ضفنا كلمة var قبل المتغير يلي بدنا ناخد منو خرج تاني, هالشي فينا نحطو بالإجرائية متل ما استخدمناه بالتابع دون أي مشكلة, مثال: Procedure AddOne(var Ary : Matrix); Var I,J : Integer; Begin For I := 0 to m Do For J := 0 to n Do Ary[I,J] := Ary [I,J] + 1; End; هي الإجرائية بتضيف واحد لكل عنصر من عناصر المصفوفة يلي منمررها عند الإستدعاء, وبسبب وجدو كلمة var فالمصفوفة الأساسية يلي مررناها رح تتأثر وينضاف لكل عنصر من عناصرها واحد.
العودية: أبسط تعريف بعرفه للعودية هي استدعاء التابع ( أو الإجرائية ) لنفسه في الكود تبع التابع. مثل: Function [Function Name] ([Parameters]) : Type; Begin [Function Name]([Parameters]); End; تستخدم العودية للقيام بعمليات منتهية عدد منته ٍ من المرات على متحولات, بحيث تكون العمليات نفسها لكل مرة عدا عدد معين من المرات ( المرة الأخيرة أو أكثر من مرة واحدة ), رح حط مثال عنها حساب قيمة العاملي لعدد معين (بعرف أنو مليتو منها بس هي أكتر شي سهلة): Function Factorial(x:Integer):Integer; Begin If x := 2 Then Factorial := 2; Factorial := Factorial (x-1) * x ; End; بالمثال السابق التابع يفحص قيمة المتحول x إذا كانت 2 قبيعيد قيمة 2, وإلا فإنه رح بيقوم بعملية فك العاملي يلي منعرفها : (X)! = (X - 1)! * X ولحساب القيمة (X - 1)! بيرجع التابع بيستدعي نفسه, وبيرجع بيتكرر اختبار إذا كانت x -1 تساوي 2 أو لا وهكذا بيضل التابع يستدعي نفسه ليوصل لتكون x = 2 وبالتالي ما بيعود بيستدعي حالو مرة تانية بل بيعيد قيمة 2. صور توضيحية :   انشاء الله كون شرحتلكم منيح.
|