انت هنا الان : شبكة جامعة بابل > موقع الكلية > نظام التعليم الالكتروني > مشاهدة المحاضرة

إرسال المعاملات إلى الدالة الفرعية

Share |
الكلية كلية العلوم للبنات     القسم قسم الحاسبات     المرحلة 1
أستاذ المادة احمد بدري مسلم الغزالي       6/1/2011 6:26:55 AM

إرسال المعاملات إلى الدالة الفرعية باستخدام القيمة value أو العنوان Reference :

 

 

نحن لحد الآن نرسل المعاملات إلى الدوال الفرعية كقيم مثلا في الدالة التي تجمع عددين

 

Sum(int x,int y)  فأن المتغيران x,y معاملان للدالة sum بحيث يستلمان قيم عددية من الدالة الرئيسية عند الاستدعاء مثلا :

 

int  a=5 , b=7;

 

c=sum(a,b);

 

في هذه الحالة نحن نرسل قيم المتغيرات a,b وليس المتغيران نفسهما . أي بمعنى أخر نحن نرسل نسخة من هذه المتغيرات .

 

توجد طريقة أخرى للإرسال المعاملات للدالة هي عن طريق إرسال عنوان المتغيرات (عنوان موقع الذاكرة للمتغير) عن طريق وضع الرمز & قبل اسم المتغير كالتالي :

 

int sum (int &x , int &y)

 

أي ان هذه الدالة تستلم عنوان موقع متغيران من نوع int , فلو كان لدينا الاستدعاء التالي :

 

int a=5 , b=7 ;                                                    

 

c=sum(a,b)

 

في هذه الحالة نحن نرسل عنوان موقع a, b . من فوائد استخدام هذه الطريقة : في بعض المسائل نحتاج أن نحصل على أكثر من قيمة راجعة من الدالة ففي هذه الحالة لا يمكن لان الدالة ترجع قيمة واحدة فقط , ولكن عندما نرسل أكثر من عنوان  متغير فسوف تحل هذه المشكلة كما سيوضح تباعاُ .

 

 لذلك هذا الشيء سوف يؤثر على طريقة البرمجة أيضا كما في المثال لإبدال قيم متغيرين :

 

#include<iostream.h>

 

void swap(int *a , int *b)

 

{

 

 int t;

 

 t=*a;

 

 *a=*b;

 

 *b=t;

 

}

 

void main( )

 

{

 

int x=2, y=5;

 

swap(&x,&y);

 

cout<<x<<endl<<y;

 

}   

 

 

 

ملاحظات :

 

1-في هذا المثال يتبين بأن الوصول لقيمة عنوان موقع الذاكرة يتم عن طريق وضع الرمز * قبل اسم المتغير في البرنامج الفرعي ونضع الرمز & عند الاستدعاء . أي سوف نقوم بإرسال العنوان الحقيقي للمتغيرات ونستلم مؤشر pointer  يشير لهذا العنوان في الذاكرة .

 

2-لو أردنا برمجة هذه الدالة بطريق إرسال قيم إلى الدالة sawp بدلا من العنوان لأصبح من المستحيل والسبب هو انه نحتاج أن نرجع قيمتين لـمتغير a  والمتغير  b وهذا غير ممكن .

 

 3-ونلاحظ ايضأ في هذه الحالة بأن الدالة لاترجع شيء والسبب هو إننا نعمل على عنوان المتغيرات أي هي أصبحت مرسلة ومستلمة في نفس الوقت .

 

 

 

مثال : اكتب برنامج يقرا أربعة أعداد المطلوب طباعة اكبر عدد وأصغر عدد؟

 

#include<iostream.h>

 

void max2(int a , int b , int c ,int d , int *max, int *min )

 

{

 

   if ((a>b)&&(a>c)&&(a>d))

 

    *max=a;

 

   else if ((b>a)&&(b>c)&&(b>d))

 

     *max=b;

 

   else  if((c>a)&&(c>b)&&(c>d))

 

      *max=c;

 

   else   *max=d;

 

  if ((a<b)&&(a<c)&&(a<d))

 

    *min=a;

 

   else if ((b<a)&&(b<c)&&(b<d))

 

     *min=b;

 

   else  if((c<a)&&(c<b)&&(c<d))

 

      *min=c;

 

   else     *min=d;

 

}

 

void main( )

 

{

 

   int x,y,z,w,m1,m2 ;

 

   cin>>x>>y>>z>>w;

 

   max2(x,y,z,w,&m1,&m2);

 

   cout<<"max="<<m1<<"\n min="<<m2;

 

}

 

 

 

 H.W:

 

1-اكتب برنامج يقرأ سلسلة من الأعداد في دالة فرعية ومن ثم إرجاع اكبر عنصر واصغر عنصر إلى الدالة الرئيسية للطباعة ؟

 

2-الكتب برنامج يقرأ المتغيران A,B  وإيجاد قيمة :

 

C1=A+B

 

C2=A-B;

 

C3=A*B; 

 

في دالة فرعية ترجع قيم C1,C2,C3 إلى الدالة الرئيسية للطباعة ؟


المادة المعروضة اعلاه هي مدخل الى المحاضرة المرفوعة بواسطة استاذ(ة) المادة . وقد تبدو لك غير متكاملة . حيث يضع استاذ المادة في بعض الاحيان فقط الجزء الاول من المحاضرة من اجل الاطلاع على ما ستقوم بتحميله لاحقا . في نظام التعليم الالكتروني نوفر هذه الخدمة لكي نبقيك على اطلاع حول محتوى الملف الذي ستقوم بتحميله .
الرجوع الى لوحة التحكم