ساختار
ساختار مجموعهای از متغیرهاست که با یک نام به آنها مراجعه میشود. در واقع ساختار داده جدیدی است که هر عنصر آن از نوع داده متفاوت است. این شیوه وسیله سادهای برای یکپارچه ساختن مجموعهای از دادهها یا اطلاعات مربوط به هم در اختیار برنامه نویس قرار میدهد. برای مثال فرض کنید که از هر دانشجویی شماره دانشجویی، نام و نمره امتحانی وی با فرمت زیر مورد نیاز باشد.
در اینجا نمیتوان این ۳ فیلد را در آرایهای ۳ عنصری قرار داد، زیرا فیلد اول از نوع int، فیلد دوم از نوع رشته (آرایه کاراکتری) و فیلد سوم از نوع float است؛ یعنی صفات آنها یکسان نیستند. حال خواسته آن است که بتوان به این مجموعه ۳ عنصری، تحت یک نام مراجعه کرد و اگر نیاز باشد بتوان به عناصر یا فیلدهای آن نیز مراجعه کرد. این گونه مجموعه را در زبان پاسکال و کوبول رکورد و در زبان C ساختار تعریف میکنند. اگر این مجموع را rec بنامیم، نحوه تعریف آن در زبان C به صورت زیر خواهد بود.
struct rec
{
int st-no ;
char name[15] ;
float grade ;
} ;
در اینجا کلمه کلیدی struct برای تعریف داده از نوع ساختار به کار رفته که پس از آن نام انتخابی برای مجموعه مورد نظر به کار برده شده و سپس در داخل یک زوج آکولاد، عناصر یا اعضای مجموعه مورد نظر تعریف شدهاند و در پایان نیز سمیکولون `;´ به عنوان پایان تعریف ساختار به کار رفته است. بنابراین در این مثال کلمه rec این ساختار ویژه از دادهها را مشخص میسازد.
حال میتوان متغیرهایی مانند x و z را از نوع ساختار مزبور تعریف کرد. برای این کار کافی است بنویسیم
struct rec x , z ;
در واقع با این تعریف، به کامپایلر میگوییم که متغیرهای x و z از نوع struct است که با نام rec تعریف شده است.
وقتی که ساختاری را تعریف میکنیم، در واقع نوع پیچیدهای مرکب از عناصر ساختار را تعریف میکنیم. بنابراین در مثال بالا کلمه rec متغیر نیست بلکه معرف نوع داده است، ولی کلمات x و z متغیرهاییاند که نوع آنها از نوع rec است.
میتوان x و z را به یکی از دو صورت زیر نیز تعریف کرد.
در هر دو روش بالا، اسامی متغیرهای مورد نظر بلافاصله پس از تعریف ساختار و قبل از بستن آن با علامت `;´ که پایان تعریف struct است آمده است. لذا دیگر نیازی به معرفی آنها با دستور struct rec نیست. در تعریف اول، نامی برای نوع داده انتخاب شده است. پس بعد از این نیز هر جای دیگر از برنامه میتوان متغیرهای دیگری را از نوع struct rec تعریف کرد. اما در تعریف دوم نمیتوان متغیری از این نوع تعریف کرد. به هر حال شیوه بهتر آن است که برای تعریف متغیر دیگری از نوع ساختار مورد نظر در جای دیگری از برنامه با محدودیت مواجه نشویم.
حال باتوجه به توضیحات بالا، چنانچه در حالت کلی نام ساختار ۱ را با tag و اسامی اعضای آن را با: member1 , member2 , … , memberm نشان دهیم، فرم کلی ترکیب ساختار به صورت زیر خواهد بود.
که در آن struct کلمه کلیدی برای تعریف داده از نوع ساختار و tag نام این ساختار دادههاست. همچنین، member1 , member2 , … , memberm نیز معرف توصیف اعضای ساختار مزبورند.
هر یک از اعضای ساختار میتواند متغیر معمولی، اشارهگر، آرایه، یا حتی ساختار دیگری باشد. با اینکه ممکن است نام اعضای یک ساختار با متغیرهای دیگری که در جایی دیگر از برنامه تعریف شدهاند همنام باشد، گویاتر آن است که در این گونه موارد اسامی همنام به کار نبریم.
به اعضای یک ساختار نمیتوان کلاس حافظه اختصاص داد و همچنین نمیتوان هنگام تعریف ساختار به اعضای آن مقدار اولیه نسبت داد. وقتی ترکیب ساختار یک بار تعریف گردید، میتوان متغیرهایی از نوع ساختار مزبور به صورت زیر توصیف کرد.
storage-class struct tag variable1 , variable 2 , … , variable m ;
که در آن storage-class مشخصکننده کلاس حافظه است و به کار بردن آن اختیاری است، ولی کلمه کلیدی struct الزامی است و tag نیز نام ساختار است و متغیرهای
variable1 , variable 2 , … variable m
نیز متغیرهایی از نوع ساختار tag اند.
مثال ۹ـ۱ نمونهای از تعریف ساختار، همراه با نمای ظاهری آن نشان داده شده است.
نام ساختار، در این مثال، account است و ۴ فیلد یا عنصر دارد که عبارتاند از:
– مقدار صحیح acct-no برای شماره حساب؛
– تککاراکتر acct-type برای نوع حساب؛
– آرایهای کاراکتری یا رشتهای name[80] برای نام صاحب حساب؛ و
– کمیت یا مقدار balance برای مبلغ موجودی صاحب حساب.
حال میتوان متغیرهای oldcustomer و newcustomer را از نوع ساختار مزبور به صورت زیر تعریف کرد.
struct account oldcustomer , newcustomer ;
بنابراین، oldcustomer و newcustomer متغیرهایی از نوع ساختارند که ترکیب عناصر آنها با ساختار account مشخص شده است.
به طوری که گفتیم میتوان توصیف ساختار را با متغیرهایی از نوع ساختار مزبور ترکیب و آنها را یکجا به صورت زیر تعریف کرد.
storage-class struct tag {
member1 ;
member2 ;
…
memberm ;
} variable1 , variable2 ,… , variablem ;
در چنین موقعیتی، انتخاب نام برای ساختار، یعنی به کار بردن tag، اختیاری است.