كما ترى، استدعاء الدالة triple يتم داخل الدالة printf. ماذا يفعل الجهاز حينما يصل إلى هذا السطر من الشفرة المصدرية؟
الأمر سهل، يجب بأن السطر يبدؤ بـprintf، فسيقوم إذا باستدعاء الدالة printf. يبعث إلى هذه الأخيرة كل الخصائص التي كتبناها. أول خاصية هي النص الذي نريد طباعته و الثاني هو رقم. يجد الجهاز بأنه قبل أن يبعث رقماً إلى الدالة printf عليه أولا استدعاء الدالة triple. هذا ما يقوم به : يستدعي triple، يقوم بالحسابات و ما إن يتلقّ النتيجة يبعثها للدالة printf.
هذه الحالة تشبه نوعاً ما تداخل استدعاء الدوال. الشيء الذي نستنتجه من هذا هو أنه بإمكان دالة أن تستدعي دالة أخرى. هذا هو مبدئ البرمجة بلغة السي! كلّ شيء مركّب مع الأشياء الأخرى، كما في لعبة الليغو Lego.
في النهاية، سيقى الشيء الأصعب هو كتابة الدوال. ما إن تكتبها، لن يبق عليك سوى استدعاؤها دون أن تقلق من العمليات التي تجري بداخلها! هذا سيسمح لك يتبسيط كتابة برامجك بشكل كبير. و صدّقني ستحتاج إلى هذه المبادئ كثيراً.
أمثلة للفهم الجيّد :
كان عليك أن تلاحظ شيئاً: أنا شخص يلحّ كثيراً على الأمثلة.
المفاهيم النظرية مهمّة لكنها لا تكفي لتذكّر كلّ شيء، كما أنك لن تفهم في أي شيء يمكنك استغلالها لاحقاً. و هذا أمر مؤسف.
سأريك إذا الآن عدة استعمالات للدوال لكي تأخذ فكرة عن أهميّتها. سأقدّم الكثير من الأمثلة المتخلفة محاولاً أن أعطيك لمحة عن كلّ أنواع الدوال التي يمكن أن تتواجد.
لن أعلّمك أي شيء جديد لكنه الوقت لرؤية أمثلة تطبيقية. إذا كنت قد فهمت ما سبق فهذا أمر جيّد و لن يعيقك أي مثال مما سيأتي.
التحويل من الاورو الى الفرنك :
سنبدؤ بدالة مشابهة كثيراً للدالة triple، لكنها تحمل أهمية لابأس بها هذه المرة: دالة تحوّل من الأورو للفرنك. لمن لا يعرف فإن 1 أورو = 6,55957 فرنك.
سننشئ دالة نسميها conversion. هذه الدالة تأخذ متغيرة كمدخل من نمط double لأننا سنتعامل بالضرورة مع أعداد عشرية، إقرءها بتمعّن :
doubleconversion(doubleeuros)
{
doublefrancs=0;
francs=6.55957*euros;
returnfrancs;
}
intmain(intargc,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));
return0;
}
ويعطينا كنتيجة :
10 euros = 65.595700F 50
euros = 327.978500F 100
euros = 655.957000F 200
euros = 1311.914000F
لا يوجد اختلاف كبير مقارنة بالدالة triple، لقد أخبرتك بذلك مسبّقاً. الدالة conversion طويلة قليلاً و يمكن أن يتم اختصارها في سطر واحد، سأترك لك عناء فعل ذلك بنفس الطريقة التي شرحتها لك مسبقاً.
في الدالة الرئيسية main، تعمّدت وضع الكثير من الأسطر printf لأريك الهدف من استعمال الدوال. لكي أحصل على قيمة 50 أورو، ليس علي سوى استدعاء الدالة conversion بإعطائها 50 كقيمة إدخال. و إذا أردت تحويل 100 أورو إلى الفرنك، كل ما أحتاج فعله هو وضع القيمة 100 في مكان القيمة 50.
حان دورك! اكتب دالة ثانية ( دائماً قبل الدالة الرئيسية ) تقوم بالعملية العكسية أي تحول من الفرنك إلى الأورو. لن يكون الأمر صعباً. هناك إشارة عملية تتغير ليس إلا.
العقوبة :
سنهتم الآن بدالة لا تقوم بإرجاع أي شيء ( لا وجود للمخرج ) .
هي دالة تقوم بإظهار نفس النص على الشاشة بالقدر الذي نحن نريد. هذه الدالة تأخذ كمدخل : عدد المرات التي نريد أن يظهر بها النص في الشاشة ( نص العقوبة ).
void punition(int numberOfLines)
{
int i;
for (i = 0 ; i < numberOfLines; i++)
{
printf(" I won't misbehave in class again\n");
}
}
int main(int argc, char *argv[])
{
punition(10);
return 0;
}
النتيجة :
I won't miss behave in class again
I won't miss behave in class again
I won't miss behave in class again
I won't miss behave in class again