مقارنة بالدوال المكتبية في C++

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

سبق أن استخدمنا الدالة getche() المكتبية , فأين الإعلان عنها والتعريف بها والتنويه عنها ؟ إن ذلك متضمن في الملف التصديري المعلن عنه في صدر البرنامج conio.h .

الاستغناء عن الإعلان

يمكن الاستغناء عن الإعلان عن الدوال إذا كانت معرفة قبل الدالة التي تستدعيها , فيمكننا مثلا إعادة صياغة البرنامج السابق بالصورة التالية :

Table2.cpp

table2.cpp


 


// table2.cpp


// demonstrates function definition preceding function calls


#include <iostream.h>


#include <conio.h>


                // no function declaration


 


// starline()                            // function definition


void starline()


   {


   for(int j=0; j<45; j++)               


      cout << '*';


   cout << endl;


   }


                     


void main()                          // main follows function


   {


   starline();                       // call to function


   cout << "Data type   Range" << endl;


   starline();                       // call to function


   cout << "char        -128 to 127" << endl


    << "int         -327,68 to 32,767" << endl


    << "double      -2,147,483,648 to 2,147,483,647" << endl;


   starline();                       // call to function


   getch();


   }




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



إمرار القيم بين الدوال



من الواضح أن المثال السابق يفتقد للمرونة , حيث لا تطبع الدالة الفرعية سوي حرف واحد (النجمة) وبعدد واحد (45) . ولهذا السبب سوف نطوره ، بحيث يمكن للدالة الفرعية , والتي سوف نسميها في البرنامج الجديد repchar() , أن تتقبل من الدالة المستدعية شكل الحرف المطلوب طباعته , وعدده .



Tablearg.cpp




tablearg.cpp


 


// tablearg.cpp


// demonstrates function arguments


#include <iostream.h>


#include <conio.h>


 


void repchar(char, int);                  // function declaration


 


void main()


   {


   repchar('-', 43);                      // call to function


   cout << "Data type   Range" << endl;


   repchar('=', 23);                      // call to function


   cout << "char        -128 to 127" << endl


    << "int         -327,68 to 32,767" << endl


    << "double      -2,147,483,648 to 2,147,483,647" << endl;


   repchar('-', 43);                      // call to function


   getche();


   }


 


// repchar()


// function definition


void repchar(char ch, int n)              // function declarator


   {


   for(int j=0; j<n; j++)                 // function body


      cout << ch;


   cout << endl;


   }




لعلك لاحظت التغيير في النمط الأولي للدالة , حيث بدأ سطر الإعلان كالتالي :



Void perchar(ahar, int);



فما ظهر بين القوسين يدل علي أن هذه الدالة يجب أن يرسل لها قيمتان , واحدة من نوع المحارف char , والثانية من نوع العدد الصحيح int . ويطلق علي نقل البيانات بين الدوال إمرار , أو ترحيل المعاملات parameter passing .



وقد جري تعديل مماثل علي سطر التنويه عن الدالة عند التعريف بها , فكان علي الصورة :



Void repchar(char ch, int n)



وقد وضع بين القوسين متغيران , هما ch ,n يسميان " معاملات الدالة prametes , يخزن فيها القيم المريلة للدالة عند استدعائها , وقد عرف المعاملات بداهة بنفس التعريف , الأول محرف والثاني عدد صحيح .



وانعكس التطور علي طريقة استدعاء الدالة , حيث احتوي سطر الاستدعاء علي القيم المرسلة بين قوسين , فكان الأول علي الصورة :



Repchar 43);



وهو يخبر الدالة المستدعاة أن تطبع محرف الشرطة وبعدد 43 مرة . ثم استدعيت الدالة مرة أخري لتطبع علامة التساوي , بعدد 23 مرة ثم مرة ثالثة كرر فيها الأمر الأول . ] يسمي بعض الكتاب القيم المرسلة arguments , والمستقبلة parameter , ولكن الشائع هو أن المصطلحين مترادفان [ .



إمرار المتغيرات



Object-Oriented Programming in C   _Page_0197_Image_0001



شكل إمرار القيم بين الدوال سوف نجري تطويرا أخر علي البرنامج بحث يتقبل قيما يدخلها المستخدم :



Vararg.cpp




vararg.cpp


 


// vararg.cpp


// demonstrates variable arguments


#include <iostream.h>


#include <conio.h>


 


void repchar(char, int);                  // function declaration


 


void main()


   {


   char chin;


   int nin;


 


   cout << "Enter a character: ";


   cin >> chin;


   cout << "Enter number of times to repeat it: ";


   cin >> nin;


   repchar(chin, nin);


   getch();


   }


 


// repchar()


// function definition


void repchar(char ch, int n)              // function declarator


   {


   for(int j=0; j<n; j++)                 // function body


      cout << ch;


   cout << endl;


   }




وتلاحظ هنا أن استدعاء الدالة علي الوجه الأتي :



Repchar(chin, min);



وهما المتغيران اللذان ينقلان القيم للدالة المستدعاة فتخزن قيمتها في معاملاتها ليجري عليهما التنفيذ . ويمكن أن يجري الحوار بين المستخدم والبرنامج علي الشكل الأتي :



Enter a character: +



Enter number of times to repeat: 20



ويبين الشكل أسلوب إمرار القيم يبين الدوال عن طريق المتغيرات .

التسميات: