You are on page 1of 13

‫• الدوال (‪)Functions‬‬

‫حلظ املربجمون و مع تطور و تعقيد الربامج أن أسلوب سرد السطور الربجمية سوف يوصلنا إىل درجة من‬
‫التعقيد كبرية لذلك اقرتحوا أسلوب الربجمة البنائية و الذي يعد استخدام الدوال وجها من وجوهها فبدال‬
‫من أن يتم تكرر القرارات الربجمية اليت أالحتياج إليها يف الربانمج ( لنفرض عدد التكرار يصل اىل ألف‬
‫مرة ) فمن االفضل واالجدر وضع هذه السطور ضمن تركيب معني يطلق علية اسم داله ويتم أستدعاء‬
‫هذه الداله عند احلاجه لتنفيذ تلك القرارت املتكررة وابلثايل سوف توفر هذه العملية عدة فوائد وهى‬
‫كالثايل‪:‬‬

‫تساعد الدوال املخزنة يف ذاكرة احلاسب على اختصار الربانمج إذ يكتفى ابستعادهتا ابمسها فقط‬ ‫‪.1‬‬
‫لتقوم ابلعمل املطلوب‪.‬‬
‫تساعد ال دوال املخزنة يف مكتبة احلاسب ‪ ،‬أو اليت يكتبها املربمج على تاليف عمليات التكرار‬ ‫‪.2‬‬
‫يف خطوات الربانمج اليت تتطلب عمال طويال وشاقا‪.‬‬
‫تساعد الدوال اجلاهزة على تسهيل عملية الربجمة نفسها‪.‬‬ ‫‪.3‬‬
‫توفر مساحة من الذاكرة املطلوبة‪.‬‬ ‫‪.4‬‬
‫اختصار عمليات زمن الربجمة وتنفيذ الربانمج أبسرع وقت ممكن‬ ‫‪.5‬‬

‫وأتخذ الدالة الشكل العام التايل‪:‬‬

