تبلیغات
برنامه نویسی C++ - آموزش و سورس برنامه ی سی پلاس پلاس - مطالب توابع
برترین پیشنهاد

برنامه نویسی C++ - آموزش و سورس برنامه ی سی پلاس پلاس

بزرگترین پایگاه آموزش سی پلاس پلاس و سورس تمام برنامه های آن

انتقال مکان نما در صفحه نمایش:

اصولا برای ایجاد یک خروجی مناسب در صفحه نمایش نیازمند آن هستیم که به راحتی مکان نما را در صفحه حرکت داده و در هر نقطه که لازم باشد خروجی چاپ شود. این امکان در کامپایلر های شرکت بورلند به واسطه تابع gotoxy فراهم شده است. برای استفاده از این تابع باید هدر فایل conio.h را به برنامه اضافه کرد. این تابع دارای شکل کلی زیر است:

gotoxy(int x, int y);
//end

در حالت کنسول صفحه نمایش بصورت 80 ستون و 25 ردیف فرض میشود. که گوشه ی بالا سمت چپ، معادل نقطه (0,0) و گوشه ی پایین سمت راست معادل نقطه (80,25) در نظر گرفته میشود. نکته ی قابل توجه آن که در دستور gotoxy ایتدا شماره ستون و سپس شماره ردیف ذکر می گردد. برای مثال دستور زیر مکان نما را به ستون پنجم و ردیف دهم منتقل میکند:
gotoxy(5, 10);
//end

اما برای آنکه بتوانید در کامپایلر های دیگر از این تابع استفاده کنید، به لینک زیر مراجعه کنید:

نبود تابع clrscr و gotoxy در کامپایلر Dev C++ و نحوه تعریف آنها




دوستانی که با کامپایلر Dev C++ کار کرده اند، حتما میدانند که این کامپایلر دو تابع مهم gotoxy و clrscr رو در خودش به صورت تعریف شده نداره. ولی میشه این دو رو تعریف کرد و حتی بعد از تعریف با فرمت .h ذخیره و به عنوان هدر فایل استفاده کرد.
روش تعریف این دو در Dev C++ به شکل زیر است:

#include <iostream>
#include <windows.h>

using namespace std;

void gotoxy(int x, int y)
{
     HANDLE hConsoleOutput;
     COORD dwCursorPosition;
     cout.flush();
     dwCursorPosition.X=x;
     dwCursorPosition.Y=y;
     hConsoleOutput=GetStdHandle(STD_OUTPUT_HANDLE);
     SetConsoleCursorPosition(hConsoleOutput, dwCursorPosition);
}

void clrscr()
{
     system("cls");
}


//end


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

قالب های تابع(function template):
در توابع عم نام اگر تعداد آرگومان ها یکسان باشد و بدنه ی اجرایی تابع نیز به یک شکل باشد و فقط توابع در نوع بازگشتی و نوع آرگومانها تفاوت داشته باشند، می توان به جای نوشتن هر تابع از یک قالب تابع استفاده کرد. به شکل زیر و با کلمه ی کلیدی template:



template <class T>
T A ( T1, T2, ...)
{
    ...
}

//end
در بالا منظور از T هر نوع داده ای(مانند int) و از A نام تابع است. هم چنین T1, T2, ... آرگومان های تابع هستند.


توابع بازگشتی:

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

از خاصیت بالا برای انجام کارهایی که به صورت تکرار محاسبات مراحل قبلی صورت میگیرند، میتوان استفاده نمود.

در توابع بازگشتی، توجه به دو نقطه بسیار مهم است:

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

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

مثال: تابع بدست آوردن فاکتوریل عدد از نوع بازگشتی:


unsigned long fact(int x)
{
    if(x!=0)
        return (x*fact(x-1));
    return 1;
}


//end


در جلسه ی قبل با نحوه ی تعریف تابع و بخش های اصلی آن آشنا شدیم. حال ادامه ی مطلب را آموزش میدهیم.

محل تعریف توابع:

1.تعریف تابع و بدنه ی آن قبل از تابع اصلی:

(لیست آرگومان ها)     نام تابع     نوع تابع
}
بدنه
{
int main()
{
    return 0;
}

//end

2. تعریف خطی (معرفی تابع قبل از main و تعریف آن بعد از main):

;(لیست آرگومان ها)     نام تابع     نوع تابع
int main()
{
    return 0;
}
//end
(لیست آرگومان ها)     نام تابع     نوع تابع
}
بدنه
{
نکته: به دلیل ساختار top to down بودن در ++C، هنگامی که میخواهیم تابع را بعد از تابع اصلی(main) تعریف کنیم باید قبل از تابع اصلی آن را معرفی کنیم.

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

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


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

توابع در ++C:
برنامه ای که به این زبان نوشته میشود، حداقل شامل تابع main است که علاوه بر این میتواند از یک یا چند تابع تعریف شده توسط کاربر استفاده کند.

تعریف تابع:
روش اول:

(لیست آرگومان ها)     نام تابع     نوع بازگشتی
}
بدنه تابع
{

مثال:

int a(x,y,z)
char x;
int y;
float z;
{
x='a';
}

//end

روش دوم:

(...،آرگومان2 نوع2 ،آرگومان1 نوع 1)     نام تابع     نوع بازگشتی
}
بدنه تابع
{

مثال:

int b(char x, int y, float z)
{
x='a';
}

//end

تعریف بخش های یک تابع:

1. نوع بازگشتی:

نوع داده ای که قرار است تابع داده ای از آن نوع را به قسمتی که تابع را فراخوانی کرده است، برگرداند. مانند: int, float, double, char, void

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

2. نام تابع:

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

3. لیست آرگومان ها:

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

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

4. بدنه ی تابع:

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

به دلیل حجم نسبتا بالای مطالب، محل تعریف تابع و دیگر نکات آن را در جلسات آتی بیان میکنم.




در زیر تعدادی از توابع ریاضی مهم در ++C را آورده ام که برای استفاده از آنها باید هدر کتابخانه ای math.h را فراخوانی کنید:

sqr(x): مجذور متغیر x
sqrt(x): جذر متغیر x>=0
fmod(x): باقیمانده تقسیم x بر y
pow(x,y): x به توان y
abs(x): قدر مطلق x

و تعدادی از توابع آشنا:
log(x)
log10(x)
sin(x)
cos(x)
tan(x)


//end