السلام عليكم ورحمة الله و بركاته
مرحبا بكم اخواني
في هذا المستوي الجديد سنتحدث باذن الله تعالي عن الدوال ( Functions ) .
وحتي لا اطيل عليكم هيا بنا نبدأ متمنيا لكم التوفيق باذن الله
بسم الله نبدأ .......... :wub:
السلام عليكم ورحمة الله و بركاته
مرحبا بكم اخواني
في هذا المستوي الجديد سنتحدث باذن الله تعالي عن الدوال ( Functions ) .
وحتي لا اطيل عليكم هيا بنا نبدأ متمنيا لكم التوفيق باذن الله
بسم الله نبدأ .......... :wub:
المستوي الرابع :
الدوال ( Functions )
الدالة هي تجميع لعدد من بيانات البرنامج في وحدة واحده و إعطاء اسم لهذه الوحدة . هذه الوحدة يمكن بعد ذلك أن يتم استدعائها من أجزاء أخري من البرنامج .
السبب الأكثر أهمية لاستخدام الدوال هي تنظيم الصورة العامة التنظيمية للبرنامج . تقسيم البرنامج إلي دوال كما تحدثنا من قبل يعتبر احد المبادئ الرئيسية للبرمجة المنظمة . ( علي أي حال , تزود البرمجة الكائنية التوجيه طرق أكثر قوة أخري لتنظيم البرامج . )
السبب الآخر لاستخدام الدوال ( و السبب الذي هم اخترعوا , منذ عهد بعيد) هو أن يخفض حجم البرنامج . أي سلسلة من الأوامر و التي تظهر في البرنامج أكثر من مرة مرشحة بان يتم جعلها في دالة . كود الدالة يتم تخزينه في مكان واحد فقط في الذاكرة , بالرغم من أن الدالة يتم تنفيذها في العديد من الأوقات أثناء تنفيذ البرنامج . الشكل التالي يوضح كيفية استدعاء الدالة من الأقسام المختلفة من البرنامج .
الدوال في إل C++ ( و C ) مشابهة للبرامج الفرعية و الإجراءات في اللغات الأخرى المختلفة .
• الدوال البسيطة
مثالنا الأول يستخدم دالة بسيطة وظيفتها هي طباعة سطر يتكون من 45 نجمة . برنامج المثال ينشئ جدول , وخطوط النجوم تستخدم لإنشاء الجدول وجعله ظاهر . ها هي قائمة الجدول :
مخرجات البرنامج ستكون كالتالي :
البرنامج يحتوي علي دالتين :
main( )
و
starline( )
.
عادتا ما ستري برامج عديدة تستخدم الدالة main( ) فقط .
ما هي المكونات الأخرى الضرورية لإضافة دالة للبرنامج ؟
إنها ثلاثة : الإعلان عن الدالة , مناداة الدالة , و تعريف الدالة .
• الإعلان عن الدالة
كما انك لا تستطيع أن تستخدم المتغير بدون أن تخبر المجمع أو المعالج ماذا يكون , أيضا لا يمكنك أن تستخدم الدالة بدون أن تخبر المجمع أو المعالج عنها . هناك طريقتين لفعل هذا . الاقتراح الأول وهو أن نعلن عن الدالة قبل أن يتم استدعائها .( الاقتراح الثاني وهو أن يتم تعريف الدالة قبل أن يتم استدعائها , سنختبر ذلك فيما بعد ) في برنامج TABEL الدالة starline( ) تم الإعلان عنها في السطر
Void starline( );
الإعلان يخبر المعالج أو المجمع بان في بعض النقط التالية نخطط لتقديم دالة تسمي starline . الكلمة المحجوزة void تحدد بان الدالة ليس لها قيمة سيتم استرجاعها و علامات أقواس الحصر الفارغة تشير إلي إنها لن تأخذ أي قيم . ( يمكنك أيضا أن تستخدم الكلمة المحجوزة void داخل أقواس الحصر لتشير إلي أن الدالة لن تأخذ أي قيم , كما يحدث في اغلب الأحيان في إل C , لكن تركهم فارغين هذا ما يحدث شائعا في إل C++ .)
نحن لدينا الكثير لكي نتحدث عن القيم و استرجاعها .
لاحظ ذلك الإعلان عن الدالة انتهي بفاصلة منقوطة "; " انه يكمل البيان بنفسه .
الإعلان عن الدالة يسما أيضا بالنماذج , منذ أن تم تزويدهم بالنموذج و ووضع خطة للدالة . إنها تخبر المجمع , " الدالة تبدوا مثل هذا إنها تأتي بعد ذلك في البرنامج , لذلك فهي متفق عليها إذا رأيت إشارات إليها أمامك قبل أن تري الدالة بنفسها "
• استدعاء الدالة
الدالة تم استدعائها ( أو استحضرت أو تم تنفيذها ) ثلاث مرات في Main( ) . كل من الاستدعاءات الثلاثة تبدوا مثل ذلك :
Starline( );
هذا كل ما نحتاجه لاستدعاء الدالة : اسم الدالة , يليها قوسين الحصر .
إن شكل تركيبة النداء مشابه تماما لتركيبة الإعلان , ماعدا أن نوع العودة لم يستخدم . إن النداء منهي بفاصلة منقوطة . تنفيذ جملة النداء يؤدي إلي تنفيذ الدالة ; ذلك أن السيطرة تتحول إلي الدالة , الجمل التي في تعريف الدالة ( و التي سنفحصها في خلال دقائق ) ستنفذ , وبعد ذلك السيطرة تعود البرنامج بعد جملة النداء علي الدالة .
• تعريف الدالة
أخيرا , نحن أتينا إلي الدالة نفسها , و التي ستكون مدعوة باسم تعريف الدالة . يحتوي التعريف علي الشفرة أو الكود الحقيقي للدالة .
هنا التعريف ل starline( ) :
التعريف يشتمل علي خط يسمي التصريح , يتبعه جسم الدالة .
إن جسم الدالة متكون من البيانات التي تختلق الدالة , محددة بأقواس الشيالات .
إن المصرح يجب أن يتوافق مع الإعلان : يجب أن يستخدم نفس اسم الدالة . له نفس أنواع المعاملات في نفس الأوامر ( إذا كان هناك معاملات) , وله نفس أنواع القيم الراجعة .
لاحظ ذلك إن المصرح لا ينتهي بفاصلة منقوطة .
الشكل التالي يوضح شكل تركيبة التصريح للدالة و استدعاء الدالة و تعريف الدالة .
عند استدعاء الدالة ,التحكم يحول إلي البيان الأول في جسم الدالة .
إن البيانات الأخرى في جسم الدالة ستنفذ بعد ذلك , و عندما يتم مصادفة قوس شيالة الإغلاق , فان التحكم يعود مرة أخري إلي البرنامج .
• المقارنة بين مكتبات الدوال
نحن رأينا بعض مكتبات الدوال قيد الاستخدام . نحن جمعنا النداء علي الدوال , مثل
Ch = getche( );
داخل اكواد أو شفرات برنامجنا .
أين الإعلان و التعريف لدالة هذه المكتبة ؟ الإعلان يكون في الملف الرئيسي و الذي تم تخصيصه و تعريفه في بداية البرنامج ( CONIO.H ل getche( ) ) . التعريف ( تم معالجته داخل شفرة تنفيذية ) في ملف مكتبة و الذي تم ربطه تلقائيا و بصورة آلية ببرنامجك عند عملية البناء .
عندما استخدمنا دالة المكتبة نحن لم نحتاج إلي كتابة الإعلان و التعريف .
لكن عندما كتبنا دالتنا الخاصة , أصبح التعريف و الإعلان جزء من ملف المصدر لبرنامجنا , كما رأينا في مثال برنامج TABLE .( الأشياء تصبح معقدة جدا في برامج متعددة الملفات , كما سنناقش بعد ذلك في " برامج متعددة الملفات ").
• إزالة الإعلان
النظرية الثانية لإدخال الدالة في البرنامج هي إزالة إعلان الدالة و وضع تعريف الدالة ( الدالة بنفسها ) في القائمة قبل أول نداء إلي الدالة .علي سبيل المثال , نحن يمكن أن نعيد كتابة TABLE لإنتاج TABLE2 , و الذي فيه التعريف starline( ) يظهر أولا .
هذه النظرية أسهل للبرامج القصيرة , حيث فيها يزيل الإعلان , لكنه اقل مرونة . لاستعمال هذه التقنية عندما يكون هناك أكثر من بضعة دوال , المبرمج يجب أن يعطي اعتقاد كبير بأنه ترتيب الدوال لكي تظهر كل واحدة قبل أن يتم استدعائها بآخر .
أحيانا هذا مستحيل . أيضا , العديد من المبرمجين يفضلون أن يضعوا main( ) أولا في القائمة , منذ أن كانت يتم تنفيذها أولا .
عموما نحن سنتمسك بالنظرية الأولي , استخدام الإعلان و بدا القائمة ب main( ) .
الصراحة لا اعرف ماذا اقول لك يا غالى دورة ولا اروع وسهلة جدا :)
انا كنت اشتغل على السى بلس 6 واريد ان انتقل الى 2008 وقمت فعلا بتنزيله على الجهاز
ولكن لما جربت الاكواد ما اشتغلت معاى ليش ؟؟ فى اكواد كثيرة جدا ما اشتغلت والمكتبة iostream كمان ما بتشتغل ؟
فهل من فروقات اخى الكريم وانا اسف على خروجى من صلب الدورة :(
هذه الاكواد تعمل علي C++ او borland C
اقتباسهذه الاكواد تعمل علي C++ او borland C
مشكور يا غالى على التوضيح
وانا كمان قلت هنزل الى سى بلس بلس 6 واشتغل عليها واتقنها بعدين اقدر انتقل الى 2008 ولن اجد مشكلة كبيرة :)
بأذن الله احاول الاحتراف فيها :) لان اتعلمها لهدف معين :)
• تمرير الوسائط المرسلة إلي الدوال
الوسائط المرسلة هي قطعة من البيانات ( قيمة من النوع Int , علي سبيل المثال ) تم تمريرها من البرنامج إلي الدالة .
تسمح الوسائط المرسلة إلي الدوال لكي تشغل قيم مختلفة , أو حتى عمل أشياء مختلفة , اعتمادا علي متطلبات البرنامج الذي يدعوه .
تم تعديل هذه المشاركة بواسطة البارودي في 17 يوليو 2008 في 18:10
• تمرير الثوابت
كمثال , دعنا نفترض بأننا قررنا بان الدالة starline( ) في المثال الأخير صعبة جدا .
بدلا من الدالة التي تطبع 45 نجمة دائما , نريد دالة و التي ستطبع أي حرف بأي عدد من المرات .
هنا برنامج , TABLEARG , و الذي يحتوي فقط علي مثل هذه الدالة.
نحن نستخدم القيم لتمرير الحروف لكي تطبع و عدد المرات لطباعتها .
الدالة الجديدة تسمي repchar( ) . الإعلان عنها يبدوا مثل هذا :
Void Repchar( char , int ); //declaration specifies data types
إن المواد التي في علامات الحصر هي أنواع بيانات لقيم سوف يتم إرسالها إلي repchar( ) : char و int .
في النداء علي الدالة , يتم تخصيص قيم – ثوابت في هذه الحالة – و التي تم إدخالها في الأماكن الملائمة في علامات الحصر :
Repchar( '-' , 43 ); //Function call specifies actual values
يأمر هذا البيان repchar( ) لطباعة خط من 43 وثبة . القيم التي جهزت في النداء يجب أن تكون من الأنواع التي تم تحديدها في الإعلان : القيمة الأولي , الحرف '-' يجب أن يكون من النوع char . و القيمة الثانية , الرقم 43 يجب أن يكون من النوع int . الأنواع في الإعلان و التعريف يجب أيضا أن يكونوا متوافقين .
النداء الثاني ل repchar( ) ,
Repchar( '=' , 23 );
يخبره لطباعة خط من 23 إشارة يساوي . يطبع النداء الثالث 43 وثبة ثانية .
هذا الناتج من TABLEARG :
عملية النداء في البرنامج تجهز القيم , كذلك مثل '-' و 43 , إلي الدالة .
المتغيرات استخدمت ضمن الدالة لمعالجة القيم و التي تسمي البارامترات ; في repchar( ) هم ch و n .
( نحن يجب أن نلاحظ بان العديد من المبرمجين يستخدمون القيم و الباراميترات بعض الشئ بشكل متبادل ) المعلن في تعريف الدالة يحدد كل من أنواع البيانات و أسماء الباراميترات :
Void repchar( char ch , int n ) // Declarator specifies parameter // Names and data types
هذه الباراميتر تسمي , ch و n , يستخدموا في الدالة كما لو كانوا متغيرات طبيعية . وضعهم في التصريح أو الإعلان مكافئون مع تعريفهم بالبيانات مثل :
Char ch; Int n;
عند استدعاء الدالة , فان باراميتر الدالة تشغل آليا إلي القيم التي تم تمريرها عن طريق النداء في البرنامج .
شكرا اخ البارودي , لو يكون هناك تمارين في نهايه كل درس حتما سوف يكون افضل . لاكتشاف مدى استفادتنا من الموضوع .
سبحان الله , الله اكبر , ولله الحمد
• تمرير المتغيرات
في مثال TABLEARG , القيم كانت ثوابت : '-' , 43 , وهكذا . دعنا ننظر إلي مثال حيث المتغيرات , بدلا من الثوابت , حيث ستمرر كقيم .
هذا البرنامج , VARARG , يحتوي علي نفس الدالة repchar( ) كما حدث في TABLEARG , لكن يترك المستخدم يحدد الحرف وعدد المرات التي سوف يتكرر فيها هذا الحرف .
هنا عينة لبعض التفاعل في VARARG :
هنا chin و nin في main( ) استخدموا كقيم ل repchar( ) :
Repchar( chin , nin ); //Function call
أنواع بيانات المتغيرات المستخدمة كقيم يجب أن تلائم هذا التخصيص و التحديد في إعلان وتعريف الدالة , كما هو يجب أن يكون للثوابت .
ذلك , أن يجب أن تكون chin من النوع char و nin من النوع int .
• تمرير القيم
في VARARG القيم المعينة امتلكت بواسطة chin و nin عندما نداء الدالة تم تنفيذه سيتم تمريرهما إلي الدالة . بينما هذا حدث عندما الثوابت تم تمريرها إليه , تنشئ الدالة متغيرات جديدة لحمل قيم هذه الأدلة المتغيرة. تعطي الدالة لهذه المتغيرات الجديدة الاسم و أنواع البيانات للباراميترات المخصصة في الإعلان : ch من النوع char و n من النوع int . تشغل هذه الباراميترات إلي القيم التي تم تمريرها . ثم هم بعد ذلك يدخلون مثل المتغيرات الأخرى بالبيانات في جسم الدالة .
مرور البراهين بهذه الطريقة , حيث تنشئ الدالة نسخ من البراهين التي مرت إليه , تدعي مرور القيم . نحن سنستكشف نظرية أخري , التمرير بواسطة الإشارة , بعد ذلك .
الشكل التالي يعرض كيفية إنشاء المتغيرات الجديدة في الدالة عندما البراهين مررت القيم .
• التراكيب مثل الوسائط المرسلة
التراكيب بأكملها يمكن أن تمرر كوسائط مرسلة إلي الدوال . نحن سنري مثالان , واحد بتركيبة المسافة , وواحدة مع تركيبة تمثل شكل رسومات .
تم تعديل هذه المشاركة بواسطة البارودي في 17 يوليو 2008 في 18:12