فصل پنجم توابع در ++ C

<!-- /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman";} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:35.4pt; mso-footer-margin:35.4pt; mso-paper-source:0;} div.Section1 {page:Section1;} -->

mohsen_mahyar@yahoo.com

فصل پنجم

  C++ در« توابع »

5 مقدمه 1

برنامه های واقعی و تجاری بسیار بزرگ تر از برنامه هایی هستند که تاکنون بررسی

کردیم. برای این که برنامه های بزرگ قابل مدیریت باشند، برنام هنویسان این برنامه ها را

نامیده می شوند. توابع را « تابع » به زیربرنامه هایی بخش بندی می کنند. این زیربرنامه ها

می توان به طور جداگانه کامپایل و آزمایش نمود و در برنامه های مختلف دوباره از آ نها

استفاده کرد. این بخش بندی در موفقیت یک نرم افزار شی گرا بسیار موثر است.

استاندارد C++ 5 توابع کتابخانه ای ‐2

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

تعریف <climits> که در INT_MAX قبلا برخی از آن ها را استفاده کرده ایم : ثابت

2)، تابع ‐ تعریف شده (مثال 15 <cmath> که در sqrt() 2)، تابع ‐ شده (مثال 1

که در time() 4) و تابع ‐ تعریف شده (مثال 22 <cstdlib> که در rand()

 

 

 

فصل پنجم / توابع 131

4). اولین مثال این بخش، استفاده از یک تابع ‐ تعریف شده (مثال 24 <ctime>

ریاضی را نشان می دهد.

sqrt() 5 تابع جذر ‐ * مثال 1

ریشۀ دوم یک عدد مثب ت، جذر آن عدد است. ریشۀ دوم 9، عدد 3 است .

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

قرار گیرد، عدد 3 از آن خارج می شود و وقتی عدد 2 در آن قرار گیرد، عدد

1/41421 از آن خارج می شود. تابع مانند یک برنامۀ کامل، دارای روند ورودی

پردازش ‐ خروجی است هرچند که پردازش، مرحله ای پنهان است. یعنی نمی دانیم که

1 حاصل می شود. تنها چیزی / تابع روی عدد 2 چه اعمالی انجام می دهد که 41421

1 جذر است و مجذور آن، عدد / که لازم است بدانیم این است که عدد 41421

ورودی 2 بوده است.

برنامۀ سادۀ زیر، تابع از پیش تعریف شدۀ جذر را به کار می گیرد:

#include <cmath> // defines the sqrt() function

#include <iostream> // defines the cout object

using namespace std;

int main()

{ //tests the sqrt() function:

for (int x=0; x < 6; x++)

cout << "\t" << x << "\t" << sqrt(x) << endl;

}

0 0

1 1

2 1.41421

3 1.73205

4 2

5 2.23607

این برنامه، ریشۀ دوم اعداد صفر تا پنج را چاپ م یکند. هر وقت اجرای برنامه به

اجرا می گردد. گرچه کد اصلی تابع مذکور sqrt() می رسد، تابع sqrt(x) عبارت

پنهان شده اما می توانیم مطمئن باشیم که به جای عبارت C++ درون کتابخانۀ

در اولین #include <cmath> قرار می گیرد. به دستور x مقدار جذر sqrt(x)

132 برنامه سازی پیشرفته

را sqrt() خط برنامه توجه کنید. کامپایلر به این خط نیاز دارد تا بتواند تعریف تابع

<cmath> پیدا کند. این خط به کامپایلر می گوید که تعریف تابع جذر در سرفایل

وجود دارد.

کافی است نام آن تابع به صورت یک sqrt() برای اجرای یک تابع مانند تابع

متغیر در دستورالعمل مورد نظر استفاده شود، مانند زیر:

y=sqrt(x).

sqrt(x) گفته می شود. بنابراین وقتی کد « احضار تابع » یا « فراخوانی تابع 1 » این کار

یا « آرگومان 2 » درون پرانتز x فراخوانی می گردد. عبارت sqrt() اجرا شود، تابع

توسط x فراخوانی نامیده م یشود. در چنین حالتی می گوییم که « پارامتر واقعی »

تابع sqrt(x) است، با اجرای کد x= 3 به تابع فرستاده می شود. لذا وقتی 3 « مقدار »

فراخوانی شده و مقدار 3 به آن فرستاده می شود. تابع مذکور نیز حاصل sqrt()

1.73205 را به عنوان پاسخ

برمی گرداند. این فرایند در نمودار

x مقابل نشان داده شده. متغیرهای

تعریف main() در تابع y و

که برابر با 3 x شده اند. مقدار

فرستاده sqrt() است به تابع

برمی گرداند. جعبه ای که تابع main() می شود و این تابع مقدار 1.73205 را به تابع

را نشان می دهد به رنگ تیره است، به این معنا که فرایند داخلی و نحوۀ کار sqrt()

آن قابل رویت نیست.

5 آزمایش یک رابطۀ مثلثاتی ‐ * مثال 2

استفاده می کند. هدف این است که صحت <cmath> این برنامه هم از سرفایل

به شکل تجربی بررسی شود. Sin2x=2SinxCosx رابطۀ

int main()

{ // tests the identity sin 2x = 2 sin x cos x:

for (float x=0; x < 2; x += 0.2)

cout << x << "\t\t" << sin(2*x) << "\t"

3

1.73205

x

y

int

double

3

1.73205

main() sqrt()

1 – Function call 2 – Argument 3 – Pass by value

 

فصل پنجم / توابع 133

<< 2*sin(x)*cos(x) << endl;

}

0 0 0

0.2 0.389418 0.389418

0.4 0.717356 0.717356

0.6 0.932039 0.932039

0.8 0.999574 0.999574

1 0.909297 0.909297

1.2 0.675463 0.675463

1.4 0.334988 0.334988

1.6 -0.0583744 -0.0583744

1.8 -0.442521 -0.442521

را در ستون دوم و مقدار Sin2x را در ستون اول، مقدار x برنامۀ بالا مقدار

2 را در ستون سوم چاپ می کند. خروجی نشان می دهد که برای هر SinxCosx

2 برابر است. البته این نتایج به SinxCosx با مقدار Sin2x مقدار ،x مقدار آزمایشی

طور کلی اثبات نمی کند که رابطۀ مذکور صحیح است اما به طور تجربی نشان می دهد

تعریف شده است. این float از نوع x که این رابطه درست می باشد. توجه کنید که

به درستی کار کند و خطای گردکردن رخ ندهد. x += امر سبب می شود که کد 0.2

حاصل تابع را می توانیم مانند یک متغیر معمولی در هر عبارتی به کار ببریم.

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

y = sqrt(2);

cout << 2*sin(x)*cos(x);

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

y = sqrt(1 + 2*sqrt(3 + 4*sqrt(5)))

بیشتر توابع معروف ریاضی که در ماشین حساب ها هم وجود دارد در سرفایل

تعریف شده است. بعضی از این توابع در جدول زیر نشان داده شده: <cmath>

<cmath> بعضی از توابع تعریف شده در سرفایل

تابع شرح مثال

مقدار 1.36944 را برمی گرداند acos( به رادیان) ( 0.2 ) x کسینوس معکوس acos(x)

مقدار 0.201358 را برمی گرداند asin( به رادیان) ( 0.2 ) x سینوس معکوس asin(x)

مقدار 0.197396 را برمی گرداند atan(

/ 0 نظر / 310 بازدید