قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots

أدوات الموضوع

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:332
قديم 23-12-2010, 11:50 PM المشاركة 1   
افتراضي البرمجة بلغة السى : الدالة Function Twitter FaceBook Google+



البرمجة بلغة السى الدالة Function :

مقدمة :

ما هى الدالة ؟ . What is Function?

تعريف :
الدالة هى : بلوك block (وحدة – مجموعة ) مستقلة من العبارات statements (الأوامر) التى لها اسم وتؤدى مهمة محددة بدقة , وتستدعى الدالة call للبرنامج وقد تعود (ترجع) return بقيمة للبرنامج الذى يقوم باستدعائها أو تعود بدون قيمة .

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

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

حقائق حول الدالة :

1- الدالة هى الشرط (المطلب) الأساسى " للبرمجة بالوحدات " (الموديولات- النماذج)
Modular Programming
2- الدالة هى " كتل بناء " برنامج السى Building blocks .
3- تنفيذ برنامج السى " يبدأ بدالة رئيسية " تسمى " main" .
4- تنفذ الدوال الأخرى عندما تستدعى " مباشرة أو غير مباشرة بالدالة الرئيسية" .
5- كل برنامج سى به " على الأقل دالة واحدة " ويجب أن تكون هى الدالة الرئيسية main .
6- تعرف الدالة باسم منفرد unique .
7- تطلق أو تستدعى call باستخدام هذا الاسم .
8- يمكن أن تعود بقيمة .

ماهى الحاجة للدالة ؟
· نفترض أن لدينا مجموعة متماثلة (متشابهة) من العبارات فى البرنامج , عندئذ فى كل مرة نكتب نفس العبارات مرة تلو الأخرى وتكون العملية ممله . لذلك وفرت لغة السى الطريقة التى تمكننا ببساطة من فصل العبارات المشتركة ووضعها فى "دالة " function وفى كل مرة بدلا من كتابة كتلة العبارات ببساطة نستدعى call الدالة .
· أى أن الدالة تقلل من المجهود فى كتابة البرنامج .

اعلانات

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:332
قديم 24-12-2010, 12:14 AM المشاركة 2   
افتراضي


إعلان declaration وتعريف definition الدالة :


تعريف ومكونات الدالة :
  • يتم إعلان الدوال عند بداية البرنامج بوضع القوسين ( ) فى نهايتها .



1- رأس الدالة : هو أول سطر فى الدالة ويحتوى على :


أ‌- نوع بيانات رجوع الدالة : Return Type
  • يحدد نوع البيانات التى تعود بها الدالة للبرنامج عند الاستدعاء .
  • الدالة التى ليس لها قيمة عند الرجوع يسمى نوع رجوعها void ( فارغ ).
أمثلة :




ب‌- اسم الدالة : Function Name
  • يمكن أن يكون أى من المعرفات identifier الصالحة للغة السى .
  • عامة يجب أن تعطى الدالة اسم مناسب يعكس الغرض منها .
أمثلة :





ت‌- قائمة البارامترات (الوسائط) : Parameter List
  • تستخدم للتواصل ( للربط ) بين الاستدعاء والدوال المستدعاة .
أنواعها :





البارامترات الأولية (الأساسية) Formal Parameter :
  • هى البارامترات الموجودة فى رأس الدالة .
البارامترات الفعلية Actual Parameter :
  • هى البارامترات فى الدالة المستدعاة .
أمثلة صالحة :



2- جسم الدالة Function Body :
ويحتوى على :


أ‌- الإعلان Declaration :
  • يسمح بالإعلان عن المتغيرات المحلية داخل الدالة.
  • تستخدم فقط فى ضمن (داخل) الدالة .
ب‌- العبارات Statements :
  • هى مجموعة من العبارات القابلة للتنفيذ .
  • وهى تؤدى مهمة محددة .
ت‌- عبارة الرجوع Return Statement :
  • صيغتها :



  • تعمل على إعادة (رجوع) البرنامج لبرنامج الاستدعاء .

اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )
  

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:332
قديم 24-12-2010, 12:19 AM المشاركة 3   
افتراضي






فى المثال التالى :
تعود الدالة mult بقيمة عدد صحيح integer بينما الدالة LED لا تعود بأى قيمة void :



فى المثال التالى :

المنفذ Port A يوضع (يحدد) بالقيمة 1 والدالة لا تعود بأى قيمة عند الاستدعاء :




فى المثال التالى :
الدالة square تعود بمربع" البارامتر y ونوعه عدد صحيح" :
لاحظ أن بيانات كل من الدالة والبارامتر من نفس النوع int .



يمكن أن يكون للوظائف متغيرات محلية والتى تكون متاحة فقط داخل جسم الدالة .
فى المثال التالى :
المتغير w هو متغير محلى local .






إذا تم إعلان نفس المتغير داخل وخارج الدالة عندئذ المتغير الموجود داخل الدالة هو الذى يستخدم .

يتم استدعاء الدوال بكتابة اسم الدالة متبوعا بأى بارامترات .
فى المثال التالى :
البرنامج الرئيسى يستدعى الدالة square لحساب مربع عدد صحيح :





الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:332
قديم 24-12-2010, 12:31 AM المشاركة 4   
افتراضي


ملاحظات :
1- مثل المتغير يجب إعلان الدالة .
2- يسمى إعلان الدالة "نموذج الدالة " Function Prototype .
3- كما أن المتغيرات يتم إعلانها قبل استخدامها أيضا يتم إعلان "نموذج الدالة " قبل استخدامها .


4- إعلان الدالة يوفر للمترجم التالى :
  • اسم الدالة .
  • نوع عودتها Return (اختيارى / والافتراضى كعدد صحيح integer ) .
  • قائمة الوسائط Argument list وقائمة البارامترات (المعلمات) Parameter list .
5- نموذج الدالة ينتهى دائما بالفاصلة المنقوطة .
6- قائمة البارامترات اختيارية .
7- نوع العودة الافتراضى هو العدد الصحيح integer .




ملحوظة :
إذا تم كتابة تعريف الدالة بعد وظيفة main عندئذ وعندئذ فقط نكتب إعلان نموذج الدالة فى قسم الإعلانات العامة global .
وإذا تم كتابة تعريف الدالة فوق وظيفة main فلا حاجة لكتابة إعلان نموذج الدالة

يمكن تعيين أى اسم للدالة .

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





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

الإعلان عن دالة جديدة :

بصرف النظر عن الدوال التى تتعرف عليها لغة السى تلقائيا , هناك أيضا أمكانية استخدام وظائف جديدة تماما فى البرامج . ينبغى الإعلان عن كل وظيفة غير قياسية عند بداية البرنامج . الإعلان عن الدالة يسمى "نموذج" Prototype ويبدو كما يلى :




نوع الدالة التى لا تعود بقيمة هو void (خالى –شاغر) . إذا لم يكن نوع النتيجة معلن بالتحديد في البرنامج فيعتبر من نوع int .البارامترات المكتوبة فى نموذج الدالة تحدد ما ينبغي القيام به بالبارامترات الحقيقية .تسمى بارامترات النموذج باسم FORMAL PARAMETERS (الأساسية) .
المثال التالي يعلن دالة والتي تحسب حجم الاسطوانة.




إذا احتجنا لإجراء مثل هذه الحسابات فى وقت لاحق فى البرنامج (عمليا ممكن أن تكون حجم تنك أى خزان) فإنه يكفى تعريف البارامترات وتسمى عندئذ REAL PARAMETERS (الحقيقية) واستدعاء الدالة.
أثناء عملية الترجمة يقوم المترجم باستبدال البارامترات الأساسية formal parameters بالبارامترات الحقيقيقة real كما هو مبين أدناه :




مكتبات الدالة FUNCTION LIBRARIES

تخزن جميع أسماء الدوال المستخدمة فى لغة السى فى ملف يسمى "الرأس أو المقدمة" header . هذه الدوال (بناء على الغرض منها) تحفظ فى ملفات أصغر تسمى المكتبات .قبل استخدام أي منها في البرنامج من الضروري تحديد ملف الرأس المناسب باستخدام الأمر الرمز #include في بداية البرنامج. إذا صادف المترجم وظيفة غير معروفة أثناء تنفيذ البرنامج فسوف ينظر أولا عن إعلانها في المكتبات المحددة .

المكتبات القياسية للغة السى :
لم تكن وظائف لغة السى موحدة فى بداية صناعة البرمجيات ويتم تعديلها وفق الحاجة , ولكن سرعان ما اصبحت لفة السى شائعة وكان من الصعب إبقاء كل شيء تحت السيطرة ,وكان من الضروري إدخال نوع من المعايير لوضع الامور بنظام (ترتيب) .أطلق على المعايير التى أنشأت اسم ANSI C وهى تحتوي على 24 مكتبة للظائف .وتقدم هذه المكتبات عادة مع كل مترجم للغة السى حيث يتم تنفيذ معظم العمليات المتكررة باستخدامها.



الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:332
قديم 24-12-2010, 12:42 AM المشاركة 5   
افتراضي


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



العبارة int sum( ) سوف تخبر المترجم بأن الدالة sum( ) تعود بعدد صحيح .
الطريقة الثانية : لإخبار المترجم حول قيمة الرجوع للدالة تسمى :
"نموذج الدالة " Function Prototype .
نموذج الدالة لا يعطى قيمة العودة للدالة فقط بل أيضا يعلن (يعرف) declares عن عدد ونوع الوسائط arguments التى تقبلها الدالة .يجب أن يتوائم النموذج مع إعلان الدالة تماما .
تساعد النماذج المبرمج فى تحديد ما يشوب البرنامج عن طريق إعطاء تقرير بأى شىء غير قانونى بين الوسائط المرسلة إلى الدالة وإعلان الدالة. كما تعطى تقرير إذا كان عدد الوسائط المرسلة إلى الدالة ليست هى المحددة فى إعلان الدالة.
الصيغة العامة لنموذج الدالة كما يلى :


يمكن ان يكون كل نوع من المتغيرات مختلف .
مثال لنموذج ودالة :
تقوم الدالة بحساب الحجم بمعرفة الطول والعرض والارتفاع .


لاحظ أن الرجوع return استخدم به تعبير بدلا من ثابت أو من متغير .
أهمية النماذج ربما لا تظهر مع البرامج الصغيرة والتى ما زلنا نتعامل مهعا حتى الآن . مع ذلك كلما إزداد حجم البرنامج تظهر قيمة النماذج فى تصحيح الأخطاء .
Void فارغ أو خاوى :
الاستثناء الوحيد هو أن لا يكون للدالة أى بارامترات (وسائط) لتمريرها سواء للداخل أو للخارج . هذه الدالة يجب إعلانها على أنها فارغة أى void .
مثال :


استخدام أدلة (معاملات) argument الدالة:
دليل الدالة هو تلك القيمة التى تمرر إلى الدالة عند استدعاءها . تسمح لغة السى بتمرير عدد من الأدلة يتراوح ما بين الصفر وعدة أدلة للدالة .عدد الإدلة التى تقبلها الدالة تعتمد على المترجم ولكن معايير لغة السى ANCI C تحدد أن الدالة يجب أن تقبل 31 دليل على الأقل .
عندما تعرف الدالة يجب إعلان متغيرات خاصة لاستقبال البارامترات (الوسائط) . هذه المتغيرات الخاصة تعرف باسم "البارامترات الأولية" Formal Parameter .يتم إعلان البارامترات بين الأقواس التى تلى اسم الدالة.
وكمثال لطريقة استدعاء الدالة للبرنامج :


عند استدعاء الدالةsum( ) يقوم المترجم بنسخ قيمة كل دليل argument ( 1,10 مثلا) إلى المتغيرات a وb . من المهم تذكر أن القيم التى تمرر للدالة (1,10,15,6,100,25) تسمى أدلة arguments والمتغيرات a و b تسمى البارامترات (الوسائط) parameters الأولية formal .
يمكن للدالة أن تمرر الأدلة arguments بطريقتين .
الطريقة الأولى : تسمى "الاستدعاء بواسطة القيمة " call by value .
فى هذه الطريقة يتم نسخ قيمة الدليل إلى البارامتر الأولى للدالة . أى تغيير يحدث فى البارامتر الأولى لا يؤثر على القيمة الأصلية بالبرنامج الفرعى (الروتين) routine الذى يتم استدعاءه .
الطريقة الثانية تسمى "الاستدعاء بواسطة االمرجع" call by reference .
فى هذه الطريقة يتم نسخ عنوان الدليل فى البارامتر الأولى للدالة . داخل هذه الدالة يستخدم البارامتر الأولى فى الوصول إلى المتغير الفعلى فى روتين الاستدعاء. وهذا يعنى أن التغيرات يمكن ان تحدث للمتغير باستخدام البارامتر الأولى .
استخدام الدوال للعودة return بقيم :
أى دالة فى لغة السى يمكن أن تعود بقيمة لروتين الاستدعاء . ليس من الحاجة الضرورية استخدام قيمة العودة فى عبارة التخصيص (التعيين) بل يمكن استخدام عبارة printf( ) .
الشكل العام لإخبار المترجم بأن تلك الدالة تعود بقيمة هو :


حيث : النوع type يحدد نوع بيانات قيمة عودة الدالة.يمكن للدالة العودة بأى نوع من البيانات ما عدا المصفوفة .إذا لم يتم تحديد نوع البيانات , عندئذ يفترض مترجم لغة السى أن الدالة تعود بعدد صحيح int (الوضع الافتراضى) . إذا لم يكن للدالة قيمة عودة فإن مواصفات لغة السى العيارية تحدد أن هذه الدالة يجب ان تعود خالية void . والتصريح بها يخبر المترجم بإن الدالة ليس لها قيمة عودة .
المثال التالى يبين استخدام وظيفة بدون قيمة عودة :


هذا البرنامج يستدعى call الدالةsqrt( ) والتى تعود بعدد حقيقى float .هذا العدد خصص (عين) للمتغير result .لاحظ أن ملف الرأس math.h تم ضمه لأنه يحتوى على معلومات حول sqrt( ) (الجذر التربيعى ) والذى يستخدم بالمترجم .
من المهم أن يتم توافق نوع بيانات قيمة عودة الدالة ونوع بيانات المتغير التى سوف تخصص له .وهو أيضا ينطبق على الأدلة arguments المرسلة للدالة .
إذا كيف يتم عودة (إرجاع) قيمة من وظيفة ؟ الشكل العام كما يلى :

حيث variable_name يكون ثابت أو متغير أو أى تعبير صالح فى لغة السى والذى له نفس نوع بيانات قيمة العودة .المثال التالى يبين كلا النوعين من الدوال :


أحد الأشياء الهامة التى يجب ملاحظتها أنه عند الوصول إلى عبارة العودة تعود الدالة فورا إلى روتين الاستدعاء . أى عبارة بعد العودة return سوف لا تنفذ .
مزايا الوظيفة :
1- يمكن القيام بالبرمجة بطريقة" الهياكل والموديولات" Modular & Structural .
2- يترتب على ذلك أن يتم التنفيذ وفق النهج من أعلى إلى أسفل اومن ثم تظل الوظيفة الرئيسية main صغيرة جدا .
3- يمكن بناء واختبار وظائف فردية بسهولة .
4- يصبح تطوير البرنامج أمرا سهلا .
5- يمكن وضع الوظائف المستخدمة بكثرة معا فى مكتبة مخصصة .
6- يمكن للوظيفة أن تستدعى نفسها أو تستدعى وظيفة أخرى .
7- من السهل فهم موضوع البرنامج .

وإلى لقاء قريب إن شاء الله


رضا كامل
:: مهندس متواجد ::
تاريخ التسجيل: Aug 2007
المشاركات: 114
نشاط [ رضا كامل ]
قوة السمعة:0
قديم 24-12-2010, 04:32 AM المشاركة 6   
افتراضي


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


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:332
قديم 24-12-2010, 07:00 AM المشاركة 7   
افتراضي


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

شكرا جزيلا لك

الحمد لله الذى هدانا لهذا وما كنا مهتدين لولا أن هدانا الله

متعك الله بالصحة والعافية

تقدير اعتز به

بارك الله فيك

مع تمنياتى بدوام التوفيق


الصورة الرمزية dr_ideas
dr_ideas
:: عضو متميز ::
تاريخ التسجيل: Apr 2009
المشاركات: 184
نشاط [ dr_ideas ]
قوة السمعة:0
قديم 24-12-2010, 12:28 PM المشاركة 8   
افتراضي السلام عليكم


بسم الله ماشاء الله
مجهود جبار من اخ معروف عنه القوة

سلام وحب لفرسان الاسلام فى العلم وفرسان الاسلام ضد الجهل

الله اكبر ياااااااااااااعرب الله اكبر يا مسلمين الله اكبر

إضافة رد

العلامات المرجعية

«     الموضوع السابق       الموضوع التالي    »
أدوات الموضوع

الانتقال السريع إلى


الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 06:26 PM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)

Powered by vBulletin® Version 3.8.6, Copyright ©2000 - 2025