‫)‪Type name(parameter1, parameter2,…….‬‬


‫{‬
‫;‪Statement‬‬
‫;)‪Return(type‬‬
‫}‬

‫جامعة طرابلس االهلية ‪/‬قسم تقنية المعلومات‬ ‫صفحه رقم ‪1‬‬


‫حيث أن ‪ Type‬هو نوع القيمة اليت سوف ترجعها الدالة بعد أن تنتهي من عملها ‪.‬الن الدوال تكون‬
‫على نوعني ‪:‬‬

‫تعيد قيمة بعد استدعائها وتكون بشكل التايل عند استدعائها وجيب أن حتتوي على ‪return‬‬ ‫‪.1‬‬

‫لتعيد قيمة للربانمج‪.‬‬


‫ال تعيد أي قيمة للربانمج فهى تستدعى لتنفذ ما يف داخلها وينتهي كل شيء وال حتتوي يف‬ ‫‪.2‬‬

‫داخلها على ‪ return‬وطريقة استدعائها يف الربانمج فقط تتم من خالل كتابة اسم الدالة‬

‫مالحظات هامه‬
‫‪ -‬يف حالة استخدام دوال ذات القيمه االسرتجاعية ‪ ،‬جيب خزن القيمة املعادة يف متغري بنفس‬
‫نوع القيمة املعادة اي لو كان نوع القيمة املعادة هو ‪ integer‬جيب أن يتم تعريف املتغري على‬
‫انه متغري من نوع ‪ integer‬لتخزن به النتيجة القيمة املرجعة‪.‬‬
‫‪ -‬املتغريات املعرفة داخل الدوال تنتهي حياهتا ابنتهاء تنفيذ أخر سطر يف الدالة‬
‫‪ -‬ميكن استدعاء الدالة لنفسها ملرة أو أكثر من مرة‪ .‬وأتخذ الدالة الشكل العام التايل ‪:‬‬
‫)‪Type name(parameter1, parameter2,…….‬‬
‫{‬
‫;‪Statement‬‬
‫;) )‪Return( name(parameter1, parameter2,…….‬‬
‫}‬

‫>‪#include<iostream.h‬‬ ‫خطوة رقم واحد هي دالة تستقبل‬


‫)‪massageShow(int a‬‬ ‫قيمة واحد ال تعيد أي قيمة وخطوة‬
‫{‬ ‫رقم(‪ )2‬تطبع هذه القيمةوخطوة رقم‬
‫;‪cout<<" the number send is="<<a‬‬ ‫(‪ )4‬هو استدعاء لهذه الدالة من‬
‫}‬ ‫داخل البرنامج‪.‬‬
‫)(‪main‬‬
‫{‬
‫)‪massageShow(3‬‬
‫}‬

‫جامعة طرابلس االهلية ‪/‬قسم تقنية المعلومات‬ ‫صفحه رقم ‪2‬‬


‫>‪#include<iostream.h‬‬ ‫‪.‬خطوة رقم (‪ )1‬هي دالة تستقبل‬
‫)‪int mul (int a,int b=3‬‬ ‫قيمتين وتكون قيمة(‪)b‬هي قيمة زائدة‬
‫{‬ ‫مساوية ل (‪ )3‬ان الخطوة رقم (‪ )4‬تم‬
‫استدعاء للدالة وأعطي فقط قيمة )‪)a‬‬
‫;)‪return(a*b‬‬
‫ولم نذكر المتغير(‪ )b‬لذالك سيعتمد‬
‫}‬ ‫المتغير (‪)b‬على القيمة الزائدة وهى‬
‫)(‪main‬‬ ‫(‪)3‬ويضرب (‪ )3*3=9‬ويطبع رقم (‪ )9‬في‬
‫;)‪{cout<<"mul="<< mul (3‬‬ ‫شاشة التنفيذ‪.‬‬
‫}‬

‫>‪#include<iostream.h‬‬ ‫توضيح الخطوات‪:‬‬


‫) ‪int power(int x,int n‬‬ ‫‪.‬خطوة رقم (‪)7‬أردنا أيجاد قيمة(‪)4^3‬‬
‫{‬ ‫لذالك سيستدعي الدالة في الخطوة‬
‫)‪if (n>0‬‬ ‫رقم(‪ )1‬جاعال قيمة)‪ (x=4, n=3‬ثم ينفذ‬
‫;)) ‪return(x*power(x,n-1‬‬ ‫خطوة رقم (‪ )2‬الن (‪ )n>0‬وينفذ بعده‬
‫خطوة رقم(‪ )3‬لكي يعيد الرقم مضروب‬
‫‪else‬‬ ‫باستدعاء الدالة لنفسها مرسلة لها‬
‫;‪return 1‬‬ ‫الرقم واألس منقص منه واحد ويستمر‬
‫}‬ ‫باالستدعاء الذاتي إلى أن تصبح قيمة‬
‫} )(‪main‬‬ ‫األس )‪ (n=0‬يعيد عندها واحد ويخرج من‬
‫};)‪7.cout<<power(4,3‬‬ ‫االستدعاء الذاتي‬

‫✓مثال (‪: )1‬استخدام الدوال صمم برانمج يستقبل عدد ‪ N‬من العناصر ويطبع فقط االعداد الزوجية‬
‫منها‬
‫>‪#include <iostream.h‬‬
‫>‪#include<conio.h‬‬
‫;) (‪void even‬‬
‫;‪int n,x‬‬
‫)(‪main‬‬
‫{‬
‫;)(‪clrscr‬‬
‫;‪cin>>n‬‬
‫)‪while(n!=0‬‬
‫{‬
‫;‪cin>> x‬‬
‫; )‪even( x‬‬
‫;‪n=n-1‬‬
‫جامعة طرابلس االهلية ‪/‬قسم تقنية المعلومات‬ ‫صفحه رقم ‪3‬‬
‫}‬
‫;)(‪getch‬‬
‫}‬
‫)‪void even( int r‬‬
‫{‬
‫)‪if(r%2==0‬‬
‫;‪cout<<r<<endl‬‬
‫}‬

‫✓مثال (‪: )2‬أكتب برانمج يقوم بطباعة مصفوفه احادية البعد الستخدام الدوال‬
‫>‪#include <iostream.h‬‬
‫>‪#include<conio.h‬‬
‫)‪void printArray(int b[],int n‬‬
‫{‬
‫)‪for(int i=0;i<n;i++‬‬
‫;]‪cout<<b[i‬‬
‫}‬
‫)(‪void main‬‬
‫{‬
‫;)(‪clrscr‬‬
‫;}‪int a[5]={2,4,6,8,9‬‬
‫;)‪printArray(a,5‬‬
‫;)(‪getch‬‬
‫}‬

‫✓مثال (‪: )3‬أكتب برانمج يقوم بقراءة عناصر مصفوفه احادية البعد مث يقوم إبستخدام الدوال مبا يلي‪:‬‬
‫طباعة عناصرها و البحث عن عنصر ومن مث مجع مجيع عناصر املصفوفه‪.‬‬
‫>‪#include<iostream.h‬‬
‫>‪#include<conio.h‬‬
‫)‪void insertelementarray(int a[],int n‬‬
‫{‬
‫)‪for(int i=0;i<n;i++‬‬
‫{‬
‫;" =]"<<‪cout<<"a["<<i‬‬
‫;]‪cin>>a[i‬‬
‫}‬
‫}‬

‫جامعة طرابلس االهلية ‪/‬قسم تقنية المعلومات‬ ‫صفحه رقم ‪4‬‬


void printarray(int a[],int n)
{
for(int i=0;i<n;i++)
cout<< a[i]<<"\t";
}
void sumelementarray(int a[],int n)
{
int sum=0;
for(int i=0;i<n;i++)
{
sum=sum+a[i];
}
cout<<"\n summation every element within an array = "<<sum;
}

void search(int a[],int n)


{
int b=0,s;
cout<<"\n input the number to be searched:";
cin>>s;
for(int i=0;i<n;i++)
if(s==a[i])
{
b=1;
break;
}
if(b==1)
cout<<"\n SUCCESSFUL SEARCH ";
else
cout<<"\n UNSUCCESSFUL SEARCH ";
}
main()
{
clrscr();
int a[100],n,i;
cout<<" Enter the size of an array : ";
cin>>n;
insertelementarray(a,n);
printarray(a,n);
sumelementarray(a,n);

‫قسم تقنية المعلومات‬/ ‫جامعة طرابلس االهلية‬ 5 ‫صفحه رقم‬


‫;)‪search(a,n‬‬
‫;)(‪getch‬‬
‫}‬

‫• الرتكيب ‪Structure‬‬
‫هو عبارة عن جمموعة من العناصر اليت تربطها مع بعضها البعض عالقات وثيقة وهذه العناصر من‬
‫املمكن أن تكون من أنواع خمتلفة من البياانت )…‪ (int,float,char,‬وختزن هذه املعطيات يف الذاكرة‬
‫بشكل متتايل حتت اسم واحد‪ ،‬ويستخدم لتمثيل بياانت شيء ما‪ ،‬مثل سجل بياانت طالب‪ ،‬سجل‬
‫بياانت سيارة وهكذا‪ .‬ويتكون الرتكيب من جمموعة من احلقول )‪ (Fields‬وكل حقل ميثل معلومة مفردة‬
‫من معلومات الرتكيب وميكن أن يكون لكل حقل يف الرتكيب نوع بياانت خمتلف عن احلقول األخرى‪.‬‬

‫فمثالا الرتكيب التايل يوضح سجل طالب‪:‬‬


‫‪Field‬‬ ‫‪no‬‬ ‫‪Name‬‬ ‫‪Average‬‬
‫‪Data type‬‬ ‫‪int‬‬ ‫*‪Char‬‬ ‫‪float‬‬

‫حيتوي هذا الرتكيب على ثالثة حقول هي‪ :‬الرقم (‪ )no‬وهو من نوع ‪ ، int‬االسم (‪ )name‬وهو من‬
‫نوع ‪ string‬واملعدل (‪ )average‬وهو من نوع ‪ float‬ويتم تعريف الرتكيب يف لغة ‪ C++‬يف بداية‬
‫الربانمج ابستخدام األمر ‪ struct‬وضمن الدالة ) (‪.main‬‬
‫الصيغة العامة لإلعالن عن الرتاكيب‪:‬‬
‫‪struct struct_name‬‬
‫{‬
‫;‪data type field1_name‬‬
‫;‪data type field2_name‬‬
‫‪.‬‬
‫‪.‬‬
‫;‪data type fieldn_name‬‬
‫;}‬
‫✓مثال (‪ : )1‬كيفية اإلعالن عن تركيب موظف حيوي احلقول (الرقم‪ ,‬االسم‪ ,‬الراتب) نكتب التايل‪:‬‬

‫جامعة طرابلس االهلية ‪/‬قسم تقنية المعلومات‬ ‫صفحه رقم ‪6‬‬


‫‪emp‬‬
‫{‬
‫;‪int emp_no‬‬
‫;]‪char emp_name[20‬‬
‫;‪float emp_salary‬‬
‫;}‬

‫• التعامل مع الرتاكيب‪:‬‬
‫بعد تعريف الرتكيب وقبل استخدامه جيب اإلعالن او التصريح عن متغري أو متغريات من الرتكيب‬
‫الستخدامها يف الوصول إىل حقول الرتكيب ‪ .‬حيث أنه ال ميكن الوصول اىل حقول الرتكيب بشكل‬
‫مباشر اال عن طريق متغري من نوع الرتكيب‪.‬‬

‫✓مثال (‪ : )2‬اكتب برانمج إلدخال بياانت الطالب (تركيب الطالب) وهي الرقم اجلامعي واالسم‬
‫والعنوان والقسم مث طباعتها ابستخدام الرتكيب‪.‬‬
‫>‪#include<iostream.h‬‬
‫)( ‪int main‬‬
‫{‬
‫‪struct student‬‬
‫{‬
‫;‪int no‬‬
‫;]‪char name[30‬‬
‫;]‪char address[20‬‬
‫;]‪char department[15‬‬
‫;}‬
‫;‪student st‬‬
‫‪cout<<"enter the student‬‬ ‫;"‪number:\n‬‬
‫;‪cin>>st.no‬‬
‫‪cout<<"enter the student‬‬ ‫;"‪name:\n‬‬
‫;‪cin>>st.name‬‬
‫‪cout<<"enter the student‬‬ ‫;"‪address:\n‬‬
‫;‪cin>>st.address‬‬
‫‪cout<<"enter the student‬‬ ‫;"‪department:\n‬‬
‫;‪cin>>st.department‬‬

‫جامعة طرابلس االهلية ‪/‬قسم تقنية المعلومات‬ ‫صفحه رقم ‪7‬‬


cout<<"=============================================\n";
cout<<"student number ="<<st.no<<"\n";
cout<<"student name ="<<st.name<<"\n";
cout<<"student address ="<<st.address<<"\n";
cout<<"student department ="<<st. department <<"\n";
cout<<"=============================================\n";
return 0;
}

Structures Arrays ‫• مصفوفات الرتاكيب‬


‫تعترب من أهم تطبيقات الرتاكيب حيث يعلن عن الرتكيب أوالا مث عن متغري املصفوفة من نوع معطيات‬
.‫الرتكيب‬
.‫ هو عبارة عن تعديل الربانمج السابق إلدخال بياانت مخسة طالب‬: )1( ‫مثال‬

#include<iostream.h>
int main ()
{
struct student
{
int no;
char name[30];
char address[20];
char department[15];
};
student st[5];
int i;
for(i=0;i<5;i++)
{
cout<<"enter the student number:\n";
cin>> st[i].no;
cout<<"enter the student name:\n";
cin>> st[i].name;
cout<<"enter the student address:\n";
cin>> st[i].address;
cout<<"enter the student department:\n";
cin>> st[i].department;

‫قسم تقنية المعلومات‬/ ‫جامعة طرابلس االهلية‬ 8 ‫صفحه رقم‬


}
for(i=0;i<5;i++)
{
cout<<"=============================================\n";
cout<<"student number ="<<st[i].no<<"\n";
cout<<"student name ="<< st[i].name<<"\n";
cout<<"student address ="<< st[i].address<<"\n";
cout<<"student department ="<< st[i]. department <<"\n";
cout<<"=============================================\n";
}
return 0;
}

. ‫ برانمج يقوم ابشاء تركيب يتعلق ببياانت افالم فيديو ومن مث عرض هذه البياانت‬:)2( ‫✓ مثال‬
#include<iostream.h>
#include<stdio.h>

struct books
{
char name[20],author[20];
}
a[50];
int main()
{

int i,n;
cout<<"No Of Books[less than 50]:";
cin>>n;
cout<<"Enter the book details\n";
cout<<"----------------------\n";
for(i=0;i<n;i++)
{
cout<<"Details of Book No "<<i+1<<"\n";
cout<<"Book Name :";
cin>>a[i].name;
cout<<"Book Author :";
cin>>a[i].author;
cout<<"----------------------\n";

‫قسم تقنية المعلومات‬/ ‫جامعة طرابلس االهلية‬ 9 ‫صفحه رقم‬


}
cout<<"================================================\n";
cout<<" S.No\t| Book Name\t|author\n";

cout<<"================================================";
for(i=0;i<n;i++)
{
out<<"\n "<<i+1<<"\t|"<<a[i].name<<"\t| "<<a[i].author;
}
cout<<"\n=================================================";

return 0;
}

‫ ميكن إعطاء الرتاكيب قيم ابتدائية من خالل متغري الرتكيب واملثال‬:‫• إعطاء الرتاكيب قيم ابتدائية‬
:‫التايل يوضح ذلك‬
#include<iostream.h>
int main ()
{
struct customer
{
int count_no;
char name[20];
};
customer c1;
customer c2={18922,"abdallah"};
cout<<"enter customer 1 name: \n";
cin>>c1.name;
cout<<"enter customer 1count_number: \n";
cin>>c1. count_no;
cout<<"=== list of customers===\n";
cout<<"===================\n";
cout<<"name1:"<<c1.name<<"\n";
cout<<"count_number1::"<<c1.count_no<<"\n";
cout<<"name2:"<<c2.name<<"\n";
cout<<"count_number2::"<<c2.count_no<<"\n";

‫قسم تقنية المعلومات‬/ ‫جامعة طرابلس االهلية‬ 10 ‫صفحه رقم‬


‫;‪return 0‬‬
‫}‬

‫الرتاكيب املتداخلة ‪Nested Structures‬‬


‫قد يكون احد حقول السجل عبارة عن سجل آخر‪ ,‬ويف هذه احلالة جيب اإلعالن أوالا عن نوع السجل‬
‫الداخلي قبل اإلعالن عن السجل اخلارجي‪.‬‬
‫>‪#include<iostream.h‬‬
‫)( ‪int main‬‬
‫{‬
‫‪struct name‬‬
‫{‬
‫;]‪char first[20‬‬
‫;]‪char middle[20‬‬
‫;]‪char family[20‬‬
‫;}‬
‫‪struct full_name‬‬
‫{‬
‫;‪name n‬‬
‫;‪long no‬‬
‫;}‬
‫;}‪full_name f={{"Mohmmed","Abdallah","Ali"},1809992‬‬
‫;"‪cout<<"*** personal information ***\n‬‬
‫;"‪cout<<"-----------------------------------\n‬‬
‫;‪cout<<"full name:"<<f.n.first<<" "<<f.n.middle‬‬
‫;"‪cout<<" "<<f.n.family<<"\n‬‬
‫;"‪cout<<"university number:"<<f. no<<"\n‬‬
‫;‪return 0‬‬
‫}‬

‫• الرتاكيب والدوال ‪Structures and Function‬‬


‫عناصر الرتكيب الواحد ميكن ان يتم ارساهلا اىل داله وذلك الداء غرض معني‪ .‬على سبيل املثال‪ ،‬لتعديل‬
‫اسم الطالب السابع‪ ،‬دعوان نطلق املصطلح ) (‪ modify‬كاأسم لدالة التعديل ‪ ،‬حيث عملية‬
‫االستدعاء ميكن التعبري عليها كمايلي‪:‬‬
‫;(‪modify(stud[6].name‬‬

‫جامعة طرابلس االهلية ‪/‬قسم تقنية المعلومات‬ ‫صفحه رقم ‪11‬‬


‫ وهذا يعين أي تغيري حيدث‬.‫هذا يعين ان العنصر السابع فقط من هيكل الطالب مت ارساله اىل الداله‬
‫كما‬.‫على اسم الطالب يف الدالة يعتربحملي؛ بينما تبقى قيمة هذا االسم يف برانمج االستدعاء دون تغيري‬
‫ املثال التايل يوضح عملية انشاء تركيب يتعلق حبفظ‬.‫ميكن ايضا ارسال تركيب كامل اىل داله التعديل‬
‫بياانت نوع من اخلضروات وكيفية ارسال هذا الرتكيب اىل داله‬

// passing structures to functions and


// a function returning a structure
#include <iostream.h>
#include <cstdio.h>
// -----structure part---
struct vegetable
{
char name[30];
float price;
};

int main()// -----main program-----


{
struct vegetable veg1, veg2; //declare 2 structure variables
struct vegetable addname();//function prototype of type struct
int list_func(vegetable); //another function prototype
veg1 = addname();// functions call for user input...
veg2 = addname();
cout<<"\nVegetables for sale\n";
list_func(veg1); // function call for data display...
list_func(veg2);
cout<<endl;
return 0;
}
struct vegetable addname()// this functions returns a structure
{
char tmp[20];
struct vegetable vege; // declare a structure variable
cout<<"\nEnter name of vegetable: ";
gets(vege.name);
cout<<"Enter price (per 100gm): $ ";

‫قسم تقنية المعلومات‬/ ‫جامعة طرابلس االهلية‬ 12 ‫صفحه رقم‬


gets(tmp);
vege.price = atof(tmp); // converts a string to float
return (vege);
}
int list_func(vegetable list) // structure passed from main()
{
cout<<"\nVegetable name: "<<list.name;
cout<<"\nVegetable price: $"<<list.price;
return 0;
}

‫قسم تقنية المعلومات‬/ ‫جامعة طرابلس االهلية‬ 13 ‫صفحه رقم‬

You might also like