القائمة الرئيسية

الصفحات

هياكل البيانات / C - Structures

هياكل البيانات / Structures

 تسمح المصفوفات بتحديد نوع المتغيرات التي يمكن أن تحتوي على عدة عناصر بيانات من نفس النوع. وبالمثل ، فإن البنية هي نوع بيانات آخر محدد من قبل المستخدم متاح في C يسمح بدمج عناصر البيانات من أنواع مختلفة.

يتم استخدام الهياكل لتمثيل سجل. افترض أنك تريد تتبع كتبك في مكتبة. قد ترغب في تتبع السمات التالية حول كل كتاب -

  • عنوان
  • مؤلف
  • موضوع
  • معرف الكتاب

تحديد الهيكل

لتعريف الهيكل ، يجب عليك استخدام العبارة Struct . يحدد بيان الهيكل نوع بيانات جديد ، مع أكثر من عضو واحد. شكل بيان الهيكل كما يلي -

struct [structure tag] {

   member definition;
   member definition;
   ...
   member definition;
} [one or more structure variables];  

تعتبر علامة الهيكل اختيارية وكل تعريف عضو هو تعريف متغير عادي ، مثل int i ؛ أو تعويم و ؛ أو أي تعريف متغير صالح آخر. في نهاية تعريف البنية ، قبل الفاصلة المنقوطة النهائية ، يمكنك تحديد متغير واحد أو أكثر من متغيرات البنية ولكنه اختياري. هذه هي الطريقة التي ستعلن بها عن هيكل الكتاب -

struct Books {
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} book;  

الوصول إلى أعضاء الهيكل

للوصول إلى أي عضو في الهيكل ، نستخدم عامل وصول الأعضاء (.) . يتم ترميز مشغل وصول العضو كفترة بين اسم متغير البنية وعضو الهيكل الذي نرغب في الوصول إليه. يمكنك استخدام بنية الكلمة الأساسية لتحديد متغيرات نوع الهيكل. يوضح المثال التالي كيفية استخدام بنية في برنامج -


#include <stdio.h>
#include <string.h>
 
struct Books {
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};
 
int main( ) {

   struct Books Book1;        /* Declare Book1 of type Book */
   struct Books Book2;        /* Declare Book2 of type Book */
 
   /* book 1 specification */
   strcpy( Book1.title, "C Programming");
   strcpy( Book1.author, "Nuha Ali"); 
   strcpy( Book1.subject, "C Programming Tutorial");
   Book1.book_id = 6495407;

   /* book 2 specification */
   strcpy( Book2.title, "Telecom Billing");
   strcpy( Book2.author, "Zara Ali");
   strcpy( Book2.subject, "Telecom Billing Tutorial");
   Book2.book_id = 6495700;
 
   /* print Book1 info */
   printf( "Book 1 title : %s\n", Book1.title);
   printf( "Book 1 author : %s\n", Book1.author);
   printf( "Book 1 subject : %s\n", Book1.subject);
   printf( "Book 1 book_id : %d\n", Book1.book_id);

   /* print Book2 info */
   printf( "Book 2 title : %s\n", Book2.title);
   printf( "Book 2 author : %s\n", Book2.author);
   printf( "Book 2 subject : %s\n", Book2.subject);
   printf( "Book 2 book_id : %d\n", Book2.book_id);

   return 0;
}

عندما يتم تجميع التعليمات البرمجية أعلاه وتنفيذها ، فإنها تنتج النتيجة التالية -

Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407
Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700

الهياكل كحجج وظيفية

يمكنك تمرير بنية كوسيطة دالة بنفس الطريقة التي تمرر بها أي متغير أو مؤشر آخر.


#include <stdio.h>
#include <string.h>
 
struct Books {
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};

/* function declaration */
void printBook( struct Books book );

int main( ) {

   struct Books Book1;        /* Declare Book1 of type Book */
   struct Books Book2;        /* Declare Book2 of type Book */
 
   /* book 1 specification */
   strcpy( Book1.title, "C Programming");
   strcpy( Book1.author, "Nuha Ali"); 
   strcpy( Book1.subject, "C Programming Tutorial");
   Book1.book_id = 6495407;

   /* book 2 specification */
   strcpy( Book2.title, "Telecom Billing");
   strcpy( Book2.author, "Zara Ali");
   strcpy( Book2.subject, "Telecom Billing Tutorial");
   Book2.book_id = 6495700;
 
   /* print Book1 info */
   printBook( Book1 );

   /* Print Book2 info */
   printBook( Book2 );

   return 0;
}

void printBook( struct Books book ) {

   printf( "Book title : %s\n", book.title);
   printf( "Book author : %s\n", book.author);
   printf( "Book subject : %s\n", book.subject);
   printf( "Book book_id : %d\n", book.book_id);
}

عندما يتم تجميع التعليمات البرمجية أعلاه وتنفيذها ، فإنها تنتج النتيجة التالية -

Book title : C Programming
Book author : Nuha Ali
Book subject : C Programming Tutorial
Book book_id : 6495407
Book title : Telecom Billing
Book author : Zara Ali
Book subject : Telecom Billing Tutorial
Book book_id : 6495700

مؤشرات الهياكل

يمكنك تحديد المؤشرات للهياكل بنفس الطريقة التي تحدد بها المؤشر لأي متغير آخر -

struct Books *struct_pointer;

الآن ، يمكنك تخزين عنوان متغير بنية في متغير المؤشر المحدد أعلاه. للعثور على عنوان متغير البنية ، ضع علامة "&"؛ المشغل قبل اسم الهيكل على النحو التالي -

struct_pointer = &Book1;

للوصول إلى أعضاء الهيكل باستخدام مؤشر لتلك البنية ، يجب عليك استخدام عامل التشغيل → على النحو التالي -

struct_pointer->title;

دعونا نعيد كتابة المثال أعلاه باستخدام مؤشر الهيكل.


#include <stdio.h>
#include <string.h>
 
struct Books {
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};

/* function declaration */
void printBook( struct Books *book );
int main( ) {

   struct Books Book1;        /* Declare Book1 of type Book */
   struct Books Book2;        /* Declare Book2 of type Book */
 
   /* book 1 specification */
   strcpy( Book1.title, "C Programming");
   strcpy( Book1.author, "Nuha Ali"); 
   strcpy( Book1.subject, "C Programming Tutorial");
   Book1.book_id = 6495407;

   /* book 2 specification */
   strcpy( Book2.title, "Telecom Billing");
   strcpy( Book2.author, "Zara Ali");
   strcpy( Book2.subject, "Telecom Billing Tutorial");
   Book2.book_id = 6495700;
 
   /* print Book1 info by passing address of Book1 */
   printBook( &Book1 );

   /* print Book2 info by passing address of Book2 */
   printBook( &Book2 );

   return 0;
}

void printBook( struct Books *book ) {

   printf( "Book title : %s\n", book->title);
   printf( "Book author : %s\n", book->author);
   printf( "Book subject : %s\n", book->subject);
   printf( "Book book_id : %d\n", book->book_id);
}

عندما يتم تجميع التعليمات البرمجية أعلاه وتنفيذها ، فإنها تنتج النتيجة التالية -

Book title : C Programming
Book author : Nuha Ali
Book subject : C Programming Tutorial
Book book_id : 6495407
Book title : Telecom Billing
Book author : Zara Ali
Book subject : Telecom Billing Tutorial
Book book_id : 6495700

حقول بت

تسمح حقول البت بتعبئة البيانات في هيكل. هذا مفيد بشكل خاص عندما تكون الذاكرة أو تخزين البيانات بسعر أعلى. تشمل الأمثلة النموذجية -

  • تعبئة عدة أشياء في كلمة آلية. على سبيل المثال ، يمكن ضغط أعلام 1 بت.

  • قراءة تنسيقات الملفات الخارجية - يمكن قراءة تنسيقات الملفات غير القياسية ، مثل الأعداد الصحيحة 9 بت.

يتيح لنا C القيام بذلك في تعريف البنية بوضع: طول البت بعد المتغير. على سبيل المثال -

struct packed_struct {
   unsigned int f1:1;
   unsigned int f2:1;
   unsigned int f3:1;
   unsigned int f4:1;
   unsigned int type:4;
   unsigned int my_int:9;
} pack;

هنا ، تحتوي الحزمة المعبأة على 6 أعضاء: أربعة أعلام 1 بت f1..f3 ونوع 4 بت و my_int 9 بت.

تحزم C تلقائيًا حقول البت أعلاه بشكل مضغوط قدر الإمكان ، بشرط أن يكون الحد الأقصى لطول الحقل أقل من أو يساوي طول كلمة العدد الصحيح للكمبيوتر. إذا لم يكن الأمر كذلك ، فقد يسمح بعض المترجمين بتداخل الذاكرة للحقول بينما يقوم البعض الآخر بتخزين الحقل التالي في الكلمة التالية.

  الصفحة التالية                                                                                      الصفحة السابقة  

هل اعجبك الموضوع :

تعليقات