إمرار الهياكل في ++C

إمرار الهياكل

قد تكون القيمة المرسلة هيكلا بأكمله , وفي المثال التالي سوف نستخدم هيكل الأبعاد الذي مر بنا في الفصل السابق , وسوف نجعل المستخدم يدخل المسافات , الأقدام ثم البوصات , ثم تظهرها الدالة الفرعية علي الشاشة بالنمط المعتاد .

engldisp.cpp


 


// engldisp.cpp


// demonstrates passing structure as argument


#include <iostream.h>


#include <conio.h>


 


struct Distance               // English distance


   {


   int feet;


   float inches;


   };


 


void engldisp( Distance );     // declaration


 


void main()


   {


   Distance ucs1, ucs2;            // define two lengths


 


                   // get length ucs1 from user


   cout << "\nEnter feet: ";  cin >> ucs1.feet;


   cout << "Enter inches: ";  cin >> ucs1.inches;


 


                   // get length ucs2 from user


   cout << "\nEnter feet: ";  cin >> ucs2.feet;


   cout << "Enter inches: ";  cin >> ucs2.inches;


                   


   cout << "\nucs1 = ";          


   engldisp(ucs1);               // display length 1


   cout << "\nucs2 = ";          


   engldisp(ucs2);               // display length 2


   getche();


}


 


// engldisp()


// display structure of type Distance in feet and inches


void engldisp( Distance ucs )   // parameter ucs of type Distance


   {


   cout << ucs.feet << "\'-" << ucs.inches << "\"";


   }




وفي هذا البرنامج تتقبل الدالة الرئيسية القيم المدخلة , وتخزنها في الهيكلين d1, d2 ثم تستدعي الدالة الفرعية التي تتقبل الهيكل distance كمعامل لها , شأنه في ذلك شأن أي متغير عادي . وتقوم الدالة بإظهار قيم الهيكل بالصورة المعتادة , قدم ثم بوصة , فيكون الحوار بين المستخدم والبرنامج علي النحو التالي :



Enter feet: 6



Enter inches: 4





Enter feet: 5



Enter inches: 4.25





D1 = 6'-4''



D2 = 5' – 4.25''



تستدعي الدالة الرئيسية الدالة الفرعية مرتين , الأولي لإمرار الهيكل d1 والثانية لإمرار الهيكل d2 . وتقوم الدالة الفرعية بتخزين هذه القيم في كل مرة في الهيكل الذي تسميه dd , ثم تجري عليه الوظيفة التي وضعت لها .



وكما هو الحال في المتغيرات , فإن الهيكل الذي تتعامل معه الدالة الفرعية لا علاقة له بالهيكلين الخاصين بالدالة الأصلية , وبالتالي فلا تؤثر فيها لو غيرت الدالة الأولي من قيم هيكلتها .



وضوح التسمية في الإعلان



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



Void display_point (int, int); // declaration



ولكن الصورة التالية تجعل الإعلان أكثر وضوحا :



Void display_point (int horiz, int vert); // declaration



حيث إنك بذلك قد أعطيت فكرة عن طبيعة القيم المنقولة , الأول يعبر عن الإحداثي الأفقي والثاني عن الرأسي , مما يجعل احتمال الخطأ في استخدامها أقل .



وليس للتسميات في الإعلان تأثير علي تسميتك للمتغيرات المنقولة في صلب البرنامج , فلك أن تستدعي الدالة بالأمر التالي :



Display_point (x, y); // function call



] كما لا يشترط التوافق بين هذين الاسمين وتسمية المعاملات في سطر التنويه [

التسميات: