صفحه 1:
« توایع»
صفحه 2:
آنچه در اين جلسه می خوانید
6- توابع کتابخانهاي 6++ استاندارد
توابع ساخت کاربر
9- برنامة آزمون
- اعلانها و تعاریف تابع
©- كاميايل جداكانة توابع
3- متغيرهاي محليء توابع محلي <<<
صفحه 3:
Void تابع -
۸ - توابع بولى
)۱/0( توابع ورودی /خروجی -٩
ارسال به طریق ارجاع (آدرس) -۰
ارسال از طریق ارجاع ثابت -۱
۲ (-توابع بیواسطه
>>>
صفحه 4:
۳- چندشکلی توابع
۴- تابع Qmain
۵- آر گومانهای پیشفرض
صفحه 5:
هدفهاي رفتاري:
انتظار ميرود پس از پایان ايزنهدفسه wis
- اهمیت توابع و مقنایش اسفغادای ازمزلن هادیراز بیارن wai
- «اعلان» و «تعریف» تابع را بدانید و خودتان توابعي را ایجاد
- «برنامة آزمون» را تعریف کرده و دلیل استفاده از آن را بیان
نمایید.
- مفهوم «آرگومان» را بدانید.
- تفاوت ارسال به طریق «ارجاع» و ارسال به طريق «مقدار»
و ارسال به طریق «ارجاع ثابت» را بیان کنید و شکل استفاده از
هر يك را بدانید.
>>>
صفحه 6:
- «تابع بيواسطه» را شناخته و نحوة معرفي آن را
بدانید.
- چندشكلي توابع را تعریف کنید و شیوة آن را
بدانيد.
- طريقة بمكاركيري آركومانهاي بيشفرض را
بدانيد.
- فرق بين تابع 70101 با ساير توابع را بدانيد.
صفحه 7:
١-مقدمه
برنامههاي واقعي و تجاري بسيار بزركتر از
برنامههايي هستند كه تاكنون بررسي كرديم. براي
اين كه برنامههاي بزرك قابل مديريت باشند»
برنامهنويسان اين برنامهها را به زيربرنامههايي
بخشبندي ميكنند. اين زيربرنامهها «تابع» ناميده
ميشوند. توابع را ميتوان به طور جداگانه کامپایل
و آزمایش نمود و در برنامههاي مختلف دوباره از
آنها استفاده کرد.
صفحه 8:
۳- توابع کتابخانهای )++ استانداره
«کتابخانة 6++ استاندارد» مجموعهاي است که
شامل توابع از پیش تعریف شده و سایر عناصر
برنامه است. این توابع و عناصر از طریق
«سرفایلها» قابل دستيابياند.
قبلا برخي از آنها را استفاده کردهايم: ثابت
6 ۱۵/۲ که در oad ay 23 <climits> »
تابع (50۲0 که در Cas ei <cmath> شده است
وه
صفحه 9:
ابع جنر ۳۶ 5()
ريشةه دوم يك عدد مثبت» جذر آن عدد است.
تابع مانند یک برنامة کامل» داراي روند ورودي -
پردازش - خروجي است هرچند که پردازش»
مرحلهاي پنهان است. بعني نميدانيم که تابع روي
عدد 2 چه اعمالي انجام ميدهد که 601/0 60622
حاصل ميشود.
صفحه 10:
برنامة سادة زیر تابع از پیش تعریف شدة جذر را
به كار ميكيرد:
#include <cmath> // defines the sqrt()
function
#include <iostream> // defines the cout object using
namespace std;
int main()
براي و ۷ تابع +560[1() كافي
است نام آن تابع به صورت يك متغير در 4ك
دستورالعمل مورد نظر استفاده شود» مانند زیر: }
y=sqrt(x);
صفحه 11:
اين كار «فر اخواني تابع» یا «احضار تابع» گفته
ميشود. بنابراين وقتي کد (50۲)2 اجرا cag
تابع 0۲1و() فراخواني ميگردد. عبارت « درون
پرانتز «آرگومان» یا «پارامتر واقعي» فراخواني
نامیده ميشود. در چنین حالتي ميگوييم که ۷ توسط
«مقدار» به تابع فرستاده ميشود. لذا وقني x=3
است. با اجراي کد (50۳۲0 تابع ع50۲()
فراخواني شده و مقدار 2 به آن فرستاده ميشود.
تابع مذکور نیز حاصل 0.26000 را به عنوان
پاسخ برميگرداند...
صفحه 12:
متغيرهاي << و لا در تابع 1103113() تعريف شدهاند. مقدار »ر که
برابر با © است به تابع +5011() فرستاده ميشود و اين تابع
مقدار 0.26606 را به تابع ۲3110() برميگرداند. جعبهاي
که تابع +50[1() را نشان ميدهد به رنك تيره استء به اين معنا
كه فرايند داخلي و نحوة کار آن قابل رويت نيست.
صفحه 13:
مثال 0-0 آزمایش يك رابطة مثلثاتي
اين برنامه هم از سرفايل <11323119©> استفاده ميكند. هدف اين
است که صحت رابطة »251102605 510222 به شکل
تجربي بررسي شود.
int main()
{ for (float x=0; x < 2; x += 0.2)
cout << x << "\t\t" << sin(2*x) << "\t“
<< 2*sin(x)*cos(x) << endl;
+
صفحه 14:
صفحه 15:
بسرمیگردلند
(0۰2) 2530 مقتار
08( را
بسرمیگردلند
(0۰2) ۵180 مقار
6( را
بسرمیگردلند
(3.141593) 6611
مقدار 4.00 را بسرمیگردلند
(2) 605 مقدار
7 را
بسرمیگردلند
suis exp )2(
بيشتر توابعلعروف ريالضي كه در خاثين,حسابها هم وجَلود دارد
١! يايلا 70261]6> تعريف شده است. بعضي |
at 1 tsar de guest : sl
سینوس معکوس 5 (به رادیان)
تانژانت معکوس ۲ (به رادیان)
مقدار سقف 2 (گرد شده)
کسینوس ۲ (به رادیان)
asin(x)
atan(x)
ceil(x)
cos (x)
صفحه 16:
(3.141593) ۶۱۵۵۲
مقنار 3.0 را بسرمیگردلند
suis 109 )2(
7 را
sib fea
(2) 10910 مقدار
03 را بسرمیگردلند
(2,3) 00۷ مقنار 8.0 را
sib fea
jus Sin(2)
7 را
بسرمگردلند
(2) 50۳1 مقدار
1 را برمیگردلند
Le Qanw FOrX
مقدار کف ۲ (گرد
شده)
لگاریتم طبیعی (در
ab @
لگاریتم عمومی (در
پایه 10)
Pol به
سینوس ۶ (به رادیان)
جذر >
floor(x
)
log (x)
10010 )
)
pow(x,p
)
sin(x)
sqrt(x)
صفحه 17:
توجه داشته باشید که هر تابع رياضي یک مقدار از
نوع 000016 را برميگرداند. اگر يك نوع صحیح
به تابع فرستاده شود قبل از این که تابع آن را
پردازش کند» مقدارش را به نوع 400016 ارتقا
ميدهد.
صفحه 18:
Ke,
(a سرفایلها از کتابخانة 6 استاندارد گرا re
شدهاند. استفاده از آنها شبیه استفاده از
سرفايلهاي 6++ استاندارد (مانند
مثال اگر sls cul ( <iostream>
را از Qrand بخواهيم تابع اعداد تصادفي
4b san IS 42 <cstdlib> سرفايل
دستور پیشپردازندة زیر را به ابتداي فایل
برنامة اصلي اضافه کنیم:
#include <cstdlib>
Ke, >, fe. ع" |]!
بع "رب
18 زش ]| || Ny | 2 )ام
۸
oO
صفحه 19:
۳- توابع ساخت کاربر
گرچه توابع بسیار متنوعي در کتابخانة 6++
استاندارد وجود دارد ولي اين توابع براي بيشتر
وظايف برنامهنويسي كافي نيستند. علاوه بر اين
برنامهنویسان دوست دارند خودشان بتوانند توابعي
را بسازند و استفاده نمايند.
صفحه 20:
مثال ۵0 تابع ۷06
يك مثال ساده از توابع ساخت کاربر:
int cube(int x)
> // عطبهء دمساع 6۲
return x*x*x;
}
© را برميكرداند.
صفحه 21:
يك تابع ساخت کاربر دو قسمت دارد:
صفحه 22:
ar}
صفحه 23:
صفحه 24:
مثال *0-6 يك برنامة آزمون براي تابع © طاناء()
کد زیر شامل تابع ۷۸06ع() و برنامة آزمون آن است:
int cube(int x)
{ // returns cube of x: a
return x*x*x; برنامة حاضر اعداد صحیح
را از ورودي ميگیرد و
int main() ۱ 3
مکعب آنها را چلپ؛ tests the cube() fundiien // {
تا این که کاربر مقدار 60 int n=1;
| وارد کند )0 =! while (n
را وارك كت cin>>n; {
cout >> ۳۱۲۷/۵۵/۳ >> ۲۱ <<") =" << cube(n)
<< endl; }}
صفحه 25:
هر عدد صحيحي که خوانده ميشود با استفاده از
كد (م0)عناء به تابع عحاباع() فرستاده ميشود.
دقت کنید که تابع 60۸06() در بالاي (main at
تعریف شده زیرا قبل از اين که تابع6 م۱() در تابع
cay) IS 4 ()main کامپایلر ++ باید در بارة آن
صفحه 26:
مثل 6-6 يك برنامة آزمون براي Qmax at
تابع زير دو پارامتر دارد. این تابع از دو مقدار فرستاده شده به آن مقدار بزرگتر را برميگرداند:
int max(int x, int y)
returns larger of the two given integers: // {
int z;
Z=(x>y)?xry;
return Z;
int main()
{ intm,n;
do
4 زم << م << لمك
cout << "\tmax(" <<.m <<""<<n<<") =" <<
max(m,n) << endl; }
while (m != 0);}
صفحه 27:
توابع ميتوانند بیش از یک دستور ۲6۸۲۱ داشته باشند. مثلا تابع 1b (max
مانند اين نیز ميتوانستيم بنویسیم:
دستور ۲۵۱1۲۲ نوعي دستور پرش است
(شبیه دستور 0۲61 ) زیرا اجرا را به
بیرون از تابع هدایت ميکند. اگرچه معمولا
۳ در انتهاي تابع قرار ميگیرد.
ميتوان آن را در هر نقطة ديگري از تابع
قرار داد
صفحه 28:
۵- اعلانها و تعاریف تابع
به دو روش میتوان توابع را تعریف نمود:
0-توابع قبل از تابع 0310() به طور كامل با
بدنه مربوطه آورده شوند.
راه ديگري که بیشتر رواج دارد اين گونه
است که ابتدا تابع اعلان شود» سپس متن برنامة
le ()ain hel پس از آن تعریف کامل
تابع قرار بكيرد.
صفحه 29:
عون ۱
در انتهاي آن قرار دارد.
Gy pad نابم» متن کامل تابع است که هم شامل
یک متغیر قبل از این که به کار گرفته شود باید .
اعلان شود. تابع هم همین طور است با اين فرق
که متغیر را در هر جايي از برنامه ميتوان
اعلان کرد اما تابع را باید قبل از برنامة اصلي
اعلان نمود.
صفحه 30:
در اعلان تابع فقط بیان ميشود که نوع باز گشتي
تابع چیست. نام تابع Come و نوع پارامترهاي تابع
>
همینها براي کامپایلر كافي است تا بتواند کامپایل
برنامه را آغاز کند. سپس در زمان اجرا به
تعریف بدنه تابع نیز احتیاج ميشود که اين بدنه
در انتهاي برنامه و پس از تابع JA ()main
fe
صفحه 31:
فرق بين «آرگومان» و «پارامتر» :
پارامترها متغير هايي هستند که در فورست
پارامتر یک تابع نام برده ميشوند.
پارامترها متغيرهاي محلي براي تابع محسوب
ميشوند؛ يعني فقط در طول اجراي تابع وجود
دارند.
آرگومانها متغیر هايي هستند که از برنامة
اصلي به تابع فرستاده ميشوند.
صفحه 32:
مثل 00 تابع(۳0۵) با اعلان جدا از تعریف آن int max(int, int);
این برنامه همان برنامة آزمون تابع ۳03() در مثل م6 i i
است. اما اینجا اعلان تابع بالاي تابع اصلي ظاهر شده و n: 118/51 ۳
تعریف تابع بعد از برنامة اصلي آمده است: ۷ d
0
زم << مم << مك {
cout << ۳۱۳۵/۳ >> ۲ <<","<<n <<")
۱
<< max(m,n) << endl; }
while (m != 0);}
int max(int x, int y)
{ if (x < y) return y;
else return x;}
صفحه 33:
۶- کامبایل حداگانة توابع
توابع کتابخانة 2)++ استاندارد به همین شکل
پیادهسازی شدهاند و هنگامی که یکی از تن توابع را
در برنامههایتان به کار میبرید باید بادستور
راهنمای پیشپردازنده, فایل آن توابع را به
برنامهتان ضمیمه کنید.
اين کار چند مزیت دارد:
صفحه 34:
۱- اولین مزیت «مخفیسازی اطلاعات» است.
۲-مزیت دیگر این است که توابع مورد نیاز را میتوان قبل
از این که برنامةٌ اصلی نوشته شود. جداگانه آزمایش
نمود.
میتوان تعریف توابع را عوض کرد بدون این که لازم
باشد برنامة اصلی تغییر یابد.
۴-چهارمین مزیت هم این است که میتوانید یک بار یک
تابع را کامپایل و ذخیره کنید و از لن پس در برنامههای
مختلفی از همان تابع استفاده ببرید.
صفحه 35:
تابع ا 111() را به خاطر بياوريد. براي اين که
اين تابع را در فايل جداكانهاي قرار دهيم» تعريف
آن را در فايلي به نام ۳320۰600 ذخیره
ميكنيم. فايل 11137.©122 شامل كد زير است:
ممع .اهس
int max(int x, int y)
if (x < y) return y; {
else return x;
صفحه 36:
حال كافي است include#:4 jhe
م > را به اول برنامه اصلي وقبل
مسمس دن
tH le ane max() function:
qo"
{ cin>>m>>
cout << "\tmax(" <<m<<","<<n<<")
<< max(m,n) << endl;
while (m != 0);}
صفحه 37:
نحوة کامپایل کردن فایلها و الصاق آنها به
يكديكر به نوع سيستم عامل و نوع كاميايلر بستكي
دارد. در سيستم عامل ويندوز معمولا توابع را در
فايلهايي از نوع |(] كاميايل و ذخيره ميكنند و
مينمايند. فايلهاي 1 |(] را به دو طريق ايستا و
پویا ميتوان مورد استفاده قرار داد براي آشنايي
بیشتر با فايلهاي ]اد] به مرجم ویندوز و
كاميايلرهاي 0++ مراجعه كنيد.
صفحه 38:
۶- متغیرهای محلی توابع محلی
متغیر محلي» متغيري است که در داخل یک بلوک
اعلان گردد. این گونه متغیرها فقط در داخل همان
این متغیرها فقط تا وقتي که تابع در حال کار است
وجود دارند.
پارامترهاي تابع نیز متغيرهاي محلي محسوب
ميشوند.
صفحه 39:
* مثال 0-7 تابع فاکتوریل
ی
ni = n(n-1)(n-2)..(3)(2)(1)
زیرء فاکتوریل عدد 10 را محاسبه ميکند:
ion fact(int nm
//returns n! = n*(n-1)*(n-2)*...*(2)*(1) {
if (n < 0) return 0;
return f;
اين تابع دو متغير محلي دارد: 1 و 1
SQN yl متغير محلي است
eres ews CESS)
اعلان شده و متغیر ۶ نیز محلي است
زيرا درون بدنة تابع اعلان شده است.
صفحه 40:
همان گونه که متغیرها میتوانند محلی باشند» توابع نیز ميتوانند محلي
ina باشند.
یک تابع محلي سبمي eon 92555 دیگر به کار رود. با
استفاده از چند تابع ساده و ترکیب آنها ميتوان توابع پيچيدهتري ساخت.
به مثال زیر نگاه کنید.
در ریاضیات تابع جایگشت را با (0)10,1] نشان ميدهند. اين تابع
بیان ميکند که به چند طریق ميتوان 1 عنصر دلخواه از یک مجموعة
0 عنصري را کنار یکدیگر قرار داد. براي اين محاسبه از رابطه زیر
استفاده ميشود:
Pink 7
9 24
R42) = (4- 2)! بط 2 2
صفحه 41:
{// returns P(n,k), the number of the permutations
of k from n:
if (n < 0) ۱۱ ۷ > 0 || k > n) return 0;
return fact(n)/fact(n-k);
1
صفحه 42:
برنامة آزمون براي تابع 06۲۲0() در ادامه آمده است:
long perm(int,int);
returns P(n,k), the number of //
permutations of k from n:
int main()
{ // tests the perm() function:
for (int i = -1; i < 8; i++)
{ for (int j= -1; j <= i+1; j++
cout << "" << per
cout << endl; }
صفحه 43:
۷- تابع void
لازم نیست يك تابع حتما مقداربي را بركرداند. در )++ براي
مشخص کردن چنین توابعي از کلمة كليدي ۷00 به عنوان نوع
بازنگشتي تابع استفاده ميکنند
یک تابع ۷0161 تابعي است که هیچ مقدار بازگشتي ندارد.
از آنجا که يك تابع ۷001 مقداري را برنميگرداند» نيازي به دستور
Cus return ولي اگر قرار باشد این دستور را در J void a
دهيم؛ بايد آن را به شكل تنها استفاده كنيم بدون اين كه بعد از كلمة
۲ هيج جيز ديكري بيايد:
return;
در اين حالت دستور ۲۵۲۷۸۲۲ فقط تابع را خاتمه ميدهد.
صفحه 44:
در بسياري از اوقات لازم است در برنامه» شرطي بررسي شود.
SI بررسي این شرط به دستورات زيادي نیاز داشته باشد» بهتر است که
یک تابع این بررسي را انجام دهد. اين کار مخصوصا هنگامي که از
حلقهها استفاده ميشود بسیار مفید است.
توابع بولي فقط دو مقدار را برميگردانند: 4 false .
ام دول بولی را سرك ۰ سل مواي انح ركس ريا شاك
بولي هميشه به یک سوال مفروض پاسخ بلي یا خیر ميدهند.
صفحه 45:
مثال 0-10 تابعي که اول بودن اعداد را بررسي ميکند
كد زير يك تابع بولي است که تشخیص ميدهد آيا عدد صحیح ارسال شد به آن» اول است یا خیر:
bool isPrime(int n)
returns true if nis prime, false otherwise: // {
float sqrtn = sqrt(n);
if (n < 2) return false; // 0 and 1 are not
primes
if (n < 4) return true; // 2 and 3 are the first
primes
if (n%2 == 0) return false; // 2 is the only even
prime
for (int d=3; d <= sqrtn; d += 2)
if (n%d == 0) return false; // n has a nontrivial
divisor
return true; 1۱ 5 has no nontrivial
divisors
1
صفحه 46:
4- توابع ورودی /خروجی (۱/0)
بخشهايي از برنامه که به جزییات دست و پا گیر ميپردازد و خيلي
به هدف اصلي برنامه مربوط نیست را ميتوان به توابع سپرد. درب
چنین شرايطي سودمندي توابع محسوستر ميشود.
فرض کنید نرمافزاري براي سیستم آموزشي دانشگاه طراحي کردهاید
که سوابق تحصيلي دانشجویان را نگه ميدارد. در اين نرمافزار لازم
است که سن دانشجو به عنوان يكي از اطلاعات پروندة دانشجو وارد
شود. اگر وظيفة دریافت سن را به عهدة یک تابع بگذارید» ميتوانید
جزيياتي از قبیل کنترل ورودي معتبر» یافتن سن از روي تاریخ تولد
و ... را در اين تابع پيادسازي کنید بدون اين که از مسیر برنامة
اصلي منحرف شوید.
صفحه 47:
قبلا نمونهاي از توابع خروجي را دیدیم. تابع ۳۳100366( در مثال 0-0 هیچ چيزي به برنامة اصلي
برنميگرداند و فقط براي جاب نتايج به کار ميرود.
لحتل هب
توابع ورودي نیز به همین روش کار ميکنند آما در جهت معکوس, را وان نف رم
ارسال آن به برنامة اصلي به کار ميروند و هیچ پارامتري ندارند.
صفحه 48:
مثال 00-© تابعي براي دريافق هين
تابع عطلها ژر سح age و هتسه زو ده و ره ی 11
برنامة اصلي ميفرستد. این تابع تقریبا هوشمند استع و oH
ورودي غير منطقيردا برزوميكنمج ##اطدس مكاد
محتببی کنر راب ع و یکرت 2 ویو <a Te BP
if (n> 120) pest, << ‘Na\tYou could not دار
else return a
cout << ۳ again.\n";
صفحه 49:
يك برنامة آزمون و خروجي حاصل از 1 inka de
ye gs the age() function:
giant << “\nYou are " <<a << '" years
An;
0 ۶ 12
Su coul To be 0 120
0 5 Bre ۶ <
Our age could Hot be
ative
0 8 م2 you? 9
-You are 99 years old
صفحه 50:
تا این لحظه تمام پارامترهايي که در توابع دیدیم به طریق مقدار ارسال شدهاند. يعني ابتدا مقدار متفيري که در
فراخواني تابع ذکر شده برآورد ميشود و سپس این مقدار به پارامترهاي محلي تابع فرستاده ميشود.
مثلا در فراخواني (0206)2» ابتدا مقدار < برآورد شده و سپس ابن مقدار به متغیر محلي 0] در تابع فرستاده
ميشود و پس از آن تابع کار خویش را آغاز ميکند. در طي اجراي تابع ممکن است مقدار 9 تغییر کند اما
چون 9 محلي است هیچ تغييري روي مقدار »< تميگذارد.
صفحه 51:
بس خود ۷ به تابع نميرود بلکه مقدار آن درون تابع كپي ميشود.
تغییر دادن اين مقدار كپي شده درون تابع هیچ تاثيري بر * اصلي ندارد.
به این ترتیب تابع ميتواند مقدار »2 را بخواند اما نميتواند مقدار را
تغییر دهد.
به همین دلیل به < یک پارامتر «فقط خواندني» ميگویند.
وقتي ارسال به وسیلة مقدار باشد» هنكام فراخواني تابع ميتوان از
عبارات استفاده کرد.
مثلا تابع ۷06ع() را ميتوان به صورت(3-*۱06)2» فراخواني
كرد يا به شكل ((3) 2[ ناء-(<2*50[16)7) 196لا فراخواني نمود.
در هر یک از اين حالات» عبارت درون برانتز به شكل يك مقدار تكي
برآورد شده و حاصل آن مقدار به تابع فرستاده ميشود.