مقارنة بالدوال المكتبية في 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 , ولكن الشائع هو أن المصطلحين مترادفان [ .
إمرار المتغيرات
شكل إمرار القيم بين الدوال سوف نجري تطويرا أخر علي البرنامج بحث يتقبل قيما يدخلها المستخدم :
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
ويبين الشكل أسلوب إمرار القيم يبين الدوال عن طريق المتغيرات .
تعليقات
إرسال تعليق