أنت هنا:برمجها»اللغة س»الدرس 12: البنيات
الدرس 12: البنيات الدرس 12: البنيات
قيم الموضوع
(3 أصوات)

 تم إدراج هذه الفقرة في نهاية المرحلة الأولى ليس لكونها صعبة (فهي أسهل الفقرات) ولكن نظرا لأهميتها في تقريب مفهوم اللغات الشيئية الموجهة للمبتدئين كاللغة ++C المبنية أساسا على اللغة C واللغة JAVA ...


إذا ماذا بعد هذه الفقرة ؟

الجواب :

 

  • إما أن تكمل جميع مراحل اللغة C خطوة خطوة، وهذا هو الأفضل ثم ++C ثم JAVA ...

  •  وإما أن تذهب إلى المرحلة الثالثة من اللغة C (بنيات المعطيات) ثم ++C ثم JAVA ...

  •  أو أن تذهب مباشرة إلى اللغة ++C ثم JAVA ...أو إلى اللغة JAVA مباشرة

  •  

1. الأدوات  const  و define#  و  typedef

 

1.1 الأداة const

تقوم هذه الأداة بتثبيت متغير بقيمة معينة حيث لا يتغير عند استعماله في المشروع

مثال :         

 const  dim = 100;

 int tab1[dim], tab2[dim][dim*2];

1.2 الأداة define#

تقوم هذه الأداة بتعويض متغير بقيمة معينة وهي شبيهة بالأداة const إلا أنها تعتبر خير منها.

  • عند استعمال const يقوم C بحجز مكان في الذاكرة حسب تحديده لنوع المتغير

  • عند استعمال define# لا يقوم C بحجز مكان في الذاكرة للمتغير بل يقوم بتعويض جميع مماثلاته في المشروع بالقيمة المحددة له قبل أن يبدأ بالتنفيد.

ملاحظة : لا تحتاج هذه الأداة إلى الفاصلة المنقطة ( ; ) في نهايتها.

مثال :         

#define dim 100    /* نعوض كل dim في المشروع بالقيمة 100*/
#define pi  3.14159265

/* لتحديد القيمة القصوية لعددين كيفما كان نوعهما (الأقواس ضرورية)*/
#define max(a,b) ((a) >(b) ? (a) : (b)) 

#define abs(x) ((x) > 0 ? (x) : -(x))

void main()
{

  int tab1[dim], tab2[dim][dim*2] , x=-20 , y= -10 , z ;
  z = abs(max( - dim,max(x,y)))*pi;
}

1.3 الأداة  typedef

تقوم هذه الأداة بتعويض نوع المتغيرات باسم آخر يختاره المبرمج.

مثال :         

typdef int           integer       /* نعوض int بـ integer*/
typdef unsigned char uchar                /* نعوض  unsigned char بـ uchar*/
typdef float         hakiki        /* نعوض float  بـ hakiki*/

void main()
{ int  z ;
  integer  a,b ;
  hakiki   r,s;
  uchar    c,d;

  ....
}

ملاحظة : إن تعويض نوع ما لا يعني عدم استعماله مرة أخرى.

 


2. البنية  enum

 

تقوم هذه البنية بتعريف مجال لمجموعة من الثوابت من النوع int.

مثال 1 :

enum  ayam {itnayn,tholata,arbe3a,khamis,jomo3a,sabte,ahad};

void main()
{ enum ayam i;
  char *ch[7]={"lundi","mardi","mercredi","jeudi","vendredi","samedi","dimanche",}

 for(i=itnayn;i<=ahad;i++)  printf(" %s",ch[i]);
 for(i=0;i<=6;i++)  printf("\n%s",ch[i]);

}

كما نلاحظ أنه أصبح لدينا نوع جديد يسمى  enum ayam.

يمكنك اختصار هذه الكتابة بكلمة ayame  باستعمال الأداة typedef.

مثال 2 :

enum  ayam {itnayn,tholata,arbe3a,khamis,jomo3a,sabte,ahad};
typedef   enum  ayam    ayame;


void main()
{ ayame  i;
  char *ch[7]={"lundi","mardi","mercredi","jeudi","vendredi","samedi","dimanche",}

 for(i=itnayn;i<=ahad;i++)  printf(" %s",ch[i]);

 for(i=0;i<=6;i++)  printf("\n%s",ch[i]);
}


3. البنية  struct

 

3.1 استعمال عادي

هذه البنية هي أهم هذه البنيات، ورغم بساطتها إلا أنها تقوم بتسهيل عدة مفاهيم ستتلقاها مستقبليا في مجال البرمجة.

المهم :

إذا أردنا أن نعرف مجموعة من المتغيرات ذات النوع  int  يكفي أن نعرف جدولا  من النوع int في هذه الحالة.

إذا أردنا أن نعرف مجموعة من المتغيرات ذات النوع  float  يكفي أن نعرف جدولا  من النوع float  في هذه الحالة.

إذا أردنا أن نعرف مجموعة من المتسلسلات  يكفي أن نعرف جدولا للمتسلسلات من النوع char  في هذه الحالة.

لكن :

إذا أردنا أن نعرف مجموعة من المتغيرات ذات النوع  int  وكذلك متغيرات من النوع float أو متسلسلات في جدول واحد فهذا بالطبع غير ممكن، وهنا يأتي دور البنية struct.

ونكتب إذا :

 struct   <اسم البنية>
                  {/*هنا يتم تعريف المتغيرات*/
                   /*....*/                          };

مثال 1 :

struct  employee {int    age;
                float  salary;
                char   name[30];
                double tab[10]; };
                         
void main()
{ struct employee  emp1;
  int i;

 puts("name   : "); gets(emp1.name);
 puts("age    : "); scanf("%d",&emp1.age);
 puts("salary : "); scanf("%f",&emp1.salary);

 puts("write an array: ");
 for(i=0;i<=10;i++)  scanf("%lf",&emp1.tab[i]);

 printf("salaomo 3alaikom %s\n",emp1.name);
 printf("your age = %d\n",emp1.age);
 puts("The array is : ");
 for(i=0;i<=10;i++)  printf("%lf",emp1.tab[i]);
}

ملاحظة : لتحديد المتغير الذي سنستعمله نقوم بكتابة متغير البنية متبوعا بالنقطة متبوعة هي الأخرى باسم المتغير.

وكما نلاحظ أنه أصبح لدينا نوع جديد يسمى  struct employee .

يمكنك اختصار هذه الكتابة بكلمة employee  باستعمال الأداة typedef.

مثال 2 :

typdef  struct  {int        age;
                      float     salaire;
                      char      nom[30];
                      double  tab[10];  }  employee ;
                         
void main()
{ employee  emp1,emp2[10];
  int i;

  ......

3.1 استعمال المؤشر

 مثال 1 : انتبه إلى الملاحظات فهي جد مهمة مستقبليا

typedef struct {int    age;
                float  salary;
                char   name[30];
                double tab[10];  }   employee ;
                         
void main()
{ employee *emp1;
  int i;
  emp = (amploy *)maolloc(sizeof(employee));

  puts("name: "); gets((*emp1).name);        /* <=> gets(emp1->nom); */
  puts("age : "); scanf("%d",&(*emp1).age); /*<=>scanf("%d",&emp1->age);*/
  puts("salary : ");
  scanf("%f",&(*emp1).salary);             /*<=>scanf("%f",&emp1->salaire);*/

puts("Type an array : ");
 for(i=0;i<=10;i++)
  scanf("%lf",&(*emp1).tab[i]);             /*<=> scanf("%lf",&emp1->tab[i]);*/

 printf("salaomo 3alaikom %s\n",(*emp1).name); /*<=>printf(".. %s\n",emp1->nom);*/
 printf("your age = %d\n",(*emp1).age);/*<=>printf("votre age = %d\n",emp1->age);*/
 puts("The arrau is : ");
 for(i=0;i<=10;i++)
  printf("%lf",(*emp1).tab[i]); /*<=>printf("%f",emp1->salaire);*/
}

كما تلاحظ أن استعمال العامل <-  فقط لتسهيل الكتابة واختصارها.

 


4. البنية  union

هذه البنية شبيهة شيئا ما بالبنية السابقة إلا أن هناك فرق ضئيل، حيث أن جميع المتغيرات التي تحتويها تستعمل نفس المكان للتحفيظ.

(ليس المطلوب منك الفهم الدقيق لها)

هذه البنية تُسْتَعمل كالبنية struct.

مثال :

 union int_or_long { int i;
                     long l;} a_number;

ملاحظة : المتغير a_number من النوع union int_or_long وليس جزءا من البنية، حيث قمنا بتعريفه مباشرة، كما أنه يمكننا تعريفه داخل المشروع أو في إحدى الدوال .

 


تمارين تطبيقية

 

التمرين 12.1

أنجز مشروعا يقوم بتحديد القيمة القصوية لعددين مطلوب إدخالهما من طرف المستعمل، لكن باستعمال define


التمرين 12.2

أنجز مشروعا يقوم بحساب مربعات الأعداد من 0 إلى 10، لكن باستعمال define


التمرين 12.3

أنجز مشروعا يقوم بحساب مجموع عددين عقديين ينتميان إلى المجموعة C، لكن باستعمال struct ودالة تكون نتيجتها بنية.

 struct COMPLEXE {float re;
                  float im; }

مثال :

x + i y= ( a + ib ) + ( c + id )

x = a + c   حيث

y = b + d   و


التمرين 12.4

باستعمال جدول للأشخاص (الاسم ، النسب، رقم الزنقة، الشارع، الرقم البريدي، المدينة، رقم الهاتف)، أنجز مشروعا يقوم بالبحث التلقائي عن معلومات شخص معين انطلاقا من اسمه أو ...، نفترض أن جدول الأشخاص مهيأ سابقا بالمعلومات.


 تأليف

المؤلف الأصليمحمد عبد الرحمان


 

أضف تعليقا


إصنعها يريد أن يتأكد أنك لست روبوتا، لذلك أحسب ما يلي:

كود امني
تحديث