الدرس الرابع الدوال
2 مشترك
صفحة 1 من اصل 1
الدرس الرابع الدوال
موضوع اليوم عن الدوال او الروتينات الفرعية وهي اجزاء من البرنامج مثل الدالة الرئيسية تقوم بعمل مهمة معينة تتكرر في برنامجك او تستخدمها في برامج اخرى او حتى اذا كانت لا تتكرر من فوائدها
· تقسيم البرنامج الى اجزاء صغيرة تستدعى وقت اللزوم
· عدم ازدحام الدالة الرئيسية للبرنامج بأوامر كثيرة
· تقسيم البرنامج الى اجزاء يمكن اختبارها منفصلة لسرعة تحديد الخلل بالبرنامج
· توفير المجهود والوقت والتفكير بعمل مكتبة خاصة بك تعيد استخدام الدوال التي استخدمتها في برنامج وذلك في برنامج آخر عند اللزوم
· تقسيم العمل بين المبرمجين عن العمل في مشروع جماعي لانتاج برنامج كبير
· تبادل الخبرات بين مطوري البرامج بنشر اجزاء يستخدمها الآخرون في برامجهم
لتطبيق ذلك دعنا نحضر البرنامج الذي تناولناه في الدرس الثالث لاعطائه مزيدا من القوة والتطوير باستخدام الدوال
#include <iostream.h>
int main()
{
int x , y , z;
for(x=1;x<13;x++)
{
for(y=1;y<13;y++)
{
z = x * y;
cout<<x<<”*”<<y<<”=”<<z<<endl;
}
}
return 0;
}
لوكنت قد تذكرت الآن فان البرنامج كان يقوم بعمل جدول الضرب من جدول واحد الى جدول 12 واحتوى كامل التعليمات داخل الدالة الرئيسية دعنا نستخدم الدوال ولنسمي هذه الدالة DoiT
#include <iostream.h>
void DoiT (void);
int main()
{
DoiT ();
}
// This is the new function
void DoiT (void)
{
int x , y , z;
for(x=1;x<13;x++)
{
for(y=1;y<13;y++)
{
z = x * y;
cout<<x<<”*”<<y<<”=”<<z<<endl;
}
}
return ;
}
مايخص الدالة الجديدة مكتوب باللون الاحمر فقبل الدالة الرئيسة main تم الاعلان عن نموذج الدالة او ما يسمى prototype بهذا الشكل
وفيه نخبر الكومبايلر بشكل وما ستكون عليه الدالة كما يلي
والآن الى باقي سطور البرنامج لاستكمال الشرح int main()
{
DoiT ();
}
كما سبق ولابد ان نعلن عن الدالة الرئيسية للبرنامج وهو الزام ثم داخل بلوك الدالة الرئيسية قمنا بالنداء على الدالة للتنفيذ وذلك بكتابة اسمها ثم قوسين لايوجد بينهما شئ هل تتذكر لماذا لان البارامترات المطلوب تمريرها للدالة لم تعطى اي void ولكن بالطبع لاتكتب void ولكن يكون ذلك في الاعلان عن الدالة فقط وهو على الصورة التالية
تلى ذلك قوس نهاية البلوك للدالة الرئيسة ثم جسم او هيكل الدالة نفسها ويبدء بنفس الاعلان عن اسم الدالة او البروتوتايب ولكن بدون فاصلة منقوطة في النهاية وكما تلاحظ وسبق ان قلنا ان الفاصلة المنقوطة لاتأتي بعد main() وبنفس الطريقة لاتأتي في مقدمة بلوك الدالة
void DoiT (void)
{
ضع اوامر الدالة هنا
}
ثم قوس بداية بلوك الدالة ثم مابداخلها من اوامر وقوس النهاية ودعنا ننتهز فرصة الدوال لاعطاءمزيد من التحسينات على البرنامج حيث ان البرنامج ينتج فقط جدول الضرب من جدول 1 الى جدول 12 فلماذا لانجعلها دالة عامة تنتج مايحلو لنا من جداول ضرب من المؤكد انك تتفق معي في ذلك وبذلك نستفيد من قوة الدوال وتصبح دالة عامة غير موجهه لمهمة ثابته فنحن نريد ان نحدد نحن بداية الجداول ونهايتها فتارة تطبع من جدول 7 الى جدول 20 وتارة تطبع من جدول 17 الى 40 وهكذا اليس هذا افضل سوف نمرر للدالة قيمة البداية وقيمة النهاية مع اجراء التعديلات اللازمة لذلك.
#include <iostream.h>
void DoiT (int Start , int End);
int main()
{
int Start , End;
cout<<"Please input start value ?: ";
cin>>Start;
cout<<"Please input end value ?: ";
cin>>End;
DoiT (Start , End);
}
// This is the new function
void DoiT (int Start , int End)
{
int x , y , z;
for(x=Start;x<End+1;x++)
{
for(y=Start;y<End+1;y++)
{
z = x * y;
cout<<x<<”*”<<y<<”=”<<z<<endl;
}
}
return ;
}
لتسهيل الامر عليك وضعت لك لون اصفر على التعديلات التي اجريتها للوصول الى الهدف المنشود لقد وضعنا في اقواس البروتوتايب اعلان عن تمرير متغيرين صحيحين الى الدالة
void DoiT (int Start , int End);
ثم داخل الدالة الرئيسية اعلنا عن استخدام متغيرين جديدين من نوع الاعداد الصحيحة هما int Start , End;
تلى ذلك امر بطبع رسالة تطلب منك ادخال قيمة بداية الجدول وبعده امر بعملية الادخال نفسها ليعرف البرنامج القيمة المبدئية لبداية الجدول
cout<<"Please input start value ?: ";
cin>>Start;
مثلهما تماما للمتغير الثاني ليعرف البرنامج قيمة النهاية والتي كانت ثابتة سابقا على القيمة 12 ونحن نريد برنامج اكثر مرونة ومطوع لكل الحالات
cout<<"Please input end value ?: ";
cin>>End;
بعد ان ادخلت قيمة البداية والنهاية فكما ذكرنا تم تعديل الدالة لتمرير متغيرين لها يتغيران مع كل ادخال والآن لننادي الدالة ممرين لها القيمتين الذين ادخلهما مستخدم البرنامج
DoiT (Start , End);
ثم اجرينا تعديل على اسم الدالة نفسها ليوافق البروتوتايب او اعلان الدالة الجديد في مقدمة البرنامج طبعا بدون فاصلة منقوطة // This is the new function
void DoiT (int Start , int End)
{
ثم تلى ذلك وضع القيمة Start الممررة للدالة كبداية عداد للحلقتين بدلا من القيمة 1 وكذلك المتغير End الممرر الى الدالة كنهاية لعداد الحلقتين بدلا من القيمة 13 في مثال الدرس الماضي
ويجب دائما ان تفكر في احتمالات خطأ مدخل البيانات فمثلا ماذا لو أخطأ وادخل قيمة البداية اكبر من قيمة النهاية بالطبع سيحدث خطأ بالبرنامج وسيحدث نفس الخطأ اذا ادخلهم كقيمتين متساويتين وعليه يجب وضع شرط لذلك كما سيلي توضيحه كتحسين للبرنامج
#include <iostream.h>
void DoiT (int Start , int End);
int main()
{
int Start , End;
A1:
cout<<"Please input start value ?: ";
cin>>Start;
cout<<"Please input end value ?: ";
cin>>End;
if (Start >= End) goto A1;
DoiT (Start , End);
}
لقد وضعت الاضافة الجديدة بخلفية حمراء للتوضيح وهي عبارة عن عنوان اختياري قبل عملية الادخال ثم بعد الادخال شرط انه اذا كانت قيمة البداية اكبر من اوتساوي قيمة النهاية فعليك بالذهاب الى العنوان المحدد A1 اي اعادة الادخال ولامانع من اضافة رسالة تحذير لتوضيح فيما اخطأ مدخل البيانات
#include <iostream.h>
float Mul (float A , float B);
int main()
{
float A , B , R;
cout<<"Please input A ?: ";
cin>>A;
cout<<"Please input end B ?: ";
cin>>B;
R = Mul (A , B);
cout<<R;
}
float Mul (float A , float B)
{
return A*B;
}
الدالة الجديدة اسميناها Mul وتعيد هذه الدالة قيمة عشرية وهي حاصل ضرب قيمتين عشريتين تم تمريرها اليها وكما ترى المثال بسيط ومعظم اجزائه سبق شرحها
· تقسيم البرنامج الى اجزاء صغيرة تستدعى وقت اللزوم
· عدم ازدحام الدالة الرئيسية للبرنامج بأوامر كثيرة
· تقسيم البرنامج الى اجزاء يمكن اختبارها منفصلة لسرعة تحديد الخلل بالبرنامج
· توفير المجهود والوقت والتفكير بعمل مكتبة خاصة بك تعيد استخدام الدوال التي استخدمتها في برنامج وذلك في برنامج آخر عند اللزوم
· تقسيم العمل بين المبرمجين عن العمل في مشروع جماعي لانتاج برنامج كبير
· تبادل الخبرات بين مطوري البرامج بنشر اجزاء يستخدمها الآخرون في برامجهم
لتطبيق ذلك دعنا نحضر البرنامج الذي تناولناه في الدرس الثالث لاعطائه مزيدا من القوة والتطوير باستخدام الدوال
#include <iostream.h>
int main()
{
int x , y , z;
for(x=1;x<13;x++)
{
for(y=1;y<13;y++)
{
z = x * y;
cout<<x<<”*”<<y<<”=”<<z<<endl;
}
}
return 0;
}
لوكنت قد تذكرت الآن فان البرنامج كان يقوم بعمل جدول الضرب من جدول واحد الى جدول 12 واحتوى كامل التعليمات داخل الدالة الرئيسية دعنا نستخدم الدوال ولنسمي هذه الدالة DoiT
#include <iostream.h>
void DoiT (void);
int main()
{
DoiT ();
}
// This is the new function
void DoiT (void)
{
int x , y , z;
for(x=1;x<13;x++)
{
for(y=1;y<13;y++)
{
z = x * y;
cout<<x<<”*”<<y<<”=”<<z<<endl;
}
}
return ;
}
مايخص الدالة الجديدة مكتوب باللون الاحمر فقبل الدالة الرئيسة main تم الاعلان عن نموذج الدالة او ما يسمى prototype بهذا الشكل
void DoiT (void);
وفيه نخبر الكومبايلر بشكل وما ستكون عليه الدالة كما يلي
الصيغة | التفسير |
void | ماهي القيمة التي سوف تعيدها الدالة للدالة التي استدعيت منها وذلك بالامر return هنا استخدمنا void بمعنى لاشئ وبالتالي علينا استبدال return 0 التي استخدمناها في الدرس الثالث الى الامر return فقط حيث اننا اعلنا ان الدالة غير مطلوب منها اعادة شئ |
DoiT | اسم تختاره لدالتك بحيث يكون معبرا قليلا عما ستفعل انا هنا لم اختر اسم معبر |
( | قوس لاحتواء البارامترات التي ستمرر للدالة |
void | البارامترات التي ستمرر للدالة وهنا اخترنا void بمعنى لن نمرر لها شئ |
); | قوس اغلاق لمجموعة البارامترات يليها فاصلة منقوطة |
والآن الى باقي سطور البرنامج لاستكمال الشرح int main()
{
DoiT ();
}
كما سبق ولابد ان نعلن عن الدالة الرئيسية للبرنامج وهو الزام ثم داخل بلوك الدالة الرئيسية قمنا بالنداء على الدالة للتنفيذ وذلك بكتابة اسمها ثم قوسين لايوجد بينهما شئ هل تتذكر لماذا لان البارامترات المطلوب تمريرها للدالة لم تعطى اي void ولكن بالطبع لاتكتب void ولكن يكون ذلك في الاعلان عن الدالة فقط وهو على الصورة التالية
DoiT();
تلى ذلك قوس نهاية البلوك للدالة الرئيسة ثم جسم او هيكل الدالة نفسها ويبدء بنفس الاعلان عن اسم الدالة او البروتوتايب ولكن بدون فاصلة منقوطة في النهاية وكما تلاحظ وسبق ان قلنا ان الفاصلة المنقوطة لاتأتي بعد main() وبنفس الطريقة لاتأتي في مقدمة بلوك الدالة
void DoiT (void)
{
ضع اوامر الدالة هنا
}
ثم قوس بداية بلوك الدالة ثم مابداخلها من اوامر وقوس النهاية ودعنا ننتهز فرصة الدوال لاعطاءمزيد من التحسينات على البرنامج حيث ان البرنامج ينتج فقط جدول الضرب من جدول 1 الى جدول 12 فلماذا لانجعلها دالة عامة تنتج مايحلو لنا من جداول ضرب من المؤكد انك تتفق معي في ذلك وبذلك نستفيد من قوة الدوال وتصبح دالة عامة غير موجهه لمهمة ثابته فنحن نريد ان نحدد نحن بداية الجداول ونهايتها فتارة تطبع من جدول 7 الى جدول 20 وتارة تطبع من جدول 17 الى 40 وهكذا اليس هذا افضل سوف نمرر للدالة قيمة البداية وقيمة النهاية مع اجراء التعديلات اللازمة لذلك.
#include <iostream.h>
void DoiT (int Start , int End);
int main()
{
int Start , End;
cout<<"Please input start value ?: ";
cin>>Start;
cout<<"Please input end value ?: ";
cin>>End;
DoiT (Start , End);
}
// This is the new function
void DoiT (int Start , int End)
{
int x , y , z;
for(x=Start;x<End+1;x++)
{
for(y=Start;y<End+1;y++)
{
z = x * y;
cout<<x<<”*”<<y<<”=”<<z<<endl;
}
}
return ;
}
لتسهيل الامر عليك وضعت لك لون اصفر على التعديلات التي اجريتها للوصول الى الهدف المنشود لقد وضعنا في اقواس البروتوتايب اعلان عن تمرير متغيرين صحيحين الى الدالة
void DoiT (int Start , int End);
ثم داخل الدالة الرئيسية اعلنا عن استخدام متغيرين جديدين من نوع الاعداد الصحيحة هما int Start , End;
تلى ذلك امر بطبع رسالة تطلب منك ادخال قيمة بداية الجدول وبعده امر بعملية الادخال نفسها ليعرف البرنامج القيمة المبدئية لبداية الجدول
cout<<"Please input start value ?: ";
cin>>Start;
مثلهما تماما للمتغير الثاني ليعرف البرنامج قيمة النهاية والتي كانت ثابتة سابقا على القيمة 12 ونحن نريد برنامج اكثر مرونة ومطوع لكل الحالات
cout<<"Please input end value ?: ";
cin>>End;
بعد ان ادخلت قيمة البداية والنهاية فكما ذكرنا تم تعديل الدالة لتمرير متغيرين لها يتغيران مع كل ادخال والآن لننادي الدالة ممرين لها القيمتين الذين ادخلهما مستخدم البرنامج
DoiT (Start , End);
ثم اجرينا تعديل على اسم الدالة نفسها ليوافق البروتوتايب او اعلان الدالة الجديد في مقدمة البرنامج طبعا بدون فاصلة منقوطة // This is the new function
void DoiT (int Start , int End)
{
ثم تلى ذلك وضع القيمة Start الممررة للدالة كبداية عداد للحلقتين بدلا من القيمة 1 وكذلك المتغير End الممرر الى الدالة كنهاية لعداد الحلقتين بدلا من القيمة 13 في مثال الدرس الماضي
ويجب دائما ان تفكر في احتمالات خطأ مدخل البيانات فمثلا ماذا لو أخطأ وادخل قيمة البداية اكبر من قيمة النهاية بالطبع سيحدث خطأ بالبرنامج وسيحدث نفس الخطأ اذا ادخلهم كقيمتين متساويتين وعليه يجب وضع شرط لذلك كما سيلي توضيحه كتحسين للبرنامج
#include <iostream.h>
void DoiT (int Start , int End);
int main()
{
int Start , End;
A1:
cout<<"Please input start value ?: ";
cin>>Start;
cout<<"Please input end value ?: ";
cin>>End;
if (Start >= End) goto A1;
DoiT (Start , End);
}
لقد وضعت الاضافة الجديدة بخلفية حمراء للتوضيح وهي عبارة عن عنوان اختياري قبل عملية الادخال ثم بعد الادخال شرط انه اذا كانت قيمة البداية اكبر من اوتساوي قيمة النهاية فعليك بالذهاب الى العنوان المحدد A1 اي اعادة الادخال ولامانع من اضافة رسالة تحذير لتوضيح فيما اخطأ مدخل البيانات
الى مثالنا الاخير وهو دالة تعيد قيمة ويممر اليها بيانات
#include <iostream.h>
float Mul (float A , float B);
int main()
{
float A , B , R;
cout<<"Please input A ?: ";
cin>>A;
cout<<"Please input end B ?: ";
cin>>B;
R = Mul (A , B);
cout<<R;
}
float Mul (float A , float B)
{
return A*B;
}
الدالة الجديدة اسميناها Mul وتعيد هذه الدالة قيمة عشرية وهي حاصل ضرب قيمتين عشريتين تم تمريرها اليها وكما ترى المثال بسيط ومعظم اجزائه سبق شرحها
Aminos- .:: V I P ::.
- عدد المساهمات : 14
السٌّمعَة : 50
تاريخ التسجيل : 11/06/2010
رد: الدرس الرابع الدوال
تباركلاه عليك خاي آمين
تسلم الأيادي ما قصرت
الله يعطيك الصحة
تسلم الأيادي ما قصرت
الله يعطيك الصحة
younes-bcr- .::|| الإدارة ||::.
- عدد المساهمات : 93
السٌّمعَة : 0
تاريخ التسجيل : 09/06/2010
العمر : 36
صفحة 1 من اصل 1
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى