التركيب (المنشات ) Structure الجزء الثانى

** تمرير التركيب إلى الإجراءات**
من الممكن أن نمرر التركيبات الى الإجراءات. والبرنامج التالى يوضح ذلك :-
كود:
#include<stdio.h> #include<string.h> #include<stdlib.h> struct studenttag { char name[40]; int age; int grade; } void print(struct stdenttag student); void main(void) { struct studenttag student; char temp[10]; printf(“enter student namr : “); gets(student.name) printf(“enter student age : “ ); gets(temp); student.age=atoi(temp); printf(“enter student grade : “ ); gets(temp); student.grade = atoi(temp); printf(“\n\n you entered: \n\n”); // استدعاء الاجراء الذى يطبع محتويات الكتب printf(student); } // الاجراء الذى يطبع محتويات الكتب void print(struct studenttag student) { printf(“student name : \t%s\n “, student.name); printf(“student age : \t%d \n “, student.age); printf(“student grade :\t %d\n “, student.grade); }
* ملاحظات *
- فى هذا البرنامج نكلب من المستخدم بعض المعلومات عن أحد الطلبة ثم نضعها فى تركيب الى الاجراء print ليطبع محتوياته
- فى بداية البرنامج نعلن عن التركيب studenttag الذى سيستخدم لتخزين المعلومات .
- وهو يتكون من ثلاثة عناصر :- * اسم الطالب * وعمره * ومرحلته
- لاحظ كيف أعلنا عن الاجراء الفرعى print الذى سيطبع محتويات التركيب
void print(struct studenttag student)
- كذلك كيف نستدعى الإجراء print(student);
** تلاحظ انك عندما تمرر تركيباً إلى أحد الاجراءات فإن هذا الإجراء يتلقى ( نسخة ) من هذا التركيب فقط ولا يتلقى التركيب الأصلي. لذلك إذا غيرت الإجراء فى محتويات التركيب فإنه سيغير فى محتويات النسخة ولن تؤثر ذلك فى التركيب الأصلى.

** برنامج **
// تمرير التركيبات الى الاجراءات والعودة بتركيب من الاجراء
كود:
#include<stdio.h> #include<string.h> #include<stdlib.h>
كود:
struct sudenttag { char name[40]; int age; int grade; };
void print(struct studenttag student);
struct studenttag detinfo(void)
void main(void)
{ struct studenttag student; student = getinfo( ); print(student); }
// الاجراء الذى يطبع محتويات التركيب void print(sturct studenttag student) { printf(“\n\n you entedred : \n\n “); printf(“student name: \t%s\n”,student.name); printf(“sudent age: \t%d\n”,student.age); printf(“student grade : \t%d\n”,student.grade); }
// الاجراء الذى يطلب المعلومات من المستخدم ويضعها فى التركيب struct studenttag getinfo(void) { sturct studenttag student; char temp[10]; printf(“enter student name : “ ); gets(student.name); printf(“enter student age : “ ); gets(temp); student.age = atoi)temp); printf(“enter student grade : “ ); gets(temp); student.grade = atoi(temp); return(student); }

ملاحظات :
- هذا البرنامج يشبه البرنامج السابق ولكن يزيد عليه أننا وضعنا الاجراء getinfo هذا الاجراء يطلب المعلومات من المستخدم ويعود بها الى الاجراء main
- لاحظ كيف اعلنا عنه فى بداية البرنامج
struct studenttag detinfo(void)
- هذا الإعلان معناه أن الإجراء getinfo لا يستقبل اى بيانات وذلك بسبب كلمة void وانه يعود بقيمة إلى من يستدعيه. وهذه القيمة هى تركيب من نوع studenttag
- لاحظ كيف نستدعى getinfo من الاجراء main وهو student = getinfo وهذا الاجراء يطلب المعلومات من المستخدم وعندما ينتهى return(student);
بهذا الشكل سيعود الاجراء getinfo بالمعلومات التى حصل عليها من المستخدم الى الاجراء main الذى يستقبل ويضعها فى التركيب student وسوف يقوم الاجراء main بعد ذلك بتمرير نفس هذا الترتيب الى الاجراء print ليطبع محتوياته

** تركيب داخل تركيب **
- من الممكن ان تضع تركيباً داخل تركيب آخر . فمثلا إذا كنت تريد وضع تركيب لكل قسم من الأقسام فى الشركة . من الممكن أن تضع التركيب employee فى داخل تركيب القسم لتخزن فيه المعلومات الخاصة بالموظف المسئول عن القسم
- فى هذه الحالة يجب أن تعلن عن التركيب employee أولاً
struct employee
{
char name[40];
char address[40];
int age;
float salary;
}
- وبعد ذلك نعلن عن التركيب الأخر ونضعه فيه مثل :-
struct dept
{
int deno;
int product;
sturct employee emp;
}
- لاحظ كيف وضعنا التركيب emp فى داخل التركيب dept
- بعد ذلك يمكن ان نعلن عن التركيب dept كما سبق مثل struct dept dept1;
- فى حالة التعامل مع عنصر داخل تركيب فرعى اكتب : dept1.emp.age = 25
حيث dept1 اسم التركيب الرئيسى ثم نقطه
emp اسم التركيب الفرعى ثم نقطه
age اسم العنصر داخل التركيب الفرعى

** برنامج **
كود:
#include<stdio.h> #include<stdlib.h> struct employee { char name[40]; char address[40]; int age; float salary; };
كود:
struct department
{ int depnum; char product[40]; struct employee emp; };
void main(void) { struct deparment dept; char temp[10]; printf(“enter dept no : “ ); gets(temp); dept.deptnum = atoi(temp); printf(“enter dep. Product : “ ); gets(dept.product); prints(“enter employee name : “ ); gets(dept.emp.name); printf(enter employee address” ); gets(dept.emp.address); printf(“enter employee age : “ ); gets(temp); dept.emp.age = atoi(temp); printf(“enter employee salary : “ ); gets(temp); dept.emp.salary = atof(temp) printf(“\n\n you entered \n\n “ ); printf(“dept no : \t\t%d\n “,dept.deptnum); printf(“dept product : \t\t%s\n “,dept.product); printf(“employee address : \t\t%d\n”, dept.emp.address); printf(“employee age : \t\t%d\n”,dept.emp.age); printf(“employee salary: \t\t%f”,dept.emp.salary); }

ملاحظات :-
- فى بداية البرنامج نعلن عن التركيب employee أولا
- ثم نعلن عن التركيب department ونضع داخله التركيب employee
- لاحظ كيف نتعامل مع عناصر التركيب الفرعى فعندما نطلب من المستخدم إدخال اسم الموظف ، فإننا نستخدم الإجراء gets ونمرر له مصفوفه الحروف name الموجودة فى التركيب الفرعى emp كمايلى : gets(dept.emp.name);
- بعد ان ينتهى المستخدم من ادخال جميع المعلومات نستخدم الاجراء printf لطبع المعلومات على الشاشة.