برنامه هايي كه ماشين حساب تاكنون به بررسي و پياده سازي آن ها پرداخته ايم ، فقط شامل يك تابع اصلي به نام 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
بعد از اينكه تابع در بالاي main اعلان شد بايد به تعريف تابع بپردازيم . به اين معنا كه بدنه ي تابع نوشته شود . اين تعريف در جايي خارج از main نوشته مي شود .
فراخواني تابعبراي اينكه بتوان از تابع در main استفاده كرد بايد فراخواني شود . فراخواني يعني صدا زدن تابع در جايي از main كه به آن نياز داريم :
123456789#include "iostream"#include
12345678int minimum(int a , int b){ if(a123456789101112131415161718192021222324#include
1234567891011121314151617void convert();int main(){ convert(); system("pause"); return 0;} void convert(){int hours , minutes , seconds ;long int time;cout<<"enter time to be convert:"<
علاوه بر متغيرهاي محلي ، متغيرهايي وجود دارند كه اين متغيرها را مي توان در هر كجايي از برنامه كه بخواهيد استفاده كنيد كه به آن ها متغيرهاي سراسري يا 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
پنجشنبه ۲۱ دی ۹۶ | ۰۹:۵۵ ۳ بازديد
تا كنون نظري ثبت نشده است