250 likes | 496 Views
حسابگری الگوریتمی. مبحث پنجم: توابع و کلاسهای حافظه. فهرست مطالب. مقدمه آشنایی با ساختار توابع توابع بدون بازگرداندن مقدار توابعی که یک مقدار باز می گردانند توابع بازگشتی شرایط و حالات خاص توابع توابع کتابخانه ای. تعریف توابع. نوشتن تابع:
E N D
حسابگری الگوریتمی مبحث پنجم: توابع و کلاسهای حافظه
توابع و کلاس های حافظه فهرست مطالب • مقدمه • آشنایی با ساختار توابع • توابع بدون بازگرداندن مقدار • توابعی که یک مقدار باز می گردانند • توابع بازگشتی • شرایط و حالات خاص توابع • توابع کتابخانه ای
مقدمه تعریف توابع • نوشتن تابع: • براي هر قسمت از برنامه که به صورت منطقي مي تواند جداگانه کاري را انجام دهد. • انواع توابع • توابع کتابخانه اي: (cin، sin، clrscr) • تابع اصلي برنامه: main • توابع تعريف شده توسط برنامه نويس
مقدمه مزاياي استفاده از توابع برنامه نويسي ساخت يافته • نوشتن برنامه ساده تر مي شود. • تقسيم برنامه هاي بزرگ به بخش هاي ساده و کوچک تر • دستورالعملها و داده هاي هر تابع مستقل از ساير بخشها اجرا مي شود. • توانايي ايجاد همکاري بين افراد مختلف در اجراي هر بخش • اشکال زدايي ساده تر برنامه • استفاده از توابع در برنامه هاي ديگر با تغييرات اندک
مقدمه جنبه هاي مختلف يک تابع • تعريف تابع: • مجموعه اي از دستورات که عملکرد تابع را مشخص مي کند. • توابع را بعد از تابع main() مي نويسيم. • فراخواني تابع: • دستوري که تابع را فراخواني مي کند. • فراخواني با نام تابع صورت مي گيرد. (نامگذاري مانند متغيرها) • اعلان تابع (الگوي تابع): • مشخص کنندة نحوة فراخواني تابع
آشنایی با ساختار توابع چگونگی بیان ساختار تابع #include <iostream.h> void sample (int x, int y); الگوی تابع intmain( ) { int a, b; … sample (a, b); فراخواني تابع … return 0; } void sample (int x, int y) عنوان تابع { cout << “\n function structure”; cout << “x=” << x; … } <نوع تابع> نام تابع (ليست پارامترها) { 1دستور; 2دستور; … nدستور ; } آرگومانها پارامترها
آشنایی با ساختار توابع نکات مهم در تعریف تابع • الگوي تمام توابع را قبل از تابع main() اعلان کنيد. • اعلان در تابع main() نيز مجاز مي باشد. • نوع توابع را مشخص کنيد. • براي اجراي تابع آن را با نامش فراخواني کنيد. • متغيرهاي هر تابع داخل آن تعريف مي شود و امکان استفاده از آنها در تابع ديگر مگر از طريق پارامترها ممکن نمي باشد. • تعريف تابع داخل تابع ديگر امکان پذير نيست. • هنگام فراخواني به تعداد و نوع پارامترها و آرگومانها دقت کنيد. • هنگام اعلان الگوي تابع نيازي به ذکر اسامي پارامترها نيست و ذکر نوع کافيست. • اگر تابع فاقد آرگومان است کلمة void را قرار مي دهيم.
آشنایی با ساختار توابع نحوة عملکرد تابع هنگام فراخواني void func1 (int); void func2 (int, int); intfunc3 (float); int main() { … func2(a,b); … func1(a); … cout << func3(c); … return 0; } void func2 (int, int) { … } void func1 (int) { … } intfunc3 (float) { … }
آشنایی با ساختار تابع روشهاي ارسال پارامتر به توابع • انواع ارسال پارامتر از تابع فراخوان به تابع مورد نظر • روش فراخواني با مقدار • توابعي که هيچ مقداري را باز نمي گردانند. • توابعي که فقط يک مقدار را باز مي گردانند. • مقادير آرگومانها در پارامترها کپی شده، تغيير پارامترها تأثيري در آرگومانها ندارد. • روش فراخواني با ارجاع • توابع مي توانند چند مقدار را بازگردانند. • آدرس آرگومانها به پارامترها منتقل مي شود. (بحث اشاره گرها)
توابع بدون بازگرداندن مقدار مثال توابع بدون بازگرداندن مقدار • مثال 5-1: نمايش زمان بر حسب ثانيه Example 5-1: #include <iostream.h> void convert (void); int main() { convert() ; return 0; } //************************** void convert (void) { int hours, minutes, second; long int time ; cout << "\n Enter time to be convert: hour, minutes, second: "; cin >> hours >> minutes >> second; time=(long int) (60 * hours + minutes) * 60 + second ; cout << "\n Time is: ” << time << “ seconds"; } Enter time to be convert: hour, minutes, second: 2 2 2 Time is 7322 seconds.
توابع بدون بازگرداندن مقدار مثال توابع بدون بازگرداندن مقدار - 2 • مثال 5-2: يافتن بزرگترين مقدار بين سه عدد Example 5-2: #include <iostream.h> void findmax(int, int, int); int main() { int x, y, m; cout << "\nEnter three integer numbers: "; cin >> x >> y >> m; findmax(x, y, m); return 0; } //********************* void findmax(int p1, int p2, int p3) { int maxp; maxp = (p1 > p2) ? p1 : p2; maxp = (p3 > maxp) ? p3 : maxp; cout << "maximum= " << maxp; } Enter three integer numbers: 46 102 9 maximum= 102
توابع بدون بازگرداندن مقدار مثال توابع بدون بازگرداندن مقدار - 3 • مثال 5-3: نمايش نحوة تأثير آرگومانها و پارامترها بر يکديگر Enter two integer numbers: 46 23 You entered : x= 46 y= 23 f1 receives : x= 46 y= 23 new values in f1 : x=47 y= 24 After return from f1 : x= 46 y= 23 Example 5-3: #include <iostream.h> void f1(int, int); int main() { int x, y; cout << "\nEnter two integer numbers: "; cin >> x >> y; cout << " You entered : x= " << x << " y= " << y; f1(x, y); cout << "\n After return from f1 : x= " << x << " y= " << y; return 0; } //********************* void f1(int x, int y) { cout << "\n f1 recieves : x= " << x << " y= " << y; x ++; y ++; cout << "\n new values in f1 : x= " << x << " y= " << y; }
توابعی که یک مقدار باز می گردانند مثال توابع با بازگرداندن یک مقدار • مثال 5-4: تغيير حروف از کوچک به بزرگ Example 5-4: #include <iostream.h> #include <conio.h> char tocapital(char); int main() { char ch; cout << "\n Enter a character: "; ch = getche(); cout << "\n Result is: " << tocapital(ch); return 0; } //******************** char tocapital(char ch) { if (ch >= 'a' && ch <= 'z') ch -=32; return ch; } Enter a character: r Result is: R
توابعی که یک مقدار باز می گردانند مثال توابع با بازگرداندن یک مقدار - 2 • مثال 5-5: محاسبة مساحت دايره Example 5-5: #include <iostream.h> float area(float); int main() { float r, s; cout << "\nEnter the radius: "; cin >> r; s = area(r); cout << "\nArea = " << s; return 0; } //********************** float area(float r) { float s; s = r * r * 3.14; return s; } Enter the radius: 4.3 Area = 58.0586
Example 5-6: #include <iostream.h> #include <conio.h> int prime(int); int main() { int num; char ans; while(1) { cout << "\n Enter a number: "; cin >> num; if(prime(num)) cout << "\n Number " << num << " is prime."; else cout << "\n Number " << num << " is not prime."; cout << "\n Do you want to continue?(y/n): "; ans = getche(); if(ans != 'y') break; }// end of while return 0; } //******************** int prime(int num) { int i, temp = 1; for(i = 2; (i <= num / 2) && temp ; i++) if(num % i == 0) temp = 0; return temp; } توابعی که یک مقدار باز می گردانند مثال توابع با بازگرداندن یک مقدار - 3 • مثال 5-6: تشخيص اول بودن يک عدد Enter a number: 23 Number 23 is prime. Do you want to continue? (y/n): y Enter a number: 56 Number 56 is not prime. Do you want to continue?(y/n): n
توابع بازگشتی تعریف توابع بازگشتي • توابعي که در داخل خودشان، به نحوی خود را فراخواني مي کنند: • فراخواني مستقيم: يکي از دستورات تابع، فراخوان خودش است. • فراخواني غير مستقيم: دو تابع وجود دارد که هر يک ديگري را فراخواني مي کند. • براي ايجاد تابع بازگشتي، الگوريتم بايد: • داراي حالتي باشد که خاصيت بازگشتي داشته باشد. • داراي حالتي باشد که باعث توقف فراخواني بازگشتي شود.
توابع بازگشتی مثال توابع بازگشتي • مثال 5-9: محاسبة فاکتوريل Example 5-9: #include <iostream.h> unsigned long fact(int) ; int main() { int m ; cout << "\n Enter a positive integer number: "; cin >> m; cout << "\n number= " << m << " fact= " << fact(m); return 0; } //********************** unsigned long fact(int x) { if(x != 0) return(x * fact(x - 1)) ; return 1 ; } Enter a positive integer number: 10 number= 10 fact= 3628800
توابع بازگشتی مثال توابع بازگشتي - 2 • مثال 5-10: محاسبة ضرب دو عدد به صورت بازگشتي Example 5-10: #include <iostream.h> int product(int x, int y); int main() { int x, y; cout << "\nEnter two integer numbers: "; cin >> x >> y; cout << "\nThier product is " << product(x, y); return 0; } //*********************** int product(int x, int y) { if(y == 1) return x; return(x + product(x, y - 1)); } Enter two integer numbers: 23 3 Their product is 69
توابع بازگشتی مثال توابع بازگشتي - 3 • مثال 5-11: چاپ ارقام يک عدد صحيح Example 5-11: #include <iostream.h> void write_v(int); int main() { int x; cout << "Enter an integer number: "; cin >> x; write_v(x); return 0; } //***************** void write_v(int x) { if (x < 10) cout << x << endl; else { write_v(x / 10); cout << x%10 << endl; } } Enter an integer number: 15347 1 5 3 4 7
شرایط و حالات خاص توابع شرايط عدم نياز به اعلام الگوي تابع • مثال 5-13: محاسبة سود بانکي Example 5-13: #include <iostream.h> float calculate(float balance, float rate, int mon) { int i; float ben, sben = 0; for(i = 0; i < mon; i++){ ben = balance * rate / 100; balance += ben; sben +=ben; } return sben; } //**************************** int main() { int mon; float balance, rate, sben; cout << "\nEnter balance, rate, mon:"; cin >> balance >> rate >> mon; sben = calculate(balance, rate, mon); cout << "\n benefit= " << sben << " balance= " << balance; cout << "\n new balance is: " << balance + sben; return 0; } Enter balance, rate, moon: 10000 5 10 benefit= 6288.95 balance= 10000 new balance is: 16288.9
شرایط و حالات خاص توابع آرگومان هاي پيش فرض • تعيين مقداري به عنوان پيش فرض براي آرگومان توابع • محل تعيين پيش فرض: الگوي تابع • تعريف تابع در اين حالت با قبل تفاوتي ندارد. • محدوديت: • در تابعي با چند آرگومان، آرگومانهاي داراي پيش فرض بايد سمت راست ترين آرگومانها باشند. • هنگام فراخواني تابع، تمام آرگومانهاي سمت راست آرگومان حذف شده نيز بايد حذف شوند. Example: long myfunction (int x=50); long myfunction (int = 50);
شرایط و حالات خاص توابع آرگومان هاي پيش فرض - 2 • مثال 5-17: محاسبة حجم مکعب مستطيل First time Calculation: Length= 100 Width= 50 Height= 2 Area= 10000 Second time Calculation: Length= 100 Width= 50 Height= 1 Area= 5000 Third time Calculation: Length= 100 Width= 25 Height= 1 Area= 2500 Example 5-17: #include <iostream.h> int areaCube (int length, int width= 25, int height= 1); void main() { int area, length= 100, width= 50, height= 2; cout << "\nFirst time Calculation: \n"; cout << areaCube(length, width, height) << endl; cout << "\nSecond time Calculation: \n"; cout << areaCube(length, width) << endl; cout << "\nThird time Calculation: \n"; cout << areaCube(length) << endl; } //************************* int areaCube (int length, int width, int height) { cout << "Length= " << length << " Width= " << width << " Height= " << height; cout << "\nArea= "; return (length*width*height); }
توابع کتابخانه ای توابع رياضي • محاسبة قدر مطلق: • int abs (intnum) • double fabs (double num) • long labs (long num) • گرد کردن عدد: • double ceil (double num) • محاسبة کوچکترين عدد صحيح بزرگتر يا مساوي با عدد num • double floor (double num) • محاسبة بزرگترين عدد صحيح کوچکتر يا مساوي با عدد num
توابع کتابخانه ای توابع رياضي - 2 • توابع مثلثاتي (sin، cos، tan): • double sin (double arg) • زاويه ورودي بر حسب راديان – خروجي در بازة [-1,1] • توابع مثلثاتي (acos، asin، atan): • double asin (double arg) • ورودي بازة [-1,1] – خروجي بر حسب راديان • توابع هيپربوليک (sinh، cosh، tanh) • double tanh (double arg) • ورودي زاويه برحسب راديان
توابع کتابخانه ای توابع رياضي - 3 • توابع لگاريتمي و نمايي و تواني: • محاسبة تواني از e (پاية لگاريتم طبيعي) • double exp (double arg) • محاسبة لگاريتم طبيعي يک عدد مثبت • double log (double num) • محاسبة توانهاي يک مبنا • double pow (double base, double expe) • محاسبة توانهاي مبناي 10 • double pow10 (intexpe) • محاسبة لگاريتم مبناي 10 اعداد مثبت • double log10 (double num) • محاسبة جذر يک عدد مثبت • double sqrt (double num)