ساختار چیست؟ بررسی کامل ساختار در زبان C { بخش اول}

مقدمه

با سلام خدمت همه شما دوستان. ما در سایت مقالاتی در مورد برنامه نویسی نداشتیم تا حالا. از این جلسه و در طی چند جلسه میخوایم به مرور زمان مباحث برنامه نویسی رو عمیق و البته شیرین یاد بگیریم.  در این مقاله  در مورد ساختار در زبان C یاد میگیریم. این که اصلا چی هستند. چطور تعریف میشن و چگونه مورد استفاده قرار میگیرن.  با ما همراه باشید.

آموزش ساختارها در زبان C - آنچه در این جلسه خواهیم گفت:

ساختار چیست و چه کاربردی دارد؟

ساختار به زبان ساده در واقع مجموعه ای از متغیرهایی غیرهم نوع هستند که با هم دیگه زیر یک سقف و تحت یک نام مشخص جمع شده اند.

به عنوان مثال ، ممکنه شما بخواید یک سری اطلاعات در مورد یک شخص مثل نام و نام خانوادگی ، کدملی ، حقوق رو در جایی ذخیره کنید. در اینجا میتونید با استفاده از ساختار چند متغیر مناسب برای هر کدوم از این پارامترها ( مثلا برای کد ملی یک متغیر double یا برای نام خانوادگی یک آرایه ) تعریف کنید و همه اطلاعات این شخص رو یک جا داشته باشید. در واقع این اطلاعات با هم تشکیل یک پکیج رو میدن که این پکیج شخص مورد نظر ما رو توصیف میکنه.

اگر چه شما برای این که این اطلاعات رو برای چند نفر ذخیره کنید برای هر کدوم از این افراد باید یک متغیر جداگانه دوباره تعریف کنید تا بتونید این اطلاعات رو داخلش ذخیره کنید ( اگه این قسمت رو نفهمیدید ، مشکلی نداره ، رد بشید در ادامه ، این توضیحات رو خواهید فهمید.)

اما فایده ساختار چیه؟ فرض کنید که ما بخوایم بدون استفاده از ساختارها اطلاعات مثلا 50 نفر از کارمندهای یک کارخانه رو ذخیره کنیم. برای هر نفر هم نام و نام خانوادگی ، کدملی و  حقوق رو لازم داشته باشیم. در این صورت احتمالا میدونید که کد ما چقدر به هم ریخته ، زشت و بی نظم خواهد بود. ولی وقتی از ساختارها استفاده میکنیم ، اطلاعات هر شخص تحت عنوان یک نام مشخص ذخیره میشن. این کار باعث زیباتر شدن و تمیزتر شدن کد ما میشه.

استفاده از ساختارها در زبان C

برای استفاده از ساختارها در زبان C باید از کلمه کلیدی struct ( مخفف structure به معنای ساختار) استفاده کنیم . در شکل زیر نمایی کلی از یک ساختار(Syntax) در زبان C رو مشاهده میکنید : ( ما در مورد تک تک این بخش ها توضیح خواهیم داد.)

آموزش ساختار - structure  در زبان C

تذکر: حتما باید آخر تعریف ساختار از نقطه ویرگول “;” استفاده کنید ، در غیر این صورت با خطا مواجه خواهید شد.

به عنوان مثال برای تعریف ساختاری از اطلاعات یک کارمند شامل نام  و کدملی و حقوق خواهیم داشت:

پارامترهایی از یک کارمند که مورد نیاز ماست

تعریف پارامترهای یک ساختار

فقط دوستان توجه داشته باشید که ما تا اینجا به صورت کلی یک ساختار رو تعریف کردیم و برای این که اطلاعات اون 50 نفر رو ذخیره کنیم ، باید برای هر کدوم از این 50 نفر ، ابتدا اون شخص رو تعریف کنیم و سپس  نام و کدملی و حقوق اون شخص رو تعریف و  مقداردهی کنیم.

برای این که هر کدوم از این اشخاص رو تعریف کنیم ، میتونیم مشابه زیر عمل کنیم:

