آموزش زبان برنامه نویسی C قسمت 10 (آخرین قسمت)

 

به آخرین قسمت دوره آموزش زبان برنامه نویسی C (این زبان قدرمتند و جذاب !) خوش اومدین.در پایان باز هم اشاره میکنم که اگه قسمت های قبل رو ندیدید از منوی سایت وارد بخش زبان C بشید.

بهتر دونستم در ابتدای قسمت آخر با نوشتن 2 برنامه ، آموخته های قبلی رو مرور کنیم.قبل از دیدن جواب،سعی کنید خودتون برنامه رو بنویسید.مغز انسان از حل کردن مسئله لذت میبره! پس بریم : 

 

1 . برنامه ای بنویسید که دو عدد صحیح گرفته و کوچکترین مضرب مشترکشون(ک . م . م) رو نمایش بده.

 

#include <stdio.h>

#include <conio.h>

int main () {

     int n1 , n2 , max ;

     printf("Enter First Number : ") ;

     scanf("%d" , &n1) ;

     printf("Enter Second Number : ") ;

     scanf("%d" , &n2) ;

     max = n1>n2 ? n1 : n2 ;

     for (int i=max ; ; i++){

           if (i%n1 == 0 && i%n2 == 0){

                 printf("LCM = %d" , i) ;

                 break ;

            } 

     }

     getch() ;

     return 0 ;

}

 

2 . برنامه ای بنویسید که یک رشته را گرفته و اون رو بطور معکوس چاپ کنه.

 

#include <stdio.h>

#include <conio.h>

int main () {

    char str [20] ;

     int i = 0 ;

    printf("Enter The String : ") ;

    scanf("%s" , str) ;

    printf("The Inversed : ") ;

    for (i=0 ; str[i+1]!='\0' ; i++) ;

    for (i ; i>=0 ; i--) {

           printf("%c" , str[i]) ;

    }

    getch() ;

    return 0 ;

 

خب دوستان مسلما کدهای بالا تنها جواب های ممکن برای اون مسائل نیستن و روش های زیادی برای حل وجود داره.به هر حال برنامه نویسی به تمرین زیادی نیاز داره اما امیدوارم برنامه های بالا براتون مفید بوده باشن!

 

ساختمان : 

آخرین مبحثی که میخوایم در این مجموعه ی آموزشی راجع بهش صحبت کنیم، ساختمان (Structure) هست. یادگیری ساختمان ها اولین قدم برای ورود به برنامه نویسی شی گراست! اجزای تشکیل دهنده ی ساختمان ها ، همون داده هایی هستن که تا الان باهاشون آشنا شدیم.با استفاده از ساختمان ها میتونیم نوع داده ی جدیدی رو ایجاد کنیم. بذارید کار رو با یک مثال پیش ببریم :

 

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

آیا بهتره آرایه ای از نام ها ، آرایه ای از سن ها ، آرایه ای از قد ها و ... داشته باشیم یا بهتره چیزی به اسم "دانش آموز" داشته باشیم و چند دانش آموز تعریف کنیم ؟!

همونطور که متوجه شدید بهتره یک "موجودیت(Entity)" به نام دانش آموز داشته باشیم و با اون کار کنیم.این یکی از هزاران مثالی هست که نیاز به برنامه نویسی شی گرا رو بیان میکنه.ما در زبان برنامه نویسی سی ، بحث Object Orientation رو نخواهیم داشت ولیکن همونطور که در بالا اشاره کردم،استفاده از ساختمان ها تنها یک گام ما رو به اون هدف نزدیکتر میکنه! 

 

حالا با این مقدمات، بیاید با تعریف یک ساختمان در زبان سی آشنا بشیم : 

 

struct point {

    int x ;

    int y ;

} ;

در مثال بالا من به نوعی شی "نقطه" رو در فضای دکارتی ایجاد کردم که شامل مولفه ی طول و مولفه ی عرض میشه.

نکات : 

1 . برای تعریف ساختمان از کلمه ی کلیدی struct استفاده میکنیم.

2 . نام ساختمان بعد از کلمه ی کلیدی struct میاد و از قانون نامگذاری متغیرها و توابع پیروی میکنه.

3 . اجزای ساختمان درون {} نوشته میشن. 

4 . پس از علامت { باید حتما از  ;  استفاده کنید.

 

بیاید یک دانش آموز بسازیم :

 

struct student {

     char fname [15] ;

     char lname [20] ;

     int age ;

     int height ;

    float gpa ;

} ;

 

مثالی که در ابتدای بحث بررسی شد ، رو پیاده سازی کردیم ! حالا نوع داده ی جدیدی به نام student داریم.

 

اما دوستان، الان شما نمیتونید از ساختمان هایی که ایجاد کردید استفاده کنید! شما فقط نوع داده ی جدیدی تعریف کردین و برای استفاده از اون باید متغیرهایی از اون نوع تعریف کنید (درست مثل کاری که با int میکردیم! )

 

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

 

struct point {

     int x ;

     int y ; 

} p1 , p2 ;

 

int main () {

     struct point p3 , p4 ;

     .

     .

     .

}

 

پس یک روش در هنگام تعریف ساختمان و قبل از  ;  و دیگری در توابع مورد نیازتون و با ذکر کلمه ی کلیدی و اسم ساختمان! 

 

دسترسی به اجزای ساختمان : 

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

دوستانی که با برنامه نویسی شی گرا آشنا هستن و یا با زبان های شی گرایی مثل جاوا اسکریپت،جاوا یا سی پلاس پلاس کار کردن ، میدونن که از عملگر  .  (dot)  برای دسترسی به اجزا ، ویژگی ها و یا متدهای یک شی استفاده میشه.

در زبان برنامه نویسی سی هم برای دسترسی به هر بخش از ساختمان از علامت "دات" استفاده میشه.

struct's name.property

که در اینجا ، property یکی از اجزای ساختمان هست.

با یک مثال کار رو پیش میبریم : 

 

struct student {

     int age ;

     int height ;

} stu1 , stu2 ;

 

int main () {

    stu1.age = 16 ;

    stu1.height = 170 ;

    printf("Enter The Student's age : ") ;

    scanf("%d" , &stu2.age) ;

    printf("Enter The Student's height : ") ;

    scanf("%d" , &stu2.height) ;

    .

    .

    .

}

 

هدف از این مثال ، آشنایی با نحوه ی دسترسی به اجزای ساختمان بود.پس مثلا الان با stu1.age مثل یک int رفتار میشه و میتونید اون رو چاپ کنید و یا از کاربر بگیرید.

 

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

 

#include <stdio.h>

#include <conio.h>

 

struct student {

      char fname [15] ;

      char lname [20] ;

      int age ;

} stu [10] ;

 

int main () {

    for (int i=0 ; i<10 ; i++){

         printf("Student%d'fname : " , i+1) ;

         scanf("%s" , stu[i].fname) ;

         printf("Student%d'lname : " , i+1) ;

         scanf("%s" , stu[i].lname) ;

         printf("Student%d'age : " , i+1) ;

         scanf("%s" , stu[i].fname) ;

    }

    

    for (int i=0 ; i<10 ; i++){

         printf("Student%d'fname = %s  " , i , stu[i].fname ) ;

         printf("Student%d'lname = %s " , i , stu[i].lname) ;

         printf("Student%d'age = %d " , i , stu[i].age) ;

    }

    getch() ;

    return 0 ;

}

 

اشاره گر به ساختمان : 

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

struct  name  *sptr ;

 

به عنوان مثال کسانی که با لیست های پیوندی کار کردن احتمالا با عبارت روبه رو آشنا هستند : 

struct node *next ; 

 

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

1 . استفاده از پرانتز و عملگر * به صورت مقابل : 

(*sptr).property 

 

اگه از پرانتز استفاده نشه بدلیل اینکه عملگر . اولویت بالاتری نسبت به * داره،زودتر اجرا میشه و بنا به دلیلی که عرض کردم با ارور مواجه خواهید شد!

 

2 . استفاده از عملگر <- به صورت مقابل : 

sptr->property

 

به کسانی که در فهم اشاره گر به ساختمان یا نحوه ی عملکرد اون مشکل دارن ، توصیه میکنم بخش اشاره گرها رو یک بار دیگه مطالعه کنن! 

 

در پایان : 

سعی کردیم در این مجموعه ی آموزشی مباحث مهمی که در زبان برنامه نویسی سی وجود داشت به شما آموزش بدیم.سایر نکات یا بخش ها ، جزئی تر ، تخصصی تر و یا حفظی بودن و ترجیح دادیم خودتون به دنبالشون برید.اگه کمی و کاستی یا مشکل علمی یا هرچیز دیگه ای که از نظر شما اشکال داشت در این مجموعه وجود داشت بر ما ببخشید و اگر تونسته باشیم حتی مقدار اندکی به شما کمک کنیم ، خوشحالیم و امیدواریم دعاگوی ما باشید.تمرین و تلاش یادتون نره!  

بدرود!