انشاء ومناداة دوال
رأينا في الدروس السابقة بأن برامج السي تبدء بدالة تدعى main
سأذكركم بمخطط وضعته لكم لينعش ذاكرتكم
هذا هو شكل البرامج الرئيسي
يبدء أولا بالـ préprocesseur سنتطرق لشرحهم بالتفصيل في دروس لاحقة
تبدء دائما بالعلامة # ونجدهم عادة في أعلى الكود
ثم يأتي بعدهم مباشرة الدوال وفي هذا المخطط نرى الدالة main وهي التي يبدء منها أي برنامج بالسي
وقد كانت برامجنا كلها في ما سبق كودها محصور بين حاضنيتي { } الدالة الرئيسية main
بحيث اذا رأينا بعض السورسات لا نجد الكود فقط داخل الدالة main قد نجدها خارجه
ولحد الآن برامجنا داخل الدالة الرئيسية لانها برامج صغيرة ولا نقع في مشكل لكن تخيل لو كانت مشاريع ضخمة
بها آلاف أو ملايين التعليمات سيكون من المستحيل عمل هذا المشروع
لذا ما سنقوم به الآن هو أن نتعلم تنظيم هذه الفوضى بحيث نقوم بتفكيك البرنامج الى عدة برامج صغيرة تسمى دوال
نرجع الى مثال الليغو بحيث كل قطعة منه هي عبارة عن دالة ونقوم بتركيبها لنحصل على شكل مناسب
ما هو الهدف من الدوال ؟
تقوم الدوال بتنفيذ تعليمات أو أحداث وتعطي نتيجة ، أي مجموعة من الاكواد تقوم بشيء معين
أو بطريقة أخرى لديها مدخلات ومخرجات ( وهي النتيجة ) يمكن تمثيلها على هذا الشكل
لمن لا يفهم الفرنسية
entrée=مدخلات
sortie=مخرجات
عندما ننادي دالة هناك 3 مراحل :
الادخال : نقوم بادخال المعلومات التي نريد أن نعمل لها الحسابات للدالة الحسابات: تقوم الدالة بعمل حسابات على المعلومات التي تم ادخالها الاخراج : بعد أن تنتهي الدالة نم الحسابات تعطينا النتيجة وهو ما يسمى الاخراج أو الارجاع أي ترجع النتيجة
يمكن تصور ذلك بالدالة triple وهي دالة تعطيك العدد مضاعف 3 مرات والصورة توضح
هذا مثال بسيط عن الدوال ، هدف الدوال هو تبسيط الكود سورس وربح الوقت فمثلا لو أردت أن تستعمل مضاعف كم من عدد
مش كل مرة تعمل الكود سورس الخاص بمضاعفة العدد وانما يكفي مناداة الدالة trilpe
الاآن سنتطرق لمنهجية انشاء الدالة :type nomFonction(parametres)
{
// نكتب التعليمات هنا
}
type أي نوع الدالة int او float او char الخ ... وهو نوع النتيجة المراد الحصول عليها اذا أردت عدد عشري تكتب float واذا أردت عدد صحيح تكتب int
كما أنه يمكن عمل دالة لا ترجع شيء اذا هناك نوعان من الدوال
1- التي ترجع قيمة : سنكتب في type اذا نوعه int او float او ...
2-التي لا ترجع قيمة :سنكتب في type النوع void يعني فارغة
nomFonction : أي اسم الدالة من اختيارك
parametres: وهي المدخلات أو المعلومات التي ستعمل عليها الدالة وطبعا سنكتب نوع المعلومة اذا كانت عدد صحيح نكتب int x اذا كانت عدد عشري نكتب float x
والتعليمات تكتب داخل { }
انشاء أول دالة :
سنعمل على الدالة triple تقوم الدالة هذه بارجاع قيمة عدد صحيح مضاعف 3 مرات لذا سنختار النوع int
لذا سيكون الكود كالآتي :int triple(int number)
{
int result=0;
result=number*3; //نضرب في 3 العدد الذي نريد أن نضاعفه
return result; //الذي فيه قيمة العدد المدخل مضاعف 3 مرات result نرجع المتغير
}
مبروك عليكم أول دالة
أول شيء عليكم الانتباه له هو أن الدالة من نوع int لذا يجب ان ترجع int
لدينا المتغير result وهو الذي نضع فيه النتيجة نضرب العدد المدخل في 3 ونضعه داخل هذا المتغير
ثم في return نضع هذا المتغير result وهذا سيكون محتوى الدالة
غالبا ما تكون الكلمة return دائما في آخر الدالة بعد انتهاء الحسابات لترجع لنا قيمة الدالة وكأننا نقول للدالة : توقفي واعطينا العدد result
لكن هل هذه الطريقة المختصرة للدالة triple
سأقول لا يمكننا عمل هذا في سطر واحد فقط كالآتي
int triple(int number)
{
return number*3;
}
تقوم هذه الدالة بعمل نفس عمل الدالة الأخرى بالضبط لكنها أسرع لان فيها كود أقل
هذه كانت دالة بمعلومة واحدة سنرى الآن دوال فيها عدة بيانات وأخرى بدون بيانات :
أولا عدة بيانات :
مثال جمع عددين
يكفي تفريق البيانات ب فاصلة كما ترونint addition(int a,int b)
{
return a+b;
}
int a,int b
ثانيا بدون بيانات :
بعض الدوال لا يوجد فيها أي بيانات في المدخلات وتعمل عادة نفس العمل أي نفس النتيجة
و غالبا لا يكون فيها حسابات للعمل عليها فقط اظهار شيء في الشاشة (طبعا دائما نفس الجملة تطبع ) أو توقيف الشاشة وهكذا دوال
سنضع دالة تضع مرحبا مثلا bonjour بالفرنسية
void bonjour()
{
printf("bonjour");
}
لم أضع شيء بين الاقواس لان الدالة لا تأخذ أي بيانات
ووضعت أيضا void التي تكلمت عليها في الأعلى وكما ترون لا يوجد return لان دالتنا لا ترجع شيء والدالة التي لا ترجع شيء هي من نوع void
الآن وقد عرفنا كيف ننشئ دالة سنرى كيف ننادي دالة ونستعملها في البرنامج
سنستعمل الدالة triple وعليكم الآن انشاءها قبل الدالة main وليس بعدها وسأشرح لكم في القادم
#include <stdio.h>
#include <stdlib.h>
int triple(int nombre)
{
return 3 * nombre;
}
int main(int argc, char *argv[])
{
int nombreEntre = 0, nombreTriple = 0;
printf("Entrez un nombre... ");
scanf("%d", &nombreEntre);
nombreTriple = triple(nombreEntre);
printf("Le triple de ce nombre est %d\n", nombreTriple);
return 0;
}
أي برنامج يبدء من الدالة main كما تعلمون
سنطلب من المستخدم أن يدخل عدد وسنضع هذا العدد الذي أدخله الى الدالة triple وسنضع النتيجة في المتغير nombreTriple
هذا السطر هو المهم الآن في درسنا لانه هنا يتم المناداة على الدالة
nombreTriple = triple(nombreEntre);
بين قوسين نضع العدد المدخل للدالة triple وهو العدد الذي نريد العمل عليه ( العدد الذي نريد الحصول على مضاعفته)
هذه الدالة ترجع قيمة والتي بدورها سنضعها في المتغير nombreTriple اذا سنطلب من الجهاز في هذا السطر من حساب مضاعف العدد nombreEntre ووضع النتيجة
في المتغير nombreTriple
أمثلة على الدوال
التحويل من الاورو الى الدينار :
نرى من أي موقع خاص بتحويل العملات ونرى كم يساوي الاورو بالديناروجدنا مثلا : 1 أورو =6.55957 دينار
سوف ننشئ دالة ونسميها conversion
سوف تأخذ هذه الدالة كبيانات متغير من نوع double وترجع قيمة أيضا double لاننا بطبيعة الحال سنستعمل أعداد عشرية
بما أننا نتكلم عن النقود
ليكون الكود كالآتي :double conversion(double euros)
{
double francs = 0;
francs = 6.55957 * euros;
return francs;
}
int main(int argc, char *argv[])
{
printf("10 euros = %fF\n", conversion(10));
printf("50 euros = %fF\n", conversion(50));
printf("100 euros = %fF\n", conversion(100));
printf("200 euros = %fF\n", conversion(200));
return 0;
}
ويعطينا كنتيجة
10 euros = 65.595700F 50 euros = 327.978500F 100 euros = 655.957000F 200 euros = 1311.914000F
لايوجد اختلا كبير بينها وبين الدالة triple وسوف أثبت لكم ذلك
أولا الدالة conversion يمكن اختصارها في سطر واحد فقط مثل ما شرحت لكم
في الدالة الرئيسية main وضعت عدة Printf لترو أهمية عمل الدوال فهنا تحتاج فقط لتغيير البيانات بدل 10 تضع 50
أو 100 الخ ...
يلا تحركو شوي قومو الآن بعمل دالة تحول من الدينار للأور وليس العكس ، سهلة يوجد تغيير بسيط فقط
سنكتب الآن دالة لا ترجع شيء أي من نوع void
وهي دالة تقوم بكتابة startimes في الشاشة عدة مرات سوف تأخذ كبيانات عدد مرات كتابة النصالنتيجة :void punition(int nombreDeLignes)
{
int i;
for (i = 0 ; i < nombreDeLignes ; i++)
{
printf("Je ne dois pas recopier mon voisin\n");
}
}
int main(int argc, char *argv[])
{
punition(10);
return 0;
}
Je ne dois pas recopier mon voisin Je ne dois pas recopier mon voisin Je ne dois pas recopier mon voisin Je ne dois pas recopier mon voisin Je ne dois pas recopier mon voisin Je ne dois pas recopier mon voisin Je ne dois pas recopier mon voisin Je ne dois pas recopier mon voisin Je ne dois pas recopier mon voisin Je ne dois pas recopier mon voisinكل شيء واضح وتم التطرق اليه سابقا لدينا دالة void أي لا ترجع شيء لا يوجد فيها return ولدينا متغير
لتحديد عدد الاسطر التي نريدها
مساحة مستطيل :
سهلة لدينا الطول × العرض
لذا ستأخذ الدالة كبيانات الطول longueur والعرض largeur ليكون الكود كالآتي :double aireRectangle(double largeur, double longueur)
{
return largeur * longueur;
}
int main(int argc, char *argv[])
{
printf("Rectangle de largeur 5 et longueur 10. Aire = %f\n", aireRectangle(5, 10));
printf("Rectangle de largeur 2.5 et longueur 3.5. Aire = %f\n", aireRectangle(2.5, 3.5));
printf("Rectangle de largeur 4.2 et longueur 9.7. Aire = %f\n", aireRectangle(4.2, 9.7));
return 0;
}
النتيجة :
Rectangle de largeur 5 et longueur 10. Aire = 50.000000 Rectangle de largeur 2.5 et longueur 3.5. Aire = 8.750000 Rectangle de largeur 4.2 et longueur 9.7. Aire = 40.740000يمكننا أيضا عمله بطريقة أخرى ونضع printf داخل الدالة ونختصر الكودvoid aireRectangle(double largeur, double longueur)
{
double aire = 0;
aire = largeur * longueur;
printf("Rectangle de largeur %f et longueur %f. Aire = %f\n", largeur, longueur, aire);
}
int main(int argc, char *argv[])
{
aireRectangle(5, 10);
aireRectangle(2.5, 3.5);
aireRectangle(4.2, 9.7);
return 0;
}