توابع و روش فراخواني آنها در ++C

۳ بازديد

برنامه هايي كه ماشين حساب تاكنون به بررسي و پياده سازي آن ها پرداخته ايم ، فقط شامل يك تابع اصلي به نام main  بوده اند . اين برنامه ها از قسمت هايي تشكيل شده اند كه موجب پيچيدگي و طولاني شدن main مي شدند .
فرض كنيد مي خواهيم برنامه اي بنويسيم كه ساعات ورورد و خروج و ميزان كاركرد كاركنان يك شركت را به ثبت برساند و براساس ميزان كاركرد آنها حقوقي را درنظر بگيرد . براي اين كار احتمالا به اسامي كاركنان ، ساعت ورود وخروج آن ها و محاسبات منطقي و رياضي فراواني نيازمنديم و مطمئنا به برنامه اي بسيار طولاني و پيچيده خواهيم رسيد . اگر توجه كرده باشيد مي توان اين برنامه را به بخش هاي مستقلي تبديل كرد . مثلا در اين برنامه قسمتي وظيفه ي ثبت ساعت ورود و خروج ، قسمتي وظيفه ي ثبت ميزان حقوق و …. را به عهده دارد  . بنابراين بايد براي جدا كردن اين بخش ها به دنبال يك راه حل بود  و آن استفاده از توابع مي باشد .
معرفي تابعتوابع بخش هايي از main هستند كه براي حل قسمتي از آن نوشته مي شوند . با استفاده از توابع مي توان برنامه هاي ساخت يافته نوشت . وظيفه ي اين نوع برنامه ها توسط بخش هاي مستقلي كه تشكيل دهنده برنامه اند ، انجام مي شود .
براي نوشتن تابع از دستور زير استفاده مي كنيم :
( ليست پارانتر هاي تابع ) نام تابع   < نوع بازگشتي >
}
  ; دستورات
{
در اولين قدم بايد بدانيم كه وظيفه ي تابعي كه ميخواهيم بنويسيم چيست و قرار است  چه خروجي اي را به ما بدهد . همانطور كه مي دانيد تابع مانند يك ماشين عمل مي كند . به اين معنا كه داراي ورودي هايي مي باشد و طي  عملياتي كه بر روي اين وروردي ها انجام مي گيرد خروجي يا خروجي هايي را تحويل مي دهد .
نوع بازگشتي  همان خروجي  اي است كه قرار است تابع تحويل دهد و مي تواند از انواع متغيرها باشد . مثلا اگر نوع بازگشتي يك نوع عدد صحيح باشد ، بايد int قرار داده شود يا اگر بخواهيم نوع بازگشتي از نوع عدد اعشاري باشد float و يا double را انتخاب مي كنيم . توجه كنيد كه ممكن است يك تابع هيچ مقداري را برنگرداند در اين صورت نوع بازگشتي از نوع پوچ يا void مي باشد .
يك تابع بايد داراي يك نام دلخواه باشد . شما مي توانيد هر نامي براي تابع انتخاب كنيد اما بايد از قوانين تعريف متغيرها (به قسمت هاي قبل مراجعه كنيد) پيروي كند . سعي كنيد براي انتخاب نام تابع از نامي استفاده كنيد كه مربوط به عمل تابع باشد .
ليست پارامترهاي وروردي ، همان وروري هاي ماشين مي باشند . قبل از اينكه بخواهيم وروردي ها را در اين قسمت قرار دهيم ، بايد تعداد و نوع آنها مشخص شود . ممكن است يك تابع هيچ مقدار ورودي اي نداشته باشد ، دراينصورت بايد در اين قسمت از void استفاده كنيم . اگر تعداد وروردي هاي يك تابع از يكي بيشتر باشد ، دراينصورت بايد آنها را به وسيله كاما از هم جدا كنيم . توجه داشته باشيد كه اگر نوع ورودي  يا وروردي ها مشخص نشوند ، يك خطا محسوب مي شود .
 درنهايت بعد از رعايت تمام نكات ، مي توانيم بدنه يا دستورات مربوط به تابع را بين دو آكولاد بنويسيم :
1234int minimum(int a , int b){....}در تكه كد بالا تابعي به اسم minimum را ملاحظه مي كنيد . اين تابع داراي دو ورودي از نوع عدد صحيح مي باشد كه به وسيله كاما از هم جدا شده اند . همينطور هر كدام از اين ورودي ها داراي يك نام دلخواه مثلا a و b  مي باشند . خروجي تابع هم از نوع عدد صحيح مي باشد . به اين معنا كه بعد از انجام محاسباتي كه در بدنه تابع انجام مي شود ، مينيمم دو عدد a و b محاسبه شده و به عنوان خروجي تحويل داده مي شود .
اعلان تابعبراي اينكه تابعي را كه مي خواهيم در main به كار ببريم به كامپايلر اطلاع دهيم بايد آن را اعلان كنيم. اعلان يك تابع در بالاي main و بعد از فايل هايي كه ضميمه كرديم مي باشد :
123456789#include "iostream"#include using namespace std; int minimum(int a , int b);int main(){''''}همانطور كه در تكه كد بالا مشاهده مي كنيد ، تابع minimum در بالاي main تعريف شده است  و بعد از آن از علامت سميكالن استفاده مي شود  . دقت  كنيد كه اعلان تابع بايد دقيقا مطابق با آن چه در تعريف تابع به كار برده مي شود ، باشد . به اين معنا كه نوع بازگشتي ، نام تابع و نوع و تعداد متغيرهايي كه در اعلان تابع به كار برده مي شود ، مطابق با تعريف آن باشد اما لازم نيست نام متغيرها همان نامي باشد كه در تعريف تابع به كار برده شده است .
بعد از اينكه تابع در بالاي main اعلان شد بايد به تعريف تابع بپردازيم . به اين معنا كه بدنه ي تابع نوشته شود . اين تعريف در جايي   خارج از main نوشته مي شود .
فراخواني تابعبراي اينكه بتوان از تابع در main استفاده كرد بايد فراخواني شود . فراخواني يعني صدا زدن تابع در جايي از main كه به آن نياز داريم :
123456789#include "iostream"#include using namespace std;int minimum(int a , int b);int main(){int num1 , num2 ;minimum (num1 , num2);}بعد از تعريف دو متغير num1 و num2  تابع minimum فراخواني شده است . توجه كنيد كه نبايد در هنگام فراخواني تابع نوع بازگشتي ذكر شود . بنابراين اين دو متغير به عنوان پارامترهاي ورودي به اين تابع فرستاده مي شوند :
12345678int minimum(int a , int b){ if(a123456789101112131415161718192021222324#include #include using namespace std; int minimum(int a , int b);int main(){ int num1 , num2 , result; cout<<"2 adad vared konid : "<>num1>>num2; result=minimum(num1 , num2); cout<توابعي كه هيچ مقداري را برنمي گردانندممكن است در برنامه اي از توابعي استفاده كنيم كه آن توابع بعد از فراخواني ، انجام عمليات موردنظر را انجام دهند و خروجي يا خروجي هاي موردنظر را چاپ كنند و هيچ مقداري را برنگردانند :
1234567891011121314151617void convert();int main(){ convert(); system("pause"); return 0;} void convert(){int hours , minutes , seconds ;long int time;cout<<"enter time to be convert:"<>hours>>minutes>>seconds ;time = (hours*60 + minutes)*60 +seconds;cout<متغير هاي محلي و سراسريهمانطور كه در قست قبل گفته شد ، متغيرهايي كه فقط در داخل تابع تعريف مي شوند ، متغيرهاي محلي يا local variables هستند . به طور مثال اگر يك متغير در داخل main تعريف شد ، فقط در همان main ميتوانيم از آن استفاده كنيم .
علاوه بر متغيرهاي محلي ، متغيرهايي وجود دارند كه اين متغيرها را مي توان در هر كجايي از برنامه كه بخواهيد استفاده كنيد كه به آن ها متغيرهاي سراسري يا global variables گفته مي شود . توجه كنيد كه اين متغيرها در بالاي main تعريف مي شوند .
توابع بازگشتيتوابع بازگشتي به توابعي گفته مي شود كه در آن تابعي خودش را فراخواني مي كند . براي تعريف يك تابع بازگشتي از دستور زير استفاده نماييد :
( به حالت توقف رسيدي )if
مسئله حالت توقف را حل كن   
else
       تابع را بار ديگر فراخواني كن    
حال با استفاده از تكه كد زير به بررسي اين دستور  مي پردازيم :
123456789int factorial(int n){if(n == 0)return 1;else{return ( n * factorial(n-1) );}}اين تابع ، تابع بازگشتي محاسبه فاكتوريل يك عدد را طبق دستوري كه بيان كرديم ، نشان مي دهد . در بدنه تابع در اولين قدم  شرط پايان ذكر شده است . به اين معنا كه اگر ورودي اين تابع عدد ۰ بود ، ۱ برگردانده شود چرا كه فاكتوريل عدد ۰ ، ۱ مي شود . در غيراينصورت اعمال بعدي انجام شوند . همانطور كه مي دانيد براي محاسبه فاكتوريل يك عدد مي توان از ضرب آن عدد در فاكتوريل آن عدد منهاي يك ، به جواب مورد نظر دست يافت .به عنوان مثال فرض كنيد مي خواهيم فاكتوريل عدد ۴ را محاسبه كنيم در اين صورت طبق اين فرمول بايد ! (۱ – ۴) * ۴ را محاسبه كنيم . در مرحله بعد چون فاكتوريل عدد ۳ را نميدانيم ، دوباره از همين فرمول استفاده خواهيم كرد يعني ! (۱ – ۳) * ۳ و چون فاكتوريل عدد ۲ را نميدانيم بايد به صورت  ! (۱ – ۲) * ۲ عمل كرد . همينطور فاكتوريل عدد ۱ را به صورت  ! (۱ – ۱) * ۱ و در نهايت چون مي دانيم فاكتوريل ۰ ، ۱ مي شود ، پس به صورت بازگشتي مسئله هاي قبلي حل خواهند شد يعني :
مقدار ! ۳ از قسمت بعد جايگزين مي شود    ! (۱ – ۴) * ۴ = ! ۴
مقدار ! ۲ از قسمت بعد جايگزين مي شود    ! (۱ – ۳) * ۳ = ! ۳
مقدار ! ۱ از قسمت بعد جايگزين مي شود    ! (۱ – ۲) * ۲ = ! ۲
مقدار ! ۰ از قسمت بعد جايگزين مي شود    ! (۱ – ۱) * ۱ = ! ۱
۱ = ! ۰
اعمال تابع فاكتوريل براي محاسبه فاكتوريل عدد ۴ :
فراخواني اول :   در ابتدا عدد ۴ به جاي ورودي تابع قرار مي گيريد . پس (۴)factorial بايد محاسبه شود . ۴ به تابع فرستاده مي شود . چون ۰==۴ نيست ، else اجرا مي شود بنابراين تابع به ازاي ۳=n فراخواني مي شود .
فراخواني دوم : براي بار دوم  چون تابع فاكتوريل در main فراخواني شده است ، بايد(۳)factorial  محاسبه شود . بنابراين دوباره عدد ۳ به عنوان ورودي تابع قرار خواهد گرفت . در تابع factorial ، چون ۰==۳ نيست else اجرا خواهد شد . بنابراين تابع به ازاي ۲=n فراخواني مي شود .
فراخواني سوم : براي بار سوم دوباره تابع factorial در main فراخواني مي شود . اين بار (۲)factorial بايد محاسبه شود . پس عدد ۲ به عنوان پارامتر ورودي به تابع factorial فرستاده مي شود .  در تابع factorial ، چون ۰==۲ نيست else اجرا خواهد شد . بنابراين تابع به ازاي ۱=n فراخواني خواهد شد .
فراخواني چهارم : براي بار چهارم دوباره تابع factorial در main فراخواني مي شود . اين بار (۱)factorial بايد محاسبه شود . پس عدد ۱به عنوان پارامتر ورودي به تابع factorial فرستاده مي شود .  در تابع factorial ، چون ۰==۱ نيست else اجرا خواهد شد . . بنابراين تابع به ازاي ۰=n فراخواني خواهد شد .
در فراخواني آخر چون عدد ۰ به عنوان ورودي به حساب مي آيد و شرط اول يعني ۰==۰ برقرار است ، عدد ۱ برگردانده خواهد شد (زيرا ۱=!۰) .
در اين صورت تابع فاكتوريل در بدنه خودش ، خودش را فراخواني مي كند و در نهايت بعد از پايان اين مراحل مقدار فاكتوريل عدد ۴ به main برگردانده خواهد شد .
بنابراين مقدار  ۲۴ به عنوان فاكتوريل عدد ۴ در خروجي نمايش داده خواهد شد .
كد اين برنامه به صورت زير مي باشد :
1234567891011121314151617181920#include #include using namespace std;int factorial( int);int main(){cout<

تا كنون نظري ثبت نشده است
ارسال نظر آزاد است، اما اگر قبلا در مونوبلاگ ثبت نام کرده اید می توانید ابتدا وارد شوید.