تعریف عناصر یک ساختار

در این کد ، بعد از تعریف ساختار ، سه عنصر  با نام های Person1 و Person2 و Person3[20] تعریف شده اند. البته راه دیگه ای هم برای تعریف عنصرهای یک ساختار وجود داره و اون هم این هست که پس از تعریف ساختار اصلی ، عنصرهاش رو هم تعریف کنیم. مطابق کد زیر:

——–دک———–

دسترسی به اعضای یک عنصر:

برای این که به اعضای هر عنصر دسترسی داشته باشیم ، از دو تا عملگر میتونیم استفاده کنیم:

  1. عملگر اعضا (Member Operator که البته گاهی با dot Operator هم شناخته میشه) که با علامت نقطه (.) مشخص میشه.
  2. اپراتور فلش (Arrow Operator که دسترسی از طریق اشاره گر هست و ما در یک جلسه در موردش صحبت خواهیم کرد.)

به هر عضو از یک ساختار میتونیم به شکل زیر دسترسی داشته باشیم:

دسترسی به اعضای یک ساختار

در کد بالا منظور از structure_variable_name ، نام یکی از عناصری هست که ما برای ساختارمون تعریف کردیم. مثلا Person1 یا Person2 یا … همچنین منظور از member_name ، پارامتری هست که برای اون عنصر تعریف شده.

به عنوان مثال ، بخوایم به حقوق Person2 که در بالا اون رو تعریف کردیم ، دسترسی داشته باشیم. در این صورت خواهیم داشت:

مثالی از دسترسی به اعضای یک ساختار

مثال یک ساختار:

در مثال زیر ، قصد داریم دو مسافت رو با هم دیگه و با استفاده از ساختارها جمع کنیم. فقط نکته ای که وجود داره ، این هست که مسافت ها بر حسب اینچ و پا ( feet )  بیان شده اند و ما میدونیم که هر 12 اینچ یک feet هست. بریم سر مثال:

#include <stdio.h>
struct Distance
{
    int feet;
    float inch;
} dist1, dist2, sum;

int main()
{
    printf("1st distance\n");

    // Input of feet for structure variable dist1
    printf("Enter feet: ");
    scanf("%d", &dist1.feet);

    // Input of inch for structure variable dist1
    printf("Enter inch: ");
    scanf("%f", &dist1.inch);

    printf("2nd distance\n");

    // Input of feet for structure variable dist2
    printf("Enter feet: ");
    scanf("%d", &dist2.feet);

    // Input of feet for structure variable dist2
    printf("Enter inch: ");
    scanf("%f", &dist2.inch);

    sum.feet = dist1.feet + dist2.feet;
    sum.inch = dist1.inch + dist2.inch;

    if (sum.inch > 12) 
    {
      	//If inch is greater than 12, changing it to feet.
        ++sum.feet;
        sum.inch = sum.inch - 12;
    }

    // printing sum of distance dist1 and dist2
    printf("Sum of distances = %d\'-%.1f\"", sum.feet, sum.inch);
    return 0;
}

توضیح کد بالا:

خط 1 : کتابخانه استاندارد stdio که مربوط به ورودی و خروجی ها است تعریف شده.

خط 2 تا 6 : در این خطوط یک ساختار با نام Distance ، تعریف شده که این ساختار دارای سه عنصر dist1 و dist2 و sum است. همچنین این ساختار دو پارامتر با نام های feet ( از نوع Int )  و inch ( از نوع float ) هست.

خط 8 : تعریف تابع main

خط 10 : نوشتن عبارت 1st distance بر روی خروجی .

حط 13: نوشتن عبارت Enter feet که یعنی از کاربر میخواد تعداد مسافت feet ، را وارد کند.

خط 14: گرفتن dist1.feet از کاربر که ( فاصله feet از عنصر dist1 را )

خط 17 و 18 : گرفتن مسافت ( بخش inch ) از کاربر

خطوط 20 تا 28 : این قسمت نیز دقیقا مشابه با بخش قبل می باشد ، با این تفاوت که این بخش برای dist2 است.

خطوط 30 و 31 : در این دو خط ، مقدار feet و inch ، از dist1 و dist2 با یکدیگر جمع می شوند و درون پارامترهای منتظر با آن درون ساختار sum ریخته می شوند.

خطوط 33 تا 38 : از آنجا که هر 12 اینچ برابر یک feet است پس اگر مقدار عددی sum.inch ، از عدد 12 بیشتر شد ، 12 واحد از آن کم کنیم و یک واحد به مقدار sum.inch اضافه میشود.

خطوط 40 و 41 : در خطوط 40  و 41 نیز مقدار مسافت خروجی بر حسب inch و feet ، چاپ می شود.

اگه این کد رو در یک کامپایلر بنویسیم و اجرا کنیم. در این صورت خروجی مشابه زیر خواهد بود:

خروجی مثال

 

استفاده از کلمه کلیدی typedef برای استفاده آسانتر از ساختار :

اگه بخوایم هر عنصری از یک ساختار رو که تعریف میکنیم ، هر دفعه باید بنویسیم : Struct Person ،  که این کار خیلی زیبا نیست و استفاده از ساختار رو یه خورده دوست نداشتنی میکنه. به همین خاطر اکثر برنامه نویس ها از کلمه کلیدی typedef برای استفاده میکنند تا کار با ساختارها براشون راحتتر باشه. در کد زیر یک نمونه مثال از این دستور آورده شده:

استفاده از دستور typedef در structure

برای استفاده از typedef ابتدا باید خود کلمه typedef رو بنویسیم ، سپس کلمه کلیدی struct رو بنویسیم. آنگاه میتونیم نام اصلی ساختارمون رو بنویسیم. ( البته میتونیم اینجا هیچی هم ننویسیم) و در نهایت پس از تعریف متغیرهای مورد نیاز ساختار ، بعد از } باید از نامی  که میخوایم با استفاده از اون عناصر ساختارهامون رو صدا بزنیم ، استفاده کنیم. همین. پس به صورت خلاصه خواهیم داشت:

مثالی از دستور typedef در structure - ساختار

سپس در تابع main ؛ همونطور که میبینید ، دیگه نیازی نیست برای تعریف عناصر اون  بنویسیم struct complex comp1 . برای تعریف عناصر، فقط مینویسیم comp comp1 . در واقع ، در اینجا ما دو تا کار انجام دادیم. اول این که نام اصلی ساختار ( که Complex ) بود رو یه خورده راحتتر کردیم ( به نام comp ) تغییر دادیم و ثانیا این که برای تعریف عناصر یک ساختار ، دیگه نیازی به استفاده از کلمه struct نیست.

ساختارهای تودرتو

ما میتونیم وقتی که یک ساختار رو تعریف کردیم ، یک متغیر از جنس ساختاری که تعریف کردیم رو در یک ساختار دیگه تعریف کنیم. برای درک این جمله ابتدا قطعه کد زیر رو ببینید:

ساختارهای تو در تو

همونطور که در قطعه کد بالا مشاهده می کنید ، ابتدا یک ساختار با نام Complex ، ایجاد شده و سپس یک ساختار دیگه هم با نام number تعریف شده که این ساختار خودش دو تا عنصر با نام های num1 و num2 داره. حالا اومدیم و داخل ساختار number ، یک متغیر از جنس ساختار complex و با نام comp  تعریف کردیم.  بدیهی است برای دسترسی به پارامتر img_value ، باید از دستور زیر استفاده کنیم:

دسرسی به اعضای ساختارهای تو در تو

در واقعا از آخر برمیگردیم به اول. ابتدا num2 را تعریف میکنیم. سپس comp و درنهایت img_value .

خوب دوستان. این جلسه هم به پایان رسید. ما در مورد برنامه نویسی به مرور زمان مطلب خواهیم گذاشت و دوره های مربوط به اون رو تکمیل خواهیم کرد. مثل همیشه میتونید ما رو در تلگرام و یا اینستاگرام دنبال کنید:

 

اشتراک گذاری:
مطالب زیر را حتما بخوانید

6 دیدگاه

به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.

  • ببخشید میخواستم بدون چجوری میشه مثلا ساختار i ام رو حذف کرد

    • با سلام.
      منظور شما حذف یک المان از یک ساختار است یا این یک ساختار را به صورت کامل حذف کنیم ؟‌

  • باسلام

    مطالب سایتتون خیلی خوب بود من با آنچه که تو این پیج گفته بودین یه برنامه ای رو نوشتم ولی از مورد چهارم به بعدتو کامپایلر باگ میده ممنون میشم کمکم کنید

    #include
    #include

    struct busStruct
    {
    int p;
    int creatYearBus;
    char nameFactory;
    int chairNo;
    char caseB;
    int idB;
    int dateSevis;

    }bus;
    void main(){
    int i,n;
    printf(“enter numberNO bus in terminal :”);
    scanf(“%d”,&n);
    for(i=1;i<=n;i++)
    {
    printf("pleas enter pelakIdNumber for bus %d : ",i);
    scanf("%d",&bus.p);
    printf("pleas enter creat Year bus %d: ",i);
    scanf("%d",&bus.creatYearBus);
    printf("Pleaes enter nam factory creat bus %d : ",i);
    scanf("%c",&bus.nameFactory);
    printf("pleas enter number for chair bus %d : \n",i);
    scanf("%d",&bus.chairNo);
    printf("pleas enter caseBime %d : ",i);
    scanf("%c",&bus.caseB);
    printf("enter Id Bime for bus %d: ",i);
    scanf("%d",&bus.idB);
    printf("enter date servisfix for bus %d: ",i);
    scanf("%d",&bus.dateSevis);

    }
    }

    • با سلام.
      لطفا کد خود را به صورت کامل در یکی از سایت های آپلود قرار دهید و لینک آن را در اینجا بگذارید تا این موضوع بررسی شود. کد قرار گرفته شده ناقص می باشد.
      با تشکر.

        • با سلام و احترام.
          اول آن که بابت تاخیر در پاسخگویی عذرخواهی میکنیم. به دلیل برخی مشکلات قادر به پاسخگویی نبودیم.
          نکته دوم آن که بنده تجربه زیادی در برنامه نویسی C ندارم ولی چند نکته در این کد وجود داشت که قابل ذکر است :

          ۱ – نکته مهم :‌ حتما ورژن کامپایلری که کتاب شما کدهای خود را با آن اجرا میکند با ورژن کامپایلر خود چک کنید. تفاوت در ورژن ها ممکن است باعث خطا در کامپایل برنامه ها شود.
          ۲- آیا این کد را خودتان از روی کتاب نوشته اید یا آن را کپی پیست کرده اید؟ چون در طول کد خطاهای متنوعی وجود دارد که بعید برخی از آنها مشکل نگارشی است و با تصحیح املا این موضوع حل شد.
          ۳- برای تعریف نمونه متغیرهای struct استفاده از کلمه کلیدی struct لازم بود. این موضوع نیز یکی از علل خطا در برنامه شما بود که با قرار دادن کلمه struct حل شد. البته این خطا میتواند به ورژن کامپایلر نیز برگردد و ممکن است که کامپایلری که نویسنده کتاب استفاده کرده است آن را خطا نگیرد.
          البته بحث در مورد این کد قطعا جای کار بیشتری دارد ولی لطفا از سالم بودن کد اطمینان حاصل فرمایید تا خطاهای دیگر نیز بررسی شود.
          پی نوشت :‌ حتما سعی کنید کدهای خود را خودتان بنویسید تا هم در فرایند دیباگ راحتتر باشید و هم کدنویس قوی تری باشید. اگر بخواهید برای یک پروژه از کدهای آماده استفاده کنید در ادامه به دلیل ننوشتن کد به صورت مکرر با مشکل مواجه می شوید چون بخشی از کد را به درستی درک نکرده اید و به همین علت اضافه کردن کدهای جدید نیز با چالش های خاص خود مواجه می شود.
          با تشکر.

دیدگاهتان را بنویسید