الدوال في لغة الـ++C
تقوم البرمجة الهيكلية على عدة دوال بدلاً من دالة واحده هي ; ()main
وبإمكانك بعد هذا الموضوع تجزئة برنامجك إلى عدة دوال وكل دالة منها يقوم بوظيفة محددة ثم يسلمها للآخر بعد أن يكون قد أتجز ما هو مطلوب ؛ ومن الممكن النظر إلى الدوال على أنها عبارة عن إتحاد عدة أوامر برمجية في كتلة واحدة ولهذا الإتحاد وظيفة معينة يقوم بأدائها وبالتالي فسيصبح بإمكانك الاستفادة من هذه الدوال في جميع برامجك ، فكما رأيت إحدى دوال المكتبة الرياضية math وما تقوم به من أعمال ، بإمكانك أن تقوم بصنع دوال وضمها في مكتبة واحدة ، وأيضاً فعن طريق الدوال بإمكانك
تجزئة عمل برنامجك إلى أجزاء كثيرة وصغيرة للغاية بدلاً من أن تكون في دالة واحده هي الدالة الرئيسية ; ()main
وبصراحة فإن أغلب البرامج تركت أسلوب التجزئة إلى الدوال وأبدلته بتقسيم البرنامج إلى كائنات والكائنات نفسها تشتمل على دوال كثيرة ، من الضروري للغاية أن تدرك أهمية الدوال إذا ما أردت التقدم في البرمجة فأولاً هي مدخل إلى الكائنات وثانياً هي أحد أهم مواضيع لغة السي بلس بلس (++c) والتي لم تفقد أهميتها إلى الآن.
أساسيات الدوال (التوابع):
لنلقي نظرة بسيطة على الدالة ; ()main ستجد أنه مكون من ثلاثة أشياء كما هي موضحة هنا:
كما ترى فإن للدالة; ()main بثلاثة أجزاء الأول هو الرأس والثاني هو جسم الدالة الذي بين القوسين والثالث هو القيمة المعادة للدالة وتكتب هكذا return 0
لفهم أفضل لما نقول فسنمضي قدماً في كتابة تابع يقوم بجمع عددين يدخلهما المستخدم.
وبإمكانك بعد هذا الموضوع تجزئة برنامجك إلى عدة دوال وكل دالة منها يقوم بوظيفة محددة ثم يسلمها للآخر بعد أن يكون قد أتجز ما هو مطلوب ؛ ومن الممكن النظر إلى الدوال على أنها عبارة عن إتحاد عدة أوامر برمجية في كتلة واحدة ولهذا الإتحاد وظيفة معينة يقوم بأدائها وبالتالي فسيصبح بإمكانك الاستفادة من هذه الدوال في جميع برامجك ، فكما رأيت إحدى دوال المكتبة الرياضية math وما تقوم به من أعمال ، بإمكانك أن تقوم بصنع دوال وضمها في مكتبة واحدة ، وأيضاً فعن طريق الدوال بإمكانك
تجزئة عمل برنامجك إلى أجزاء كثيرة وصغيرة للغاية بدلاً من أن تكون في دالة واحده هي الدالة الرئيسية ; ()main
وبصراحة فإن أغلب البرامج تركت أسلوب التجزئة إلى الدوال وأبدلته بتقسيم البرنامج إلى كائنات والكائنات نفسها تشتمل على دوال كثيرة ، من الضروري للغاية أن تدرك أهمية الدوال إذا ما أردت التقدم في البرمجة فأولاً هي مدخل إلى الكائنات وثانياً هي أحد أهم مواضيع لغة السي بلس بلس (++c) والتي لم تفقد أهميتها إلى الآن.
الهدف الأساسي من استخدام الدوال هو تنظيم البرنامج في شكل منطقي . فتقسيم البرنامج إلي دوال هو أحد المبادئ الأساسية في البرمجة الهيكلية او الكائنية .
والسبب الأخر لاستخدام الدوال هو اختصار البرامج , فأية مجموعة من التعليمات ينتظر أن تتكرر في مواضع من البرامج , تكون مؤهلة لأن توضع في دالة مستقلة . ويختزن الكود الخاص بهذه الدالة في الذاكرة مرة واحدة , مهما تكرر استخدامها . ويبين الشكل كيفية إستثارة الدالة من أجزاء أخري من البرامج .
شكل التحكم في استثارة الدوال
أساسيات الدوال (التوابع):
لنلقي نظرة بسيطة على الدالة ; ()main ستجد أنه مكون من ثلاثة أشياء كما هي موضحة هنا:
int main ( )
{
statment1;
statment2;
statment3;
return 0;
}
كما ترى فإن للدالة; ()main بثلاثة أجزاء الأول هو الرأس والثاني هو جسم الدالة الذي بين القوسين والثالث هو القيمة المعادة للدالة وتكتب هكذا return 0
لفهم أفضل لما نقول فسنمضي قدماً في كتابة تابع يقوم بجمع عددين يدخلهما المستخدم.
1. #include <iostream>
2. using namespace std;
3.
4. int max (int m,int g)
5. {
6. if (m>g)return m;
7. else if (m<g)return g;
8. else return g;
9. }
10.
11. int main()
12. {
13. int num1,num2;
14. cin>>num1;
15. cin>>num2;
16. int max1=max(num1,num2);
17. cout << max1 << endl;
18. return 0;
19. }
كما ترى من السطر 4 إلى 9 فلقد قمنا بكتابة دالة أطلقنا عليها إسم max وكما ترى في السطر الرابع فإن الدالة يعيد قيمة من النوع int ويستقبل عددين اثنين من النوع int انظر:
لكل دالة قيمة معادة لها نوع محدد يتم إخبار المترجم بنوعها في أول سطر
من تعريف التابع هكذا:
إن الكلمة الاول في الأمر الحالي والتي هي عدد صحيح تعبر عن القيمة المعادة لهذا التابع أما المتغيرات (إكس؛ وواي) الموجودة بين القوسين في الامر الحالي فهي ما تسمى بالوسائط وهي البيانات الداخلة في التابع لمعالجتها ضمن التابع ، فمثلاً في الكود السابق فإن البيانات الداخلة هي عددين اثنين أدخلهما المستخدم ليقارن التابع بينهما ويعيد الأكبر من بينهما.
في السطر السادسيقارن التابع بين العدد الاول والثاني (أيهما أكبر) ثم يقوم عبر الكلمة المفتاحية return بإعادة العدد الأكبر ، والأمر نفسه ينطبق في السطرين السابع والثامن.
لكل دالة قيمة معادة لها نوع محدد يتم إخبار المترجم بنوعها في أول سطر
من تعريف التابع هكذا:
int max (int x, int y);
إن الكلمة الاول في الأمر الحالي والتي هي عدد صحيح تعبر عن القيمة المعادة لهذا التابع أما المتغيرات (إكس؛ وواي) الموجودة بين القوسين في الامر الحالي فهي ما تسمى بالوسائط وهي البيانات الداخلة في التابع لمعالجتها ضمن التابع ، فمثلاً في الكود السابق فإن البيانات الداخلة هي عددين اثنين أدخلهما المستخدم ليقارن التابع بينهما ويعيد الأكبر من بينهما.
في السطر السادسيقارن التابع بين العدد الاول والثاني (أيهما أكبر) ثم يقوم عبر الكلمة المفتاحية return بإعادة العدد الأكبر ، والأمر نفسه ينطبق في السطرين السابع والثامن.
الإعلان عن الدوال
بالضبط كما لا يمكنك استخدام متغير دون أن تخبر محول الصياغة عنه , لا يمكنك أن تستخدم دالة دون أن تعرفه بها . وفي برنامجنا المعطي , يتم ذلك بالإعلان عن الدالة في بداية البرنامج بالسطر :
Void starline();
ويخبر هذا السطر محول الصياغة بأننا في موضع لاحق سوف نقدم دالة باسم starline , وكلمة void في بداية الإعلان تعني أن الدالة لن تعيد قيما , عدم إدراج شئ بين القوسين التابعين لها يعني أن الدالة ليست محتاجة لمعاملات . (يمكنك أن تضع بين القوسين الكلمة الحاكمة void لإخبار محول الصياغة بذلك , ولكن هذا الإجراء ليس ضروريا في البرمجة بالسي عموما ) وسوف نقول المزيد عن إعادة القيم والاحتياج للمعاملات فيما بعد . ولابد أن تلاحظ أن سطر الإعلان ينتهي بالفاصلة المنقوطة .
ويسمي الشكل النمطي لها . فالسطر المبين يخبر محول الصياغة بأنه توجد دالة بهذا الشكل في الطريق , ومن المستحسن أن تأخذ فكرة عنها قبل لقائها .
استدعاء الدوال
استدعاء الدالة يعني استثارتها للعمل , ويكون ذلك بذكر اسمها في سطر من أسطر الدالة المستدعية , كما في السطر التالي من الدالة main()
Starline();
والذي تكرر ثلاث مرات .
ويتسبب استدعاء الدالة أن ينتقل إليها التحكم في تنفيذ البرنامج , ثم يعاد التحكم للدالة المستدعية بعد أن تنتهي الدالة المستدعاة من عملها .
شكل صياغة الدوال
العنصر | الوظيفة | أمثلة |
الإعلان (النمط الأولي) | توصيف الدالة : اسمها , عدد ونوع المعاملات التي تحتاج لها , نوع القيمة التي تعيدها , ينتهي بفاصلة منقوطة | Void func(); Void func(int); Int func(int) |
الاستدعاء | استثارة الدالة نفسها | Func(); |
التعريف | صياغة الدالة نفسها | Void func() { /// lines of code } |
التنويه | أول سطر في التعريف , نفس وظيفة الإعلان, تسمية المعاملات | Void func() Voie func(int) Int funce(int) |
الموضوع تم تجميعة..................................
مثال : سوف نقوم بانشاء دالتين لحساب نتيجة طالب معين لثلاث مواد كالتالي:
اولا / الدالة الاولى سوف تقوم بحساب مجموع ثلاث مواد الطالب
ثانيا / الدالة الثانية سوف تقوم بحساب معدل نتيجة الطالب(المعدل بالمئة)
اولا / الدالة الاولى سوف تقوم بحساب مجموع ثلاث مواد الطالب
ثانيا / الدالة الثانية سوف تقوم بحساب معدل نتيجة الطالب(المعدل بالمئة)
#include<iostream>
#include<string>
using namespace std;
int funtot(int sub1,int sub2,int sub3){
int tot=0;
tot=sub1+sub2+sub3;
return tot;
}
double funavg(int tot){
double avg=0.0;
avg=tot/3;
return avg;
}
int main()
{
string student_name;
int sub11,sub12,sub13;
cin>>student_name;
cout<<"Enter the first course\n";
cin>>sub11;
cout<<"Enter the second course\n";
cin>>sub12;
cout<<"Enter the third course\n";
cin>>sub13;
tot1=funtot(sub11,sub12,sub13);
avg1=funavg(tot1);
cout<<"\t\t***** Student Name : "<<student_name;<<"\n";
cout<<"\t\t The Total degrees Courses is : "<<tot1<<"\n";
cout<<"\t\t Average is : "<<avg1<<"\n";
return 0;
}
#include<string>
using namespace std;
int funtot(int sub1,int sub2,int sub3){
int tot=0;
tot=sub1+sub2+sub3;
return tot;
}
double funavg(int tot){
double avg=0.0;
avg=tot/3;
return avg;
}
int main()
{
string student_name;
int sub11,sub12,sub13;
int tot1=0;
double avg1=0.0;
cout<<"enter student name\n";cin>>student_name;
cout<<"Enter the first course\n";
cin>>sub11;
cout<<"Enter the second course\n";
cin>>sub12;
cout<<"Enter the third course\n";
cin>>sub13;
tot1=funtot(sub11,sub12,sub13);
avg1=funavg(tot1);
cout<<"\t\t***** Student Name : "<<student_name;<<"\n";
cout<<"\t\t The Total degrees Courses is : "<<tot1<<"\n";
cout<<"\t\t Average is : "<<avg1<<"\n";
return 0;
}
اولا /قُمنا بتعريف دالة لحساب المجموع وهي ()funtot والتي تستقبل ثلاثة متغيرات sub1 وsub2 وsub3 (المادة الاولى و المادة الثانية و المادة الثالثة) وتقوم بإرجاع المجموع في المتغير tot كما هو موضح
return tot ;
ثانيا /قُمنا بتعريف دالة لحساب المعدلوهي ()funavg والتي تستقبل متغير واحد وهو مجموع الدرجات tot وتقوم بإرجاع المعدل في المتغير avg كما هو موضح
return avg;
وبعدها قُمنا بأستدعاء الدالتين داخل الدالة الرئيسية main وتخزين كل دالة في متغير كما هو موضح
tot1=funtot(sub11,sub12,sub13);
avg1=funavg(tot1);
وبالتوفيق للجميع,,,,
هناك تعليق واحد:
ممكن حل هذين السؤالين الاول :
3: Can main be called recursively? Write a program containing a
function main. Include static local variable count and initialize it to
1. Post increment and print the value of count each time main is
called.
السؤال الثاني :
Q2: (Visualizing Recursion) it is interesting to watch recursion “in action.”
Modify the factorial function to print its local variable and recursive call
parameter. For each recursive call, display the outputs on a separate line and
add a level of indentation.
Do your utmost to make the outputs clear, interesting and meaningful. Your
goal here is to design and implement an output format that helps a person
understand recursion better.
إرسال تعليق
EmoticonEmoticon