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

 گام هفتم آموزش برنامه نویسی C++

چگونگی ایجاد دوره ها در یادگیری الکترونیکی


اهداف کلی:

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


اهداف رفتاری و عمکردی:

- اهمیت توابع و مزیت استفاده از آن‌ها را بیان کنید. «اعلان» و «تعریف» تابع را بدانید و خودتان توابعی را ایجاد کنید. «برنامه ی آزمون» را تعریف کرده و دلیل استفاده از آن را بیان نمایید. طریقه ی به‌کارگیری آرگومان‌ های پیش‌فرض را بدانید. فرق بین تابع void با سایر توابع را بدانید مشکلاتی که در صورت عدم وجود توابع با آن ها روبرو هستیم.

 

سرفصل های تئوری:

مزایای استفاده از توابع در برنامه و مشکلاتی که در صورت عدم وجود توابع با آن ها روبرو هستیم
توابع كتابخان های C++  استاندارد
توابع ساخت كاربر


 اعلان‌ها و تعاریف تابع سرفصل های عملی:

- تابع توان
- تابع رسم مثلث
- تابع زمرگذاری

 

مواد و تجهیزات لازم برای گام:

برنامه‌ های واقعی و تجاری بسیار بزرگ‌تر از برنامه‌ هایی هستند که تاکنون بررسی کردیم. برای این که برنامه‌ های بزرگ قابل مدیریت باشند، برنامه‌نویسان این برنامه‌ها را به زیربرنامه‌ هایی بخش‌بندی می‌کنند. این زیربرنامه‌ها «تابع» نامیده می‌شوند. توابع را می‌توان به طور جداگانه کامپایل و آزمایش نمود و در برنامه‌ های مختلف دوباره از آن‌ها استفاده کرد.
كتابخانه ی  C++  استاندارد» مجموع های است که شامل توابع‌ از پیش تعریف شده و سایر عناصر برنامه است‌. این توابع و عناصر از طریق «سرفایل‌ها» قابل دستیابی‌اند.


قبلا برخی از آن‌ها را استفاده كرد هایم‌ مواردی که تا به حال بدون اینکه نامی از توابع به میان بیاید،
تابع main
توابع cout,cin
توابع گرافیكی
مثال های دیگر استفاده از توابع، توابع مثلثاتی،‌ توابع ورودی و خروجی دیگر، توابع كار با فایل ها،‌كار با رشته ها و... است.


مشکلاتی که در صورت عدم وجود توابع با آن ها روبرو هستیم

• ‌در هر مورد از کاربرد های بالا برنامه نویس بایستی كاملا به جزییات پشت پرده عملیات آگاه باشد.
• حجم برنامه بسیار زیاد می شود چون برای هربار انجام هركاری، باید كد مربوط به آن در برنامه كپی شود.
• به دلیل حجم بالای كد، رفع اشكال برنامه مشكل است و در صورتی كه خطایی در قسمتی از برنامه كشف شود، باید در جای جای برنامه در تمام كپی های آن تصحیح شود.

 

مزایای استفاده از توابع در برنامه

1. شكستن برنامه به بخش هایی كه از لحاظ منطقی كار مستقلی را انجام می دهند.
2. قابلیت استفاده مجدد؛ می توان توابع را هر چند بار كه لازم است در جا های مختلف برنامه اجرا كرد.
3. حل مسیله آسان تر؛ با نوشتن توابع، دیگر نگران چگونگی انجام یك كار نیستیم؛ كافی است بدانیم چه كاری انجام می شود.

فراخوانی و استفاده از توابع

در صورتی كه تابع، ورودی بخواهد ورودی ها را به ترتیب و در قالبی كه نویسنده تابع (یا راهنمای C) به ما گفته است در میان پرانتز می آوریم و با كاما از هم جدا می كنیم. در غیر این صورت، جلوی نام تابع ( ) می گذاریم.
بعضی توابع نظیر توابع مثلثاتی،‌ نتیجه كار خود را به ما بر می گردانند بعضی هم مثل توابع گرافیكی خروجی ندارند. خروجی توابع می تواند توسط عملگر انتساب، در متغیری ریخته و نگهداری شود یا اینكه در عبارات محاسباتی در كنار متغیرها و اعداد و... استفاده شود این کار «فراخوانی تابع» یا «احضار تابع» گفته می‌شود. بنابراین وقتی كد sqrt(x) اجرا شود، تابع sqrt() فراخوانی می‌گردد. عبارت x درون پرانتز «آرگومان» یا «پارامتر واقعی» فراخوانی نامیده می‌شود. در چنین حالتی می‌گوییم كه x توسط «مقدار» به تابع فرستاده می‌شود. لذا وقتی x=3 است، با اجرای کد sqrt(x) تابع sqrt() فراخوانی شده و مقدار 3 به آن فرستاده می‌شود.
گرچه توابع بسیار متنوعی در کتابخانه ی‌ C++ استاندارد وجود دارد ولی این توابع برای بیشتر وظایف‌ برنامه‌نویسی كافی نیستند. علاوه بر این برنامه‌نویسان دوست دارند خودشان بتوانند توابعی را بسازند و استفاده نمایند.

 

مراحل استفاده از تابع:

1. معرفی تابع به كمپایلر (تا به حال این كار را با دستور #include‌ می كردیم.)


2. فراخوانی تابع به صورت:
(..., ورودی 2, ورودی 1) نام تابع


هنگام اجرا، با رسیدن برنامه به یك فراخوانی تابع، مراحل زیر طی می شود:

1. محاسبه ورودی های تابع (در صورت لزوم)
2. انتقال كنترل برنامه به درون تابع و انجام دستورات درون تابع
3. بازگشت كنترل برنامه به محل فراخوانی و جایگزینی فراخوانی تابع با مقدار خروجی آن.
4. ادامه اجرای برنامه


 

تعریف تابع جدید

پیش از اینكه در جایی از برنامه از تابع استفاده شود، باید بیرون از تابع main‌ یا هر تابع دیگری، تابع جدید را تعریف كرد:

  (..., نام ورودی 1 نوع ورودی 1) نام تابع                       نوع خروجی تابع

{
      دستورات تابع;
}

مثال:‌ تابع توان

int power(int base, int n)
{
       int i;
       int hasel;
 
       for (i=0; i               hasel *= x;
 
        return hasel;
}


نكات:
یك تابع ساخت كاربر دو قسمت دارد:
1-عنوان

2- بدنه

 

• بدنه ی تابع، یك بلوك كد است كه در ادامه ی عنوان آن می‌آید. بدنه شامل دستوراتی است كه باید انجام شود تا نتیجه ی مورد نظر به دست آید. بدنه شامل دستور return است كه پاسخ هایی را به مكان فراخوانی تابع برمی‌گرداند.
 
• دستورات اجرایی تابع، پس از اعلان نام تابع و پارامتر های آن، درون یك بلوك { } قرار می گیرند. به عدم استفاده از ; در پایان سطر اعلان تابع توجه شود.
 
• نام توابع از قوانین نامگذاری در زبان C مشابه متغیرها پیروی می كند. وجود دو تابع با نام مشابه یا یك متغیر با نامی مشابه با نام تابع، منجر به عدم كمپایل شدن و یا عدم اجرای درست برنامه می شود.


به دو روش می توان توابع را تعریف نمود:

توابع قبل از تابع main ( )  به طور كامل با بدنه مربوطه آورده شوند.
راه دیگری که بیشتر رواج دارد این گونه است که ابتدا تابع اعلان شود، سپس متن برنامه ی اصلی main ( )  بیاید، پس از آن تعریف کامل تابع قرار بگیرد.

 

• برنامه با رسیدن به دستور return، عبارت جلوی آن را محاسبه می كند و كنترل به برنامه فراخواننده بر می گردد و حاصل عبارت جلوی return به عنوان خروجی تابع به فراخواننده داده می شود.
• پس از اجرای دستور return برنامه از تابع خارج می شود.
• متغیر هایی كه درون تابع تعریف شده اند، در بیرون از تابع قابل دسترسی نیستند و با هربار فراخوانی تابع، دوباره از اول تعریف می شوند و مقادیر جدیدشان را می گیرند. بنابراین نحوه عملكرد تابع، به وضعیت قبلی اش بستگی ندارد.
• در صورتی كه تابع مقدار خروجی ندارد، نوع خروجی void تعریف می شود و در این حالت، جلوی دستور return چیزی به جز ; قرار نمی گیرد و این دستور تنها باعث خروج از تابع می شود.
• نمی توان از تایپ ورودی ها فاكتور گیری كرد. ورودی ها با ", " از هم جدا می شوند. حتی اگر تابع نیازی به ورودی ندارد، ( ) را باید گذاشت.
• نامگذاری ورودی ها هیچ تأثیری در فراخوانی تابع ندارد بلكه تنها تعداد، تركیب و نوع پارامترها مهم است. هنگام فراخوانی تابع، مقادیری كه به عنوان ورودی به تابع داده شده است از طریق این نام ها قابل دسترسی است. دلیلی ندارد نام متغیری كه به عنوان ورودی به تابع داده می شود با نامی كه در تابع به آن داده شده یكی باشد.
• تعداد ورودی های تابع هنگام فراخوانی باید دقیقا مساوی تعدادشان در اعلان تابع باشد.

مثال: تابع رسم مثلث. با استفاده از توابع، برنامه ای بنویسید كه مختصات ریوس یك مثلث را بگیرد و با استفاده از putpixel آن را رسم كند.

#include
#include
using namespace std;
// Draw line using pixels
void drawLine(int x1, int y1, int x2, int y2)
{
       int x; // current x
       int y; // current y

       // for all x’s
        for (x = x1; x < x2; ++x) {
               // find corresponding y
               y = y1 + (x2-x1)*(x-x1)/(y2-y1);
               putpixel(x, y);
        }
  }

  int main()
  {
        int x1, y1, x2, y2, x3, y3;

        // read points
       cout<<"X1 Y1? ";
       cin>>x1>>y1;
       cout<<"X2 Y2? ";
       cin>>x2>>y2;
       cout<<"X3 Y3? ";
 cin>>x3>>y3;
 
      // draw lines
      drawLine(x1, y1, x2, y2);
      drawLine(x2, y2, x3, y3);
      drawLine(x3, y3, x1, y1);

      // successful return
      return 0;
 }
 

تابع زیر دو پارامتر دارد. این تابع از دو مقدار فرستاده شده به آن، مقدار بزرگ‌تر را برمی‌گرداند:


int max(int x, int y)
{
 int z;
 z = (x > y) ? x: y ;
 return z;
}
int main()
{ int m, n;
 do
 { cin >> m >> n;
 cout << "\tmax(" << m << "," << n << ") = " << max(m,n) << endl; }
 while (m != 0);}


دستور return نوعی دستور پرش است (شبیه دستور break ) زیرا اجرا را به بیرون از تابع هدایت می‌کند. اگرچه معمولا return در انت های تابع قرار می‌گیرد، می‌توان آن را در هر نقطه ی دیگری از تابع قرار داد.
توابع می‌توانند بیش از یک دستور return داشته باشند. مثلا تابع  max()  را مانند این نیز می‌توانستیم بنویسیم:


 

int max(int x, int y)
{ // returns larger of the two given integers:
 if (x < y) return y;
 else return x;
}

گام به گام با برنامه نویسی به زبانC++


بخش پژوهش های دانش آموزی سایت تبیان

 

منبع:

Ctalk.ir 

firststep.ir

 

مطالب مرتبط

دیگر جلسات آموزشی