الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

دورة السي بلس بلس , من البداية الي الاحتراف

بدأه البارودي في 19 يونيو 2008 · 16 رد · 4,882 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله و بركاته

مرحبا بكم اخواني

في هذا المستوي الجديد سنتحدث باذن الله تعالي عن الدوال ( Functions ) .

وحتي لا اطيل عليكم هيا بنا نبدأ متمنيا لكم التوفيق باذن الله

بسم الله نبدأ .......... :wub:

#2

المستوي الرابع :

الدوال ( Functions )

الدالة هي تجميع لعدد من بيانات البرنامج في وحدة واحده و إعطاء اسم لهذه الوحدة . هذه الوحدة يمكن بعد ذلك أن يتم استدعائها من أجزاء أخري من البرنامج .

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

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

post-36368-1213825200_thumb.jpg

الدوال في إل C++ ( و C ) مشابهة للبرامج الفرعية و الإجراءات في اللغات الأخرى المختلفة .

#3

• الدوال البسيطة

مثالنا الأول يستخدم دالة بسيطة وظيفتها هي طباعة سطر يتكون من 45 نجمة . برنامج المثال ينشئ جدول , وخطوط النجوم تستخدم لإنشاء الجدول وجعله ظاهر . ها هي قائمة الجدول :

post-36368-1213825654_thumb.jpg

مخرجات البرنامج ستكون كالتالي :

post-36368-1213825696_thumb.jpg

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

 main( )

و

 starline( )

.

عادتا ما ستري برامج عديدة تستخدم الدالة main( ) فقط .

ما هي المكونات الأخرى الضرورية لإضافة دالة للبرنامج ؟

إنها ثلاثة : الإعلان عن الدالة , مناداة الدالة , و تعريف الدالة .

#4

• الإعلان عن الدالة

كما انك لا تستطيع أن تستخدم المتغير بدون أن تخبر المجمع أو المعالج ماذا يكون , أيضا لا يمكنك أن تستخدم الدالة بدون أن تخبر المجمع أو المعالج عنها . هناك طريقتين لفعل هذا . الاقتراح الأول وهو أن نعلن عن الدالة قبل أن يتم استدعائها .( الاقتراح الثاني وهو أن يتم تعريف الدالة قبل أن يتم استدعائها , سنختبر ذلك فيما بعد ) في برنامج TABEL الدالة starline( ) تم الإعلان عنها في السطر

Void starline( );

الإعلان يخبر المعالج أو المجمع بان في بعض النقط التالية نخطط لتقديم دالة تسمي starline . الكلمة المحجوزة void تحدد بان الدالة ليس لها قيمة سيتم استرجاعها و علامات أقواس الحصر الفارغة تشير إلي إنها لن تأخذ أي قيم . ( يمكنك أيضا أن تستخدم الكلمة المحجوزة void داخل أقواس الحصر لتشير إلي أن الدالة لن تأخذ أي قيم , كما يحدث في اغلب الأحيان في إل C , لكن تركهم فارغين هذا ما يحدث شائعا في إل C++ .)

نحن لدينا الكثير لكي نتحدث عن القيم و استرجاعها .

لاحظ ذلك الإعلان عن الدالة انتهي بفاصلة منقوطة "; " انه يكمل البيان بنفسه .

الإعلان عن الدالة يسما أيضا بالنماذج , منذ أن تم تزويدهم بالنموذج و ووضع خطة للدالة . إنها تخبر المجمع , " الدالة تبدوا مثل هذا إنها تأتي بعد ذلك في البرنامج , لذلك فهي متفق عليها إذا رأيت إشارات إليها أمامك قبل أن تري الدالة بنفسها "

#5

• استدعاء الدالة

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

Starline( );

هذا كل ما نحتاجه لاستدعاء الدالة : اسم الدالة , يليها قوسين الحصر .

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

#6

• تعريف الدالة

أخيرا , نحن أتينا إلي الدالة نفسها , و التي ستكون مدعوة باسم تعريف الدالة . يحتوي التعريف علي الشفرة أو الكود الحقيقي للدالة .

هنا التعريف ل starline( ) :

post-36368-1213827399_thumb.jpg

التعريف يشتمل علي خط يسمي التصريح , يتبعه جسم الدالة .

إن جسم الدالة متكون من البيانات التي تختلق الدالة , محددة بأقواس الشيالات .

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

لاحظ ذلك إن المصرح لا ينتهي بفاصلة منقوطة .

الشكل التالي يوضح شكل تركيبة التصريح للدالة و استدعاء الدالة و تعريف الدالة .

post-36368-1213827520_thumb.jpg

عند استدعاء الدالة ,التحكم يحول إلي البيان الأول في جسم الدالة .

إن البيانات الأخرى في جسم الدالة ستنفذ بعد ذلك , و عندما يتم مصادفة قوس شيالة الإغلاق , فان التحكم يعود مرة أخري إلي البرنامج .

post-36368-1213827654_thumb.jpg

#7

• المقارنة بين مكتبات الدوال

نحن رأينا بعض مكتبات الدوال قيد الاستخدام . نحن جمعنا النداء علي الدوال , مثل

Ch = getche( );

داخل اكواد أو شفرات برنامجنا .

أين الإعلان و التعريف لدالة هذه المكتبة ؟ الإعلان يكون في الملف الرئيسي و الذي تم تخصيصه و تعريفه في بداية البرنامج ( CONIO.H ل getche( ) ) . التعريف ( تم معالجته داخل شفرة تنفيذية ) في ملف مكتبة و الذي تم ربطه تلقائيا و بصورة آلية ببرنامجك عند عملية البناء .

عندما استخدمنا دالة المكتبة نحن لم نحتاج إلي كتابة الإعلان و التعريف .

لكن عندما كتبنا دالتنا الخاصة , أصبح التعريف و الإعلان جزء من ملف المصدر لبرنامجنا , كما رأينا في مثال برنامج TABLE .( الأشياء تصبح معقدة جدا في برامج متعددة الملفات , كما سنناقش بعد ذلك في " برامج متعددة الملفات ").

#8

• إزالة الإعلان

النظرية الثانية لإدخال الدالة في البرنامج هي إزالة إعلان الدالة و وضع تعريف الدالة ( الدالة بنفسها ) في القائمة قبل أول نداء إلي الدالة .علي سبيل المثال , نحن يمكن أن نعيد كتابة TABLE لإنتاج TABLE2 , و الذي فيه التعريف starline( ) يظهر أولا .

post-36368-1214686034_thumb.jpg

هذه النظرية أسهل للبرامج القصيرة , حيث فيها يزيل الإعلان , لكنه اقل مرونة . لاستعمال هذه التقنية عندما يكون هناك أكثر من بضعة دوال , المبرمج يجب أن يعطي اعتقاد كبير بأنه ترتيب الدوال لكي تظهر كل واحدة قبل أن يتم استدعائها بآخر .

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

عموما نحن سنتمسك بالنظرية الأولي , استخدام الإعلان و بدا القائمة ب main( ) .

#9

الصراحة لا اعرف ماذا اقول لك يا غالى دورة ولا اروع وسهلة جدا :)

انا كنت اشتغل على السى بلس 6 واريد ان انتقل الى 2008 وقمت فعلا بتنزيله على الجهاز

ولكن لما جربت الاكواد ما اشتغلت معاى ليش ؟؟ فى اكواد كثيرة جدا ما اشتغلت والمكتبة iostream كمان ما بتشتغل ؟

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

#11
اقتباس
هذه الاكواد تعمل علي C++ او borland C

مشكور يا غالى على التوضيح

وانا كمان قلت هنزل الى سى بلس بلس 6 واشتغل عليها واتقنها بعدين اقدر انتقل الى 2008 ولن اجد مشكلة كبيرة :)

بأذن الله احاول الاحتراف فيها :) لان اتعلمها لهدف معين :)

#13

• تمرير الوسائط المرسلة إلي الدوال

الوسائط المرسلة هي قطعة من البيانات ( قيمة من النوع Int , علي سبيل المثال ) تم تمريرها من البرنامج إلي الدالة .

تسمح الوسائط المرسلة إلي الدوال لكي تشغل قيم مختلفة , أو حتى عمل أشياء مختلفة , اعتمادا علي متطلبات البرنامج الذي يدعوه .

تم تعديل هذه المشاركة بواسطة البارودي في 17 يوليو 2008 في 18:10

#14

• تمرير الثوابت

كمثال , دعنا نفترض بأننا قررنا بان الدالة starline( ) في المثال الأخير صعبة جدا .

بدلا من الدالة التي تطبع 45 نجمة دائما , نريد دالة و التي ستطبع أي حرف بأي عدد من المرات .

هنا برنامج , TABLEARG , و الذي يحتوي فقط علي مثل هذه الدالة.

نحن نستخدم القيم لتمرير الحروف لكي تطبع و عدد المرات لطباعتها .

post-36368-1215455836_thumb.jpg

الدالة الجديدة تسمي 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 :

post-36368-1215456300_thumb.jpg

عملية النداء في البرنامج تجهز القيم , كذلك مثل '-' و 43 , إلي الدالة .

المتغيرات استخدمت ضمن الدالة لمعالجة القيم و التي تسمي البارامترات ; في repchar( ) هم ch و n .

( نحن يجب أن نلاحظ بان العديد من المبرمجين يستخدمون القيم و الباراميترات بعض الشئ بشكل متبادل ) المعلن في تعريف الدالة يحدد كل من أنواع البيانات و أسماء الباراميترات :

Void repchar( char ch , int n )   // Declarator specifies parameter
													  //  Names and data types

هذه الباراميتر تسمي , ch و n , يستخدموا في الدالة كما لو كانوا متغيرات طبيعية . وضعهم في التصريح أو الإعلان مكافئون مع تعريفهم بالبيانات مثل :

Char ch;
Int n;

عند استدعاء الدالة , فان باراميتر الدالة تشغل آليا إلي القيم التي تم تمريرها عن طريق النداء في البرنامج .

#15

شكرا اخ البارودي , لو يكون هناك تمارين في نهايه كل درس حتما سوف يكون افضل . لاكتشاف مدى استفادتنا من الموضوع .

سبحان الله , الله اكبر , ولله الحمد

#16

• تمرير المتغيرات

في مثال TABLEARG , القيم كانت ثوابت : '-' , 43 , وهكذا . دعنا ننظر إلي مثال حيث المتغيرات , بدلا من الثوابت , حيث ستمرر كقيم .

هذا البرنامج , VARARG , يحتوي علي نفس الدالة repchar( ) كما حدث في TABLEARG , لكن يترك المستخدم يحدد الحرف وعدد المرات التي سوف يتكرر فيها هذا الحرف .

post-36368-1216306037_thumb.jpg

هنا عينة لبعض التفاعل في VARARG :

post-36368-1216306207_thumb.jpg

هنا chin و nin في main( ) استخدموا كقيم ل repchar( ) :

Repchar( chin , nin );	 //Function call

أنواع بيانات المتغيرات المستخدمة كقيم يجب أن تلائم هذا التخصيص و التحديد في إعلان وتعريف الدالة , كما هو يجب أن يكون للثوابت .

ذلك , أن يجب أن تكون chin من النوع char و nin من النوع int .

#17

• تمرير القيم

في VARARG القيم المعينة امتلكت بواسطة chin و nin عندما نداء الدالة تم تنفيذه سيتم تمريرهما إلي الدالة . بينما هذا حدث عندما الثوابت تم تمريرها إليه , تنشئ الدالة متغيرات جديدة لحمل قيم هذه الأدلة المتغيرة. تعطي الدالة لهذه المتغيرات الجديدة الاسم و أنواع البيانات للباراميترات المخصصة في الإعلان : ch من النوع char و n من النوع int . تشغل هذه الباراميترات إلي القيم التي تم تمريرها . ثم هم بعد ذلك يدخلون مثل المتغيرات الأخرى بالبيانات في جسم الدالة .

مرور البراهين بهذه الطريقة , حيث تنشئ الدالة نسخ من البراهين التي مرت إليه , تدعي مرور القيم . نحن سنستكشف نظرية أخري , التمرير بواسطة الإشارة , بعد ذلك .

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

post-36368-1216306774_thumb.jpg

• التراكيب مثل الوسائط المرسلة

التراكيب بأكملها يمكن أن تمرر كوسائط مرسلة إلي الدوال . نحن سنري مثالان , واحد بتركيبة المسافة , وواحدة مع تركيبة تمثل شكل رسومات .

تم تعديل هذه المشاركة بواسطة البارودي في 17 يوليو 2008 في 18:12

مواضيع مشابهة