ارائه در حال بارگذاری است. لطفا صبر نمایید.

ارائه در حال بارگذاری است. لطفا صبر نمایید.

به نام خدا توابع.

ارائه های مشابه


ارائه در موضوع: "به نام خدا توابع."— رونوشت ارائه:

1 به نام خدا توابع

2 1-مقدمه برنامه‌هاي واقعي و تجاري بسيار بزرگ‌تر از برنامه‌هايي هستند که تاکنون بررسي کرديم. براي اين که برنامه‌هاي بزرگ قابل مديريت باشند، برنامه‌نويسان اين برنامه‌ها را به زيربرنامه‌هايي بخش‌بندي مي‌کنند. اين زيربرنامه‌ها «تابع» ناميده مي‌شوند. توابع را مي‌توان به طور جداگانه کامپايل و آزمايش نمود و در برنامه‌هاي مختلف دوباره از آن‌ها استفاده کرد.

3 2- توابع كتابخانه‌اي C++ استاندارد
مانند: ثابت INT_MAX که در <climits> تعريف شده ، تابع ()sqrt که در <cmath> تعريف شده است و... .

4 تابع جذر sqrt() ريشۀ دوم يك عدد مثبت‌، جذر آن عدد است. تابع مانند يک برنامۀ کامل، داراي ‌روند ورودي - پردازش - خروجي است هرچند که پردازش، مرحله‌اي پنهان است. يعني نمي‌دانيم که تابع روي عدد 2 چه اعمالي انجام مي‌دهد که1/41421 حاصل مي‌شود.

5 برنامۀ سادۀ زير، تابع از پيش تعريف شدۀ جذر را به کار مي‌گيرد:
#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);

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

7 … اين فرايند در نمودار زير نشان داده شده.
Main() Sqrt() int 3 x 3 y double متغيرهاي x و y در تابع main() تعريف شده‌اند. مقدار x که برابر با 3 است به تابع sqrt() فرستاده مي‌شود و اين تابع مقدار را به تابع main() برمي‌گرداند. جعبه‌اي كه تابع sqrt() را نشان مي‌دهد به رنگ تيره است، به اين معنا كه فرايند داخلي و نحوۀ کار آن قابل رويت نيست.

8 { for (float x=0; x < 2; x += 0.2)
مثال 2-5 آزمايش يك رابطۀ مثلثاتي اين برنامه هم از سرفايل <cmath> استفاده‌ مي‌كند. هدف اين است که صحت رابطۀ Sin2x=2SinxCosx به شکل تجربي بررسي شود. 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; }

9 خروجي برنامه: برنامۀ مقدار x را در ستون اول، مقدار Sin2x را در ستون دوم و مقدار 2SinxCosx را در ستون سوم چاپ‌ مي‌كند. خروجي نشان مي‌دهد که براي هر مقدار آزمايشي x، مقدار Sin2x با مقدار 2SinxCosx برابر است.

10 بيشتر توابع معروف رياضي كه در ماشين‌حساب‌ها هم وجود دارد در سرفايل <cmath> تعريف شده است. بعضي از اين توابع در جدول زير نشان داده شده: مثال شرح تابع acos(0.2) مقدار را برمي‌گرداند کسينوس معکوسx (به راديان) acos(x) asin(0.2) مقدار را برمي‌گرداند سينوس معکوس x (به راديان) asin(x) atan(0.2) مقدار را برمي‌گرداند تانژانت معکوس x (به راديان) atan(x) ceil( ) مقدار 4.0 را برمي‌گرداند مقدار سقف x (گرد شده) ceil(x) cos(2) مقدار را برمي‌گرداند کسينوس x (به راديان) cos(x) exp(2) مقدار را برمي‌گرداند تابع نمايي x (در پايه e) exp(x) fabs(-2) مقدار 2.0 را برمي‌گرداند قدر مطلق x fabs(x)

11 floor(3.141593) مقدار 3.0 را برمي‌گرداند
مقدار کف x (گرد شده) floor(x) log(2) مقدار را برمي‌گرداند لگاريتم طبيعي x (در پايه e) log(x) log10(2) مقدار را برمي‌گرداند لگاريتم عمومي x (در پايه 10) log10(x) pow(2,3) مقدار 8.0 را برمي‌گرداند x به توان p pow(x,p) sin(2) مقدار را برمي‌گرداند سينوس x (به راديان) sin(x) sqrt(2) مقدار را برمي‌گرداند جذر x sqrt(x) tan(2) مقدار را برمي‌گرداند تانژانت x (به راديان) tan(x)

12 توجه داشته باشيد که هر تابع رياضي يک مقدار از نوع double را برمي‌گرداند. اگر يك نوع صحيح به تابع فرستاده شود، قبل از اين كه تابع آن را پردازش کند، مقدارش را به نوع double‌ ارتقا مي‌دهد.

13 #include <cstdlib>
اين سرفايل‌ها از كتابخانۀ‌ C استاندارد گرفته شده‌اند. استفاده از آن‌ها شبيه استفاده از سرفايل‌هاي C++ استاندارد (مانند <iostream> ) است. براي مثال اگر بخواهيم تابع اعداد تصادفي rand() را از سرفايل <cstdlib> به كار ببريم، بايد دستور پيش‌پردازندۀ زير را به ابتداي فايل برنامۀ‌ اصلي اضافه کنيم: #include <cstdlib> شرح سرفايل تابع <assert> را تعريف مي‌کند <assert> توابعي را براي بررسي کاراکترها تعريف مي‌کند <ctype> ثابت‌هاي مربوط به اعداد مميز شناور را تعريف مي‌کند <cfloat> محدودۀ اعداد صحيح را روي سيستم موجود تعريف مي‌کند <climits> توابع رياضي را تعريف مي‌کند <cmath> توابعي را براي ورودي و خروجي استاندارد تعريف مي‌کند <cstdio> توابع کاربردي را تعريف مي‌کند <cstdlib> توابعي را براي پردازش رشته‌ها تعريف مي‌کند <cstring> توابع تاريخ و ساعت را تعريف مي‌کند <ctime>

14 3- توابع ساخت كاربر گرچه توابع بسيار متنوعي در کتابخانۀ‌ C++ استاندارد وجود دارد ولي اين توابع براي بيشتر وظايف‌ برنامه‌نويسي كافي نيستند. علاوه بر اين برنامه‌نويسان دوست دارند خودشان بتوانند توابعي را بسازند و استفاده نمايند.

15 مثال 3-5 تابع cube() int cube(int x) { // returns cube of x:
يك مثال ساده از توابع ساخت كاربر: int cube(int x) { // returns cube of x: return x*x*x; } اين تابع، مكعب يك عدد صحيح ارسالي به آن را برمي‌گرداند. بنابراين فراخواني cube(2) مقدار 8 را برمي‌گرداند.

16 يك تابع ساخت كاربر دو قسمت دارد:
1-عنوان بدنه. عنوان يك تابع به صورت زير است: (فهرست‌ پارامترها) نام‌ نوع‌ بازگشتي‌ مثال: int cube(int x) { … بدنه تابع } بدنۀ تابع، يك بلوك كد است كه در ادامۀ عنوان آن مي‌آيد. بدنه شامل دستوراتي است كه بايد انجام شود تا نتيجۀ مورد نظر به دست آيد. بدنه شامل دستور return است كه پاسخ نهايي را به مكان فراخواني تابع برمي‌گرداند. نوع بازگشتي تابع cube() که در بالا تعريف شد، int است. نام آن cube مي‌باشد و يک پارامتر از نوع int به نام x دارد. يعني تابع cube() يک مقدار از نوع int مي‌گيرد و پاسخي از نوع int تحويل مي‌دهد.

17 دستور return دو وظيفۀ عمده دارد
دستور return دو وظيفۀ عمده دارد. اول اين که اجراي تابع را خاتمه مي‌دهد و دوم اين که مقدار نهايي را به برنامۀ فراخوان باز مي‌گرداند. دستور return به شکل زير استفاده مي‌شود: return expression; به جاي expression هر عبارتي قرار مي‌گيرد که بتوان مقدار آن را به يک متغير تخصيص داد. نوع آن عبارت بايد با نوع بازگشتي تابع يکي باشد. عبارت int main() که در همۀ برنامه‌ها استفاده کرده‌ايم يک تابع به نام «تابع اصلي» را تعريف مي‌کند. نوع بازگشتي اين تابع از نوع int است. نام آن main است و فهرست پارامترهاي آن خالي است؛ يعني هيچ پارامتري ندارد.

18 تنها هدف اين برنامه، امتحان کردن تابع و بررسي صحت کار آن است.
4- برنامۀ آزمون وقتي يک تابع مورد نياز را ايجاد کرديد، فورا بايد آن تابع را با يک برنامۀ ساده امتحان کنيد. چنين برنامه‌اي برنامۀ آزمون ناميده مي‌شود. تنها هدف اين برنامه، امتحان کردن تابع و بررسي صحت کار آن است. برنامۀ آزمون يک برنامۀ موقتي است که بايد «سريع» باشد؛ يعني: لازم نيست در آن تمام ظرافت‌هاي برنامه‌نويسي – مثل پيغام‌هاي خروجي، برچسب‌ها و راهنماهاي خوانا – را لحاظ کنيد.

19 مثال 4-5 يك برنامۀ آزمون براي تابع 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; } return 0; برنامۀ حاضر اعداد صحيح را از ورودي مي‌گيرد و مكعب آن‌ها را چاپ مي‌كند تا اين كه كاربر مقدار 0 را وارد كند.

20 مي‌توان رابطۀ بين تابع main() و تابع cube() را شبيه اين شکل تصور نمود:
هر عدد صحيحي که خوانده مي‌شود، با استفاده از کد cube(n) به تابع cube() فرستاده مي‌شود. مقدار بازگشتي از تابع، جايگزين عبارت cube(n) گشته و با استفاده از cout در خروجي چاپ مي‌شود. دقت كنيد كه تابع cube() در بالاي تابع main() تعريف شده زيرا قبل از اين كه تابعcube() در تابع main() به كار رود، كامپايلر C++ بايد در بارۀ‌ آن اطلاع حاصل كند. 5 n int 125 cube() main() x مي‌توان رابطۀ بين تابع main() و تابع cube() را شبيه اين شکل تصور نمود:

21 مثال 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); return 0;

22 { // returns larger of the two given integers: if (x < y) return y;
توابع مي‌توانند بيش از يک دستور return داشته باشند. مثلا تابع max() را مانند اين نيز مي‌توانستيم بنويسيم: int max(int x, int y) { // returns larger of the two given integers: if (x < y) return y; else return x; } دستور return نوعي دستور پرش است (شبيه دستور break ) زيرا اجرا را به بيرون از تابع هدايت مي‌کند. اگرچه معمولا return در انتهاي تابع قرار مي‌گيرد، مي‌توان آن را در هر نقطۀ ديگري از تابع قرار داد. در اين کد هر دستور return که زودتر اجرا شود مقدار مربوطه‌اش را بازگشت داده و تابع را خاتمه مي‌دهد.

23 5- اعلان‌ها و تعاريف تابع
به دو روش ميتوان توابع را تعريف نمود: 1-توابع قبل از تابع main() به طور كامل با بدنه مربوطه آورده شوند. 2-راه ديگري که بيشتر رواج دارد اين گونه است که ابتدا تابع اعلان شود، سپس متن برنامۀ اصليmain() بيايد، پس از آن تعريف کامل تابع قرار بگيرد.

24 اعلان تابع شبيه اعلان متغيرهاست.
اعلان تابع با تعريف تابع تفاوت دارد. اعلان تابع، فقط عنوان تابع است که يک سميکولن در انتهاي آن قرار دارد. تعريف تابع، متن کامل تابع است که هم شامل عنوان است و هم شامل بدنه. اعلان تابع شبيه اعلان متغيرهاست. يک متغير قبل از اين که به کار گرفته شود بايد اعلان شود. تابع هم همين طور است با اين فرق که متغير را در هر جايي از برنامه مي‌توان اعلان کرد اما تابع را بايد قبل از برنامۀ اصلي اعلان نمود.

25 در اعلان تابع فقط بيان مي‌شود که نوع بازگشتي تابع چيست، نام تابع چيست و نوع پارامترهاي تابع چيست.
همين‌ها براي کامپايلر کافي است تا بتواند کامپايل برنامه را آغاز کند. سپس در زمان اجرا به تعريف بدنۀ تابع نيز احتياج مي‌شود که اين بدنه در انتهاي برنامه و پس از تابع main() قرار مي‌گيرد.

26 فرق بين «آرگومان» و «پارامتر» :
پارامترها متغيرهايي هستند که در فهرست پارامتر يک تابع نام برده مي‌شوند. پارامترها متغيرهاي محلي براي تابع محسوب مي‌شوند؛ يعني فقط در طول اجراي تابع وجود دارند. آرگومان‌ها متغيرهايي هستند که از برنامۀ اصلي به تابع فرستاده مي‌شوند.

27 int max(int,int); int main() { int m, n; do { cin >> m >> n; cout << "\tmax(" << m << "," << n << ") = " << max(m,n) << endl; } while (m != 0); return 0; } int max(int x, int y) { if (x < y) return y; else return x;} مثال 6-5 تابعmax() با اعلان‌ جدا از تعريف آن اين برنامه همان برنامۀ آزمون تابع max() در مثال 5-6 است. اما اين‌جا اعلان تابع بالاي تابع اصلي ظاهر ‌شده و تعريف تابع بعد از برنامۀ اصلي آمده است: توجه كنيد كه پارامترهاي x و y در بخش عنوان تعريف تابع آمده‌اند (طبق معمول) ولي در اعلان تابع وجود ندارند.

28 6- متغيرهاي محلي، توابع محلي
متغير محلي، متغيري است که در داخل يک بلوک اعلان گردد. اين گونه متغيرها فقط در داخل همان بلوکي که اعلان مي‌شوند قابل دستيابي هستند. چون بدنۀ تابع، خودش يک بلوک است پس متغيرهاي اعلان شده در يک تابع متغيرهاي محلي براي آن تابع هستند. اين متغيرها فقط تا وقتي که تابع در حال کار است وجود دارند. پارامترهاي تابع نيز متغيرهاي محلي محسوب مي‌شوند.

29 * مثال 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 نيز محلي است زيرا درون بدنۀ تابع اعلان شده است.

30 6- تابع void لازم نيست يك‌ تابع‌ حتما مقداري را برگرداند. در C++ براي مشخص کردن چنين توابعي از کلمۀ کليدي void به عنوان نوع بازگشتي تابع استفاده مي‌کنند يک تابع void تابعي است که هيچ مقدار بازگشتي ندارد. از آن‌جا كه يك تابع void مقداري را برنمي‌گرداند، نيازي به دستور return نيست ولي اگر قرار باشد اين دستور را در تابع void قرار دهيم، بايد آن را به شکل تنها استفاده کنيم بدون اين که بعد از کلمۀ return هيچ چيز ديگري بيايد: return; در اين حالت دستور return فقط تابع را خاتمه مي‌دهد.

31 توابع بولي فقط دو مقدار را برمي‌گردانند: true يا false .
8- توابع بولي در بسياري از اوقات لازم است در برنامه، شرطي بررسي شود. اگر بررسي اين شرط به دستورات زيادي نياز داشته باشد، بهتر است که يک تابع اين بررسي را انجام دهد. اين کار مخصوصا هنگامي که از حلقه‌ها استفاده مي‌شود بسيار مفيد است. توابع بولي فقط دو مقدار را برمي‌گردانند: true يا false . اسم توابع بولي را معمولا به شکل سوالي انتخاب مي‌کنند زيرا توابع بولي هميشه به يک سوال مفروض پاسخ بلي يا خير مي‌دهند.

32 { // returns true if n is prime, false otherwise:
مثال 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 }

33 همان گونه که متغيرها مي‌توانند محلي باشند، توابع نيز مي‌توانند محلي باشند.
يک تابع محلي تابعي است که درون يک تابع ديگر به کار رود. با استفاده از چند تابع ساده و ترکيب آن‌ها مي‌توان توابع پيچيده‌تري ساخت. به مثال زير نگاه کنيد. تابع محلي در رياضيات، تابع جايگشت را با p(n,k) نشان مي‌دهند. اين تابع بيان مي‌کند که به چند طريق مي‌توان k عنصر دلخواه از يک مجموعۀ n عنصري را کنار يکديگر قرار داد. براي اين محاسبه از رابطۀ زير استفاده مي‌شود:

34 كد زير تابع جايگشت را پياده‌سازي‌ مي‌كند: long perm(int n, int k)
اين تابع، خود از تابع ديگري که همان تابع فاکتوريل است استفاده کرده است. شرط به کار رفته در دستور if براي محدود کردن حالت‌هاي غير ممکن استفاده شده است. در اين حالت‌ها، تابع مقدار 0 را برمي‌گرداند تا نشان دهد که يک ورودي اشتباه وجود داشته است. پس به 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); }

35 برنامۀ آزمون براي تابع 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 0 0 1 0


دانلود ppt "به نام خدا توابع."

ارائه های مشابه


تبلیغات گوگل