توابع
اسلاید 1: جلسه پنجم« توابع»
اسلاید 2: آنچه در اين جلسه مي خوانيد:1- توابع كتابخانهاي C++ استاندارد2- توابع ساخت كاربر3- برنامۀ آزمون4- اعلانها و تعاريف تابع5- كامپايل جداگانۀ توابع6- متغيرهاي محلي، توابع محلي›››
اسلاید 3: 7- تابع void 8 - توابع بولي 9- توابع ورودي/خروجي (I/O) 10- ارسال به طريق ارجاع (آدرس) 11- ارسال از طريق ارجاع ثابت 12-توابع بيواسطه ›››
اسلاید 4: 13- چندشکلي توابع 14- تابع main() 15- آرگومانهاي پيشفرض
اسلاید 5: هدف کلي:شناخت و معرفي توابع و مزاياي استفاده از تابع در برنامههاهدفهاي رفتاري:انتظار ميرود پس از پايان اين جلسه بتوانيد:- اهميت توابع و مزيت استفاده از آنها را بيان کنيد.- «اعلان» و «تعريف» تابع را بدانيد و خودتان توابعي را ايجاد کنيد.- «برنامۀ آزمون» را تعريف کرده و دليل استفاده از آن را بيان نماييد.- مفهوم «آرگومان» را بدانيد.- تفاوت ارسال به طريق «ارجاع» و ارسال به طريق «مقدار» و ارسال به طريق «ارجاع ثابت» را بيان کنيد و شکل استفاده از هر يک را بدانيد.›››
اسلاید 6: - «تابع بيواسطه» را شناخته و نحوۀ معرفي آن را بدانيد.- چندشکلي توابع را تعريف کنيد و شيوۀ آن را بدانيد.- طريقۀ بهکارگيري آرگومانهاي پيشفرض را بدانيد.- فرق بين تابع void با ساير توابع را بدانيد.
اسلاید 7: 1-مقدمهبرنامههاي واقعي و تجاري بسيار بزرگتر از برنامههايي هستند که تاکنون بررسي کرديم. براي اين که برنامههاي بزرگ قابل مديريت باشند، برنامهنويسان اين برنامهها را به زيربرنامههايي بخشبندي ميکنند. اين زيربرنامهها «تابع» ناميده ميشوند. توابع را ميتوان به طور جداگانه کامپايل و آزمايش نمود و در برنامههاي مختلف دوباره از آنها استفاده کرد.
اسلاید 8: 2- توابع كتابخانهاي C++ استاندارد«كتابخانۀ C++ استاندارد» مجموعهاي است که شامل توابع از پيش تعريف شده و ساير عناصر برنامه است. اين توابع و عناصر از طريق «سرفايلها» قابل دستيابياند.قبلا برخي از آنها را استفاده كردهايم: ثابت INT_MAX که در <climits> تعريف شده ، تابع ()sqrt که در <cmath> تعريف شده است و... .
اسلاید 9: تابع جذر sqrt()ريشۀ دوم يك عدد مثبت، جذر آن عدد است.تابع مانند يک برنامۀ کامل، داراي روند ورودي - پردازش - خروجي است هرچند که پردازش، مرحلهاي پنهان است. يعني نميدانيم که تابع روي عدد 2 چه اعمالي انجام ميدهد که 41421/1 حاصل ميشود.
اسلاید 10: برنامۀ سادۀ زير، تابع از پيش تعريف شدۀ جذر را به کار ميگيرد:#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;} براي اجراي يك تابع مانند تابع sqrt() کافي است نام آن تابع به صورت يک متغير در دستورالعمل مورد نظر استفاده شود، مانند زير:y=sqrt(x);
اسلاید 11: اين کار «فراخواني تابع» يا «احضار تابع» گفته ميشود. بنابراين وقتي كد sqrt(x) اجرا شود، تابع sqrt() فراخواني ميگردد. عبارت x درون پرانتز «آرگومان» يا «پارامتر واقعي» فراخواني ناميده ميشود. در چنين حالتي ميگوييم كه x توسط «مقدار» به تابع فرستاده ميشود. لذا وقتي x=3 است، با اجراي کد sqrt(x) تابع sqrt() فراخواني شده و مقدار 3 به آن فرستاده ميشود. تابع مذکور نيز حاصل 1.73205 را به عنوان پاسخ برميگرداند…
اسلاید 12: … اين فرايند در نمودار زير نشان داده شده. 31.73205xyMain()doubleintSqrt()31.73205متغيرهاي x و y در تابع main() تعريف شدهاند. مقدار x که برابر با 3 است به تابع sqrt() فرستاده ميشود و اين تابع مقدار 1.73205 را به تابع main() برميگرداند. جعبهاي كه تابع sqrt() را نشان ميدهد به رنگ تيره است، به اين معنا كه فرايند داخلي و نحوۀ کار آن قابل رويت نيست.
اسلاید 13: مثال 2-5 آزمايش يك رابطۀ مثلثاتياين برنامه هم از سرفايل <cmath> استفاده ميكند. هدف اين است که صحت رابطۀ Sin2x=2SinxCosx به شکل تجربي بررسي شود.int main(){ for (float x=0; x < 2; x += 0.2) cout << x << tt << sin(2*x) << t“ << 2*sin(x)*cos(x) << endl;}
اسلاید 14: 0 0 00.2 0.389418 0.3894180.4 0.717356 0.7173560.6 0.932039 0.9320390.8 0.999574 0.9995741 0.909297 0.9092971.2 0.675463 0.6754631.4 0.334988 0.3349881.6 -0.0583744 -0.05837441.8 -0.442521 -0.442521برنامۀ مقدار x را در ستون اول، مقدار Sin2x را در ستون دوم و مقدار 2SinxCosx را در ستون سوم چاپ ميكند. خروجي برنامه:خروجي نشان ميدهد که براي هر مقدار آزمايشي x، مقدار Sin2x با مقدار 2SinxCosx برابر است.
اسلاید 15: بيشتر توابع معروف رياضي كه در ماشينحسابها هم وجود دارد در سرفايل <cmath> تعريف شده است. بعضي از اين توابع در جدول زير نشان داده شده:
اسلاید 16:
اسلاید 17: توجه داشته باشيد که هر تابع رياضي يک مقدار از نوع double را برميگرداند. اگر يك نوع صحيح به تابع فرستاده شود، قبل از اين كه تابع آن را پردازش کند، مقدارش را به نوع double ارتقا ميدهد.
اسلاید 18: بعضي از سرفايلهاي كتابخانۀ C++ استاندارد که کاربرد بيشتري دارند در جدول زير آمده است:اين سرفايلها از كتابخانۀ C استاندارد گرفته شدهاند. استفاده از آنها شبيه استفاده از سرفايلهاي C++ استاندارد (مانند <iostream> ) است. براي مثال اگر بخواهيم تابع اعداد تصادفي rand() را از سرفايل <cstdlib> به كار ببريم، بايد دستور پيشپردازندۀ زير را به ابتداي فايل برنامۀ اصلي اضافه کنيم:#include <cstdlib>
اسلاید 19: 3- توابع ساخت كاربرگرچه توابع بسيار متنوعي در کتابخانۀ C++ استاندارد وجود دارد ولي اين توابع براي بيشتر وظايف برنامهنويسي كافي نيستند. علاوه بر اين برنامهنويسان دوست دارند خودشان بتوانند توابعي را بسازند و استفاده نمايند.
اسلاید 20: مثال 3-5 تابع cube()يك مثال ساده از توابع ساخت كاربر:int cube(int x){ // returns cube of x: return x*x*x;}اين تابع، مكعب يك عدد صحيح ارسالي به آن را برميگرداند. بنابراين فراخواني cube(2) مقدار 8 را برميگرداند.
اسلاید 21: نوع بازگشتي تابع cube() که در بالا تعريف شد، int است. نام آن cube ميباشد و يک پارامتر از نوع int به نام x دارد. يعني تابع cube() يک مقدار از نوع int ميگيرد و پاسخي از نوع int تحويل ميدهد. بدنۀ تابع، يك بلوك كد است كه در ادامۀ عنوان آن ميآيد. بدنه شامل دستوراتي است كه بايد انجام شود تا نتيجۀ مورد نظر به دست آيد. بدنه شامل دستور return است كه پاسخ نهايي را به مكان فراخواني تابع برميگرداند. يك تابع ساخت كاربر دو قسمت دارد: 1-عنوان 2- بدنه. عنوان يك تابع به صورت زير است:(فهرست پارامترها) نام نوع بازگشتي مثال:int cube(int x){… بدنه تابع }
اسلاید 22: دستور return دو وظيفۀ عمده دارد. اول اين که اجراي تابع را خاتمه ميدهد و دوم اين که مقدار نهايي را به برنامۀ فراخوان باز ميگرداند. دستور return به شکل زير استفاده ميشود:return expression;به جاي expression هر عبارتي قرار ميگيرد که بتوان مقدار آن را به يک متغير تخصيص داد. نوع آن عبارت بايد با نوع بازگشتي تابع يکي باشد.عبارت int main() که در همۀ برنامهها استفاده کردهايم يک تابع به نام «تابع اصلي» را تعريف ميکند. نوع بازگشتي اين تابع از نوع int است. نام آن main است و فهرست پارامترهاي آن خالي است؛ يعني هيچ پارامتري ندارد.
اسلاید 23: وقتي يک تابع مورد نياز را ايجاد کرديد، فورا بايد آن تابع را با يک برنامۀ ساده امتحان کنيد. چنين برنامهاي برنامۀ آزمون ناميده ميشود. 4- برنامۀ آزمون برنامۀ آزمون يک برنامۀ موقتي است که بايد «سريع و کثيف» باشد؛ يعني: لازم نيست در آن تمام ظرافتهاي برنامهنويسي – مثل پيغامهاي خروجي، برچسبها و راهنماهاي خوانا – را لحاظ کنيد. تنها هدف اين برنامه، امتحان کردن تابع و بررسي صحت کار آن است.
اسلاید 24: مثال 4-5 يك برنامۀ آزمون براي تابع cube()کد زير شامل تابع cube() و برنامۀ آزمون آن است:int cube(int x){ // returns cube of x: return x*x*x;}int main(){ // tests the cube() function: int n=1; while (n != 0) { cin >> n; cout << tcube( << n << ) = << cube(n) << endl; }}برنامۀ حاضر اعداد صحيح را از ورودي ميگيرد و مكعب آنها را چاپ ميكند تا اين كه كاربر مقدار 0 را وارد كند.
اسلاید 25: هر عدد صحيحي که خوانده ميشود، با استفاده از کد cube(n) به تابع cube() فرستاده ميشود. مقدار بازگشتي از تابع، جايگزين عبارت cube(n) گشته و با استفاده از cout در خروجي چاپ ميشود. ميتوان رابطۀ بين تابع main() و تابع cube() را شبيه اين شکل تصور نمود: 5 nint5125cube()main()5 xintدقت كنيد كه تابع cube() در بالاي تابع main() تعريف شده زيرا قبل از اين كه تابعcube() در تابع main() به كار رود، كامپايلر C++ بايد در بارۀ آن اطلاع حاصل كند.
اسلاید 26: مثال 5-5 يك برنامۀ آزمون براي تابع max()تابع زير دو پارامتر دارد. اين تابع از دو مقدار فرستاده شده به آن، مقدار بزرگتر را برميگرداند:int max(int x, int y){ // returns larger of the two given integers: 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);}
اسلاید 27: توابع ميتوانند بيش از يک دستور return داشته باشند. مثلا تابع max() را مانند اين نيز ميتوانستيم بنويسيم:int max(int x, int y){ // returns larger of the two given integers: if (x < y) return y; else return x;}در اين کد هر دستور return که زودتر اجرا شود مقدار مربوطهاش را بازگشت داده و تابع را خاتمه ميدهد. دستور return نوعي دستور پرش است (شبيه دستور break ) زيرا اجرا را به بيرون از تابع هدايت ميکند. اگرچه معمولا return در انتهاي تابع قرار ميگيرد، ميتوان آن را در هر نقطۀ ديگري از تابع قرار داد.
اسلاید 28: 5- اعلانها و تعاريف تابعبه دو روش ميتوان توابع را تعريف نمود:1-توابع قبل از تابع main() به طور كامل با بدنه مربوطه آورده شوند.2-راه ديگري که بيشتر رواج دارد اين گونه است که ابتدا تابع اعلان شود، سپس متن برنامۀ اصليmain() بيايد، پس از آن تعريف کامل تابع قرار بگيرد.
اسلاید 29: اعلان تابع با تعريف تابع تفاوت دارد. اعلان تابع، فقط عنوان تابع است که يک سميکولن در انتهاي آن قرار دارد.تعريف تابع، متن کامل تابع است که هم شامل عنوان است و هم شامل بدنه. اعلان تابع شبيه اعلان متغيرهاست. يک متغير قبل از اين که به کار گرفته شود بايد اعلان شود. تابع هم همين طور است با اين فرق که متغير را در هر جايي از برنامه ميتوان اعلان کرد اما تابع را بايد قبل از برنامۀ اصلي اعلان نمود.
اسلاید 30: همينها براي کامپايلر کافي است تا بتواند کامپايل برنامه را آغاز کند. سپس در زمان اجرا به تعريف بدنۀ تابع نيز احتياج ميشود که اين بدنه در انتهاي برنامه و پس از تابع main() قرار ميگيرد.در اعلان تابع فقط بيان ميشود که نوع بازگشتي تابع چيست، نام تابع چيست و نوع پارامترهاي تابع چيست.
اسلاید 31: فرق بين «آرگومان» و «پارامتر» :پارامترها متغيرهايي هستند که در فهرست پارامتر يک تابع نام برده ميشوند. پارامترها متغيرهاي محلي براي تابع محسوب ميشوند؛ يعني فقط در طول اجراي تابع وجود دارند. آرگومانها متغيرهايي هستند که از برنامۀ اصلي به تابع فرستاده ميشوند.
اسلاید 32: int max(int,int);int main(){ int m, n; do { cin >> m >> n; cout << tmax( << m << , << n << ) = << max(m,n) << endl; } while (m != 0);}int max(int x, int y){ if (x < y) return y; else return x;}مثال 6-5 تابعmax() با اعلان جدا از تعريف آناين برنامه همان برنامۀ آزمون تابع max() در مثال 5-6 است. اما اينجا اعلان تابع بالاي تابع اصلي ظاهر شده و تعريف تابع بعد از برنامۀ اصلي آمده است:توجه كنيد كه پارامترهاي x و y در بخش عنوان تعريف تابع آمدهاند (طبق معمول) ولي در اعلان تابع وجود ندارند.
اسلاید 33: اغلب اين طور است که تعريف و بدنۀ توابع در فايلهاي جداگانهاي قرار ميگيرد. اين فايلها به طور مستقل کامپايل1 ميشوند و سپس به برنامۀ اصلي که آن توابع را به کار ميگيرد الصاق2 ميشوند. 6- كامپايل جداگانۀ توابع توابع کتابخانۀ C++ استاندارد به همين شکل پيادهسازي شدهاند و هنگامي که يکي از آن توابع را در برنامههايتان به کار ميبريد بايد با دستور راهنماي پيشپردازنده، فايل آن توابع را به برنامهتان ضميمه کنيد. اين کار چند مزيت دارد:
اسلاید 34: 1- اولين مزيت «مخفيسازي اطلاعات» است. 2-مزيت ديگر اين است که توابع مورد نياز را ميتوان قبل از اين که برنامۀ اصلي نوشته شود، جداگانه آزمايش نمود. 3-سومين مزيت اين است که در هر زماني به راحتي ميتوان تعريف توابع را عوض کرد بدون اين که لازم باشد برنامۀ اصلي تغيير يابد.4-چهارمين مزيت هم اين است که ميتوانيد يک بار يک تابع را کامپايل و ذخيره کنيد و از آن پس در برنامههاي مختلفي از همان تابع استفاده ببريد.
اسلاید 35: int max(int x, int y){ if (x < y) return y; else return x;}max.cppتابع max() را به خاطر بياوريد. براي اين که اين تابع را در فايل جداگانهاي قرار دهيم، تعريف آن را در فايلي به نام max.cpp ذخيره ميکنيم. فايل max.cpp شامل کد زير است:
اسلاید 36: حال كافي است عبارت:#include <test.cpp> را به اول برنامه اصلي وقبل ازmain() اضافه كنيم:#include <test.cpp> int main(){ // tests the max() function: int m, n; do { cin >> m >> n; cout << tmax( << m << , << n << ) = << max(m,n) << endl; } while (m != 0);}
اسلاید 37: نحوۀ کامپايل کردن فايلها و الصاق آنها به يکديگر به نوع سيستم عامل و نوع کامپايلر بستگي دارد. در سيستم عامل ويندوز معمولا توابع را در فايلهايي از نوع DLL کامپايل و ذخيره ميکنند و سپس اين فايل را در برنامۀ اصلي احضار مينمايند. فايلهاي DLL را به دو طريق ايستا و پويا ميتوان مورد استفاده قرار داد. براي آشنايي بيشتر با فايلهاي DLL به مرجع ويندوز و کامپايلرهاي C++ مراجعه کنيد.
اسلاید 38: 6- متغيرهاي محلي، توابع محليمتغير محلي، متغيري است که در داخل يک بلوک اعلان گردد. اين گونه متغيرها فقط در داخل همان بلوکي که اعلان ميشوند قابل دستيابي هستند. چون بدنۀ تابع، خودش يک بلوک است پس متغيرهاي اعلان شده در يک تابع متغيرهاي محلي براي آن تابع هستند. اين متغيرها فقط تا وقتي که تابع در حال کار است وجود دارند. پارامترهاي تابع نيز متغيرهاي محلي محسوب ميشوند.
اسلاید 39: * مثال 7-5 تابع فاكتوريلاعداد فاكتوريل را در مثال 8-5 ديديم. فاكتوريل عدد صحيح n برابر است با:n! = n(n-1)(n-2)..(3)(2)(1)تابع زير، فاکتوريل عدد n را محاسبه ميکند:long fact(int n){ //returns n! = n*(n-1)*(n-2)*...*(2)*(1) if (n < 0) return 0; int f = 1; while (n > 1) f *= n--; return f;}اين تابع دو متغير محلي دارد: n و f پارامتر n يک متغير محلي است زيرا در فهرست پارامترهاي تابع اعلان شده و متغير f نيز محلي است زيرا درون بدنۀ تابع اعلان شده است.
اسلاید 40: همان گونه که متغيرها ميتوانند محلي باشند، توابع نيز ميتوانند محلي باشند. يک تابع محلي تابعي است که درون يک تابع ديگر به کار رود. با استفاده از چند تابع ساده و ترکيب آنها ميتوان توابع پيچيدهتري ساخت. به مثال زير نگاه کنيد. تابع محلي در رياضيات، تابع جايگشت را با p(n,k) نشان ميدهند. اين تابع بيان ميکند که به چند طريق ميتوان k عنصر دلخواه از يک مجموعۀ n عنصري را کنار يکديگر قرار داد. براي اين محاسبه از رابطۀ زير استفاده ميشود:
اسلاید 41: پس به 12 طريق ميتوانيم دو عنصر دلخواه از يک مجموعۀ چهار عنصري را کنار هم بچينيم. براي دو عنصر از مجموعۀ {1, 2, 3, 4} حالتهاي ممکن عبارت است از:12, 13, 14, 21, 23, 24, 31, 32, 34, 41, 42, 43كد زير تابع جايگشت را پيادهسازي ميكند:long perm(int n, int k){// returns P(n,k), the number of the permutations of k from n: if (n < 0) || k < 0 || k > n) return 0; return fact(n)/fact(n-k);}اين تابع، خود از تابع ديگري که همان تابع فاکتوريل است استفاده کرده است. شرط به کار رفته در دستور if براي محدود کردن حالتهاي غير ممکن استفاده شده است. در اين حالتها، تابع مقدار 0 را برميگرداند تا نشان دهد که يک ورودي اشتباه وجود داشته است.
اسلاید 42: برنامۀ آزمون براي تابع perm() در ادامه آمده است: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 << << perm(i,j); cout << endl; }}0 00 1 00 1 1 00 1 2 2 00 1 3 6 6 00 1 4 12 24 24 00 1 5 20 60 120 120 00 1 6 30 120 360 720 720 00 1 7 42 210 840 2520 5040 5040 0
اسلاید 43: 7- تابع voidلازم نيست يك تابع حتما مقداري را برگرداند. در C++ براي مشخص کردن چنين توابعي از کلمۀ کليدي void به عنوان نوع بازگشتي تابع استفاده ميکنند يک تابع void تابعي است که هيچ مقدار بازگشتي ندارد. از آنجا كه يك تابع void مقداري را برنميگرداند، نيازي به دستور return نيست ولي اگر قرار باشد اين دستور را در تابع void قرار دهيم، بايد آن را به شکل تنها استفاده کنيم بدون اين که بعد از کلمۀ return هيچ چيز ديگري بيايد:return;در اين حالت دستور return فقط تابع را خاتمه ميدهد.
اسلاید 44: 8- توابع بوليدر بسياري از اوقات لازم است در برنامه، شرطي بررسي شود. اگر بررسي اين شرط به دستورات زيادي نياز داشته باشد، بهتر است که يک تابع اين بررسي را انجام دهد. اين کار مخصوصا هنگامي که از حلقهها استفاده ميشود بسيار مفيد است.توابع بولي فقط دو مقدار را برميگردانند: true يا false . اسم توابع بولي را معمولا به شکل سوالي انتخاب ميکنند زيرا توابع بولي هميشه به يک سوال مفروض پاسخ بلي يا خير ميدهند.
اسلاید 45: مثال 10-5 تابعي كه اول بودن اعداد را بررسي ميكندکد زير يك تابع بولي است كه تشخيص ميدهد آيا عدد صحيح ارسال شده به آن، اول است يا خير:bool isPrime(int n){ // returns true if n is 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; // n has no nontrivial divisors}
اسلاید 46: 9- توابع ورودي/خروجي (I/O)بخشهايي از برنامه که به جزييات دست و پا گير ميپردازد و خيلي به هدف اصلي برنامه مربوط نيست را ميتوان به توابع سپرد. در چنين شرايطي سودمندي توابع محسوستر ميشود. فرض کنيد نرمافزاري براي سيستم آموزشي دانشگاه طراحي کردهايد که سوابق تحصيلي دانشجويان را نگه ميدارد. در اين نرمافزار لازم است که سن دانشجو به عنوان يکي از اطلاعات پروندۀ دانشجو وارد شود. اگر وظيفۀ دريافت سن را به عهدۀ يک تابع بگذاريد، ميتوانيد جزيياتي از قبيل کنترل ورودي معتبر، يافتن سن از روي تاريخ تولد و ... را در اين تابع پيادهسازي کنيد بدون اين که از مسير برنامۀ اصلي منحرف شويد.
اسلاید 47: قبلا نمونهاي از توابع خروجي را ديديم. تابع PrintDate() در مثال 9-5 هيچ چيزي به برنامۀ اصلي برنميگرداند و فقط براي چاپ نتايج به کار ميرود. اين تابع نمونهاي از توابع خروجي است؛ يعني توابعي که فقط براي چاپ نتايج به کار ميروند و هيچ مقدار بازگشتي ندارند. توابع ورودي نيز به همين روش کار ميکنند اما در جهت معکوس. يعني توابع ورودي فقط براي دريافت ورودي و ارسال آن به برنامۀ اصلي به کار ميروند و هيچ پارامتري ندارند. مثال بعد يک تابع ورودي را نشان ميدهد.
اسلاید 48: مثال 11-5 تابعي براي دريافت سن كاربرتابع سادۀ زير، سن کاربر را درخواست ميکند و مقدار دريافت شده را به برنامۀ اصلي ميفرستد. اين تابع تقريبا هوشمند است و هر عدد صحيح ورودي غير منطقي را رد ميکند و به طور مکرر درخواست ورودي معتبر ميکند تا اين که يک عدد صحيح در محدودۀ 7 تا 120 دريافت دارد: int age(){ // prompts the user to input his/her age and returns that value: int n; while (true) { cout << How old are you: ; cin >> n; if (n < 0) cout << atYour age could not be negative.; else if (n > 120) cout << atYou could not be over 120.; else return n; cout << ntTry again.n; }}
اسلاید 49: يك برنامۀ آزمون و خروجي حاصل از آن در ادامه آمده است:int age()int main(){ // tests the age() function: int a = age(); cout << nYou are << a << years old.n;}How old are you? 125 You could not be over 120 Try again.How old are you? -3 Your age could not be negative Try again.How old are you? 99You are 99 years old.
اسلاید 50: تا اين لحظه تمام پارامترهايي كه در توابع ديديم به طريق مقدار ارسال شدهاند. يعني ابتدا مقدار متغيري که در فراخواني تابع ذکر شده برآورد ميشود و سپس اين مقدار به پارامترهاي محلي تابع فرستاده ميشود. مثلا در فراخواني cube(x) ابتدا مقدار x برآورد شده و سپس اين مقدار به متغير محلي n در تابع فرستاده ميشود و پس از آن تابع کار خويش را آغاز ميکند. در طي اجراي تابع ممکن است مقدار n تغيير کند اما چون n محلي است هيچ تغييري روي مقدار x نميگذارد.
اسلاید 51: پس خود x به تابع نميرود بلکه مقدار آن درون تابع کپي ميشود. تغيير دادن اين مقدار کپي شده درون تابع هيچ تاثيري بر x اصلي ندارد. به اين ترتيب تابع ميتواند مقدار x را بخواند اما نميتواند مقدار x را تغيير دهد. به همين دليل به x يک پارامتر «فقط خواندني» ميگويند. وقتي ارسال به وسيلۀ مقدار باشد، هنگام فراخواني تابع ميتوان از عبارات استفاده کرد. مثلا تابع cube() را ميتوان به صورتcube(2*x-3) فراخواني کرد يا به شکل cube(2*sqrt(x)-cube(3)) فراخواني نمود. در هر يک از اين حالات، عبارت درون پرانتز به شکل يک مقدار تکي برآورد شده و حاصل آن مقدار به تابع فرستاده ميشود.
نقد و بررسی ها
هیچ نظری برای این پاورپوینت نوشته نشده است.