آموزش زبان برنامه نویسی C قسمت 8

 

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

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

 

تابع :

تابع (function) در برنامه نویسی تا حدودی مشابه توابع در ریاضیات هست.دلیل اینکه نگفتم کاملا، رو در انتهای مطلب متوجه میشید !

یک تابع ریاضی ، یک ورودی (input) میگیره و یک خروجی (output) به شما تحویل میده.یعنی میتونید اون رو مثل یک ماشین درنظر بگیرید! یک چیزی (مثلا یک عدد) واردش میشه و یک چیز دیگه (مثلا یک عدد دیگه) از اون خارج خواهد شد.

در برنامه نویسی هم یک تابع میتونه یک ورودی داشته باشه (و میتونه نداشته باشه)، یک سری اعمال انجام بده و میتونه یک خروجی داشته باشه (و میتونه نداشته باشه) ! پس تا حدودی با تفاوت های توابع ریاضی و برنامه نویسی آشنا شدید.

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

 

1 . نوع خروجی

2 . اسم تابع 

3 . پارامترهای ورودی 

4 . بدنه ی تابع 

5 . خروجی تابع 

 

البته همونطور که در بالا اشاره کردم ، موارد 3 و 5 از ملزومات اجرای توابع نیستند.

حالا بیاید موارد بالا رو به زبان برنامه نویسی نزدیکتر کنیم : 

 

 } (پارامترهای ورودی)  اسم تابع   نوع خروجی

 

   بدنه ی تابع      

 

خروجی تابع       

{

 

حالا چند تا نکته :

- نوع خروجی باید یکی از انواع داده های اصلی زبان سی باشه (int - float - double - char - void)

- اسم تابع از قانون نامگذاری متغیرها تبعیت میکنه (مثلا اینکه نباید با یک عدد شروع شه)

- پارامترهای ورودی باید به همراه نوع داده شون بیان بشن و حتما برای هر پارامتر باید نوعش قبلش مشخص بشه (مثلا : int a , int b  پس حتما باید برای هر پارامتر ذکر بشه نوع داده چی هست)

- بدنه ی تابع همون عملی ست که تابع داره انجام میده !

- خروجی تابع با استفاده از کلمه ی کلیدی return مشخص میشه (مثلا return a که داده ی a رو به عنوان خروجی تابع برمیگردونه)

- اگه نوع خروجی تابع void باشه یعنی تابع خروجی نداره و شما مجاز به استفاده از return نیستید !

- کلمه ی return به نوعی یک پایان دهنده (terminator) برای اجرای کار تابع هست.

 

حالا با چیزهایی که تا الان یاد گرفتید 2 تا تابع ساده مینویسیم : 

 

int sum (int num1 , int num2){

    int num3 ;

    num3 = num1 + num2 ;

    return num3 ;

}

 

خب همونطور که میبنید تابع بسیار ساده ای هست که 2 عدد میگیره و جمعشون رو برمیگردونه. (نوع داده ی خروجی ، عدد صحیح و دو پارامتر ورودی که هر دو عدد صحیح هستند).

اما شاید متوجه شده باشید که این کد خیلی بهینه نیست و میتونه بهتر نوشته بشه ! ممکنه بگید خب بهتره به جای 2 خط اول بنویسیم :

int num3 = num1 + num2 ;

خب این یک گام در جهت کوتاه شدن همون الگوریتم قبلیه ! برای این تابع ساده ، کد زیر بسیار بهتر خواهد بود : 

 

int sum (int num1 , int num2) {

   return  num1+num2 ;

}

همونطور که میبنید نیازی به تعریف متغیر سوم نیست و این کد گویاتر ، کوتاهتر و بهینه تر هست! پس همیشه سعی کنید دنبال راه بهتر و کوتاهتری برای حل مسئله تون باشید.

و اما دومین تابع :

 

void printLetters (char string[]){

     for (int i=0 ; string[i]!='\0' ; i++){

           printf("%c\t" ,string[i]) ;

     }

}

این تابع یک رشته (آرایه ای از کاراکترها) میگیره و کاراکترهای اون رو به همراه یک tab چاپ میکنه.(پس یک آرایه به عنوان پارامتر تابع استفاده شد و خروجی هم وجود نداشت).

 

برای استفاده از توابع داخل برنامه 2 راه وجود داره : 1 . تعریف بدنه ی تابع قبل از تابع main  و   2 . نوشتن امضا(signature) یا همون طرح اولیه (prototype) تابع قبل از تابع main و تعریف بدنه ی تابع پس از تابع main 

این امر به این دلیل هست که وقتی کامپایلر با یک تابع رو به رو میشه قبلش باید اطلاعاتی راجع به اون داشته باشه و به اصطلاح اون رو بشناسه.

دوستان ، در پروژه های کوچک میتونید که بدنه ی تابع رو قبل از تابع main بنویسید ولی در یک پروژه بزرگ که توابع زیادی رو شامل میشه ، مرسوم این هست که prototype توابع ذکر بشه و بدنه ی توابع در پایین برنامه نوشته بشه.

 

حالا بیاید با دانشی که تا به امروز بدست اوردیم یک ماشین حساب ساده رو کدنویسی کنیم.پیشنهادم اینه که اولروش فکر کنید و خودتون بنویسید و  و بعد ادامه ی مطلب رو بخونید.(اگه دارید سی رو یادمیگیرید و تا حالا این برنامه رو ننوشتید ، کاری که گفتم به نفعتونه :) ) :

 

#include <stdio.h>

#include <conio.h>

 

int sum (int , int ) ;

int sub (int , int ) ;

int mul (int , int ) ;

float div (int , int ) ;

 

int main(){

    int num1 , num2 ;

    char operator ;

    printf("Hi ! Welcome to our Calculator :)\n\nNumber1 = ") ;

    scanf("%i" , &num1) ;

    printf("Number2 = ") ;

    scanf("%i" , &num2) ;

    printf("Operator :  ") ;

    scanf("%c" , &operator) ;

    switch (operator){

        case '+' : printf("The Answer is %d" ,  sum(num1,num2) ) ;  break ;

        case '-' : printf("The Answer is %d" ,  sub(num1,num2) ) ;    break ;

        case '*' : printf("The Answer is %d" ,  mul(num1,num2) ) ;   break ; 

        case '/' : printf("The Answer is %.1f" , div(num1,num2) ) ;  

    }

    getch() ; 

    return 0 ;

}

 

int sum (int a , int b ) {

    return a+b ;

}

int sub (int a , int b ) {

    return a-b ;

}

int mul (int a , int b ) {

    return a*b ;

}

float div (int a , int b ) {

    return ( float(a) / b ) ;  //type casting 

}

 

 

و 2 نکته ی آخر : 

1 . دو نوع ارسال آرگومان (متغیرهایی که در زمان استفاده از توابع به عنوان ورودی به اونها میدیم) به توابع وجود داره. call bye value و call bye reference . حالت پیش فرض ، فراخوانی با مقدار هست.یعنی توابع فقط مقدار آرگومان هارو دریافت میکنن و روش عملیاتی انجام میدن و تغییری روی متغیر اصلی بوجود نمیاد. و در روش فراخوانی با ارجاع ، آدرس متغیر رو برای تابع میفرستیم و مقدار همون متغیر رو تغییر میدیم که برای یادگیری اون بخش نیاز دارید که با اشاره گرها آشنا باشید.

2 . توابع نقش مهمی در برنامه نویسی دارند و مزایای زیادی با خودشون به همراه میارن.به دلیل طولانی شدن مطلب من دیگه این مزایا رو عنوان نمیکنم.خودتون با یک سرچ ساده میتونید به اونها پی ببرید و الان هم این رو از من بپذیرید و از توابع در برنامه هاتون استفاده کنید :)

 

خب دوستان این قسمت هم به پایان رسید ! امیدوارم مطالب گفته شده به دردتون خورده باشه.