Download presentation
Presentation is loading. Please wait.
Published byWidya Susman Modified over 6 years ago
2
توابع
3
دليل استفاده از تابع اجتناب از نوشتن تكراري خطوط يكسان در يك برنامه
ساختار برنامه بهتر و قابل فهم ميشود استقلال زير روالها از تابع main كه باعث ميشود بتوانيم از افراد مختلف براي پياده سازي بخشهاي مختلف استفاده كنيم
4
تابع چيست؟(ادامه) مفهوم تابع در زبان C مشابهت زيادي با مفهوم تابع در رياضيات دارد و در واقع مدل کننده تابع در رياضيات است.
5
مثال } int summation(int a, int b) { return(a+b); نوع بازگشتي اسم تابع
پارامترها int summation(int a, int b) { return(a+b); } بدنه تابع
6
مثال: تابعي بنويسيد كه يك عدد را گرفته و قدرمطلق آنرا برگرداند
مثال: تابعي بنويسيد كه يك عدد را گرفته و قدرمطلق آنرا برگرداند float Absolute(float num) { float result; if (num < 0) result = -num; else result = num; return result ; }
7
محل قرار گرفتن توابع هرتابع قبل از استفاده شدن بايد توسط كامپايلر شناخته شده باشد بنابراين بايد قبل از فراخواني توابع آنها را به سيستم معرفي نمود از آنجا كه در برنامه نويسي معمول است كه پياده سازي توابع بعد از تابع main انجام شود لذا قبل از تابع main تنها يك معرفي از توابع انجام ميشود در معرفي تابع تنها نوع خروجي، نام تابع و نوع آرگومانها معرفي ميشوند كه به آن نمونه اوليه (prototype) ميگويند
8
نمونه اوليه توابع Function Prototypes
نمونه اوليه تابع به کامپايلر مي گويد که شکل تابع به چه صورت است. لذا مي توان تابع را استفاده کرد حتي اگر کامپايلر هنوز پياده سازي تابع را نديده باشد. نمونه اوليه تابع موارد زير مشخص مي کند: اسم تابع تعداد و نوع آرگومانها نوع مقدار بازگشتي
9
مثال: float Absolute(float num) { if (num < 0) return -num; else
} void main() float x1,x2; printf( "\nEnter a number"); scanf( "%f" , &x1); x2 = Absolute(x1); printf( "\nAbsolute=%f", x2 ); float Absolute(float num); void main() { float x1,x2; printf( "\nEnter a number"); scanf( "%f" , &x1); x2 = Absolute(x1); printf( "\nAbsolute=%f", x2 ); } float Absolute(float num) if (num < 0) return -num; else return num;
10
مثال: با استفاده از تابع برنامهاي بنويسيد كه دو عدد گرفته و ماكسيمم آنرا نمايش دهد
int Max( int a , int b ) { if (a > b ) return a; else return b; } void main() int x1,x2; printf( "\nEnter two numbers "); scanf( "%d %d" , &x1 , &x2); printf( "\nMax(%d,%d)=%d", x1, x2, Max(x1, x2) ); Enter two numbers 5 8 Max(5,8)=8
11
پارامترهاي تابع پارامترهای تابع در داخل بدنه آن متغیر محلی محسوب میشوند. وقتی که تابع صدا زده می شود، فراخواننده تابع مقدار پارامترها را به تابع می فرستد. تابع یک کپی از مقدار پارامترها را دریافت می کند. لذا تغييراتي که در مقدار متغيرها، درون تابع اعمال ميشود تاثيري در مقدار آنها در تابع فراخواننده ندارد.
12
مثال: تابعي بنويسيد كه دو عدد گرفته و حاصل جمع آنها را برگرداند
مثال: تابعي بنويسيد كه دو عدد گرفته و حاصل جمع آنها را برگرداند int add2nums( int firstnum, int secondnum ) { int sum; sum = firstnum + secondnum; // just to make a point firstnum = 0; secondnum = 0; return sum; }
13
مثال: تست برنامه جمع void main() { int y , a , b ;
مثال: تست برنامه جمع void main() { int y , a , b ; printf( "\nEnter two numbers "); scanf( "%d %d" , &a , &b); y = add2nums( a , b ); printf( "\na is: %d " , a ); printf( "\nb is: %d " , b ); printf( "\ny is: %d " , y ); } Enter two numbers 5 9 a is: 5 b is: 9 y is: 14
14
int add2nums( int a, int b)
{ int sum; sum = a+ b; // just to make a point a= 0; b= 0; return sum; } void main() int y , a , b ; printf( "\nEnter two numbers "); scanf( "%d %d" , &a , &b); y = add2nums( a , b ); printf( "\na is: %d " , a ); printf( "\nb is: %d " , b ); printf( "\ny is: %d " , y );
15
متغيرهاي محلي (Local Variables)
پارامترها و متغیرهایی که داخل بدنه تابع و در قسمت تعریف تابع اعلان می شوند از نوع محلی هستند. متغیرهای محلی فقط در محدوده تابع با معنی هستند. بعد از پایان تابع، این متغیرها دیگر وجود ندارند. پس از بازگشت از تابع تمامي فضاي اختصاص يافته به متغيرهاي محلي آن، به سيستم بازپس داده ميشود.
16
متغيرهاي بلاكي (Block Variables)
اگر متغیری در داخل یک بلاک از کد (بین } و {) تعریف شده باشد، این متغیر از نوع بلاکی است و فقط در محدوده آن بلاک معتبر است و خارج از آن قابل شناسایی و استفاده نیست. { int var; … }
17
متغيرهاي عمومي (Global Variables)
شما می توانید متغیرها را خارج از محدوده توابع و بلاکها تعریف کنید این متغیرها از نوع عمومی هستند. متغیرهای عمومی از همه جای برنامه قابل استفاده هستند و همه بلاکها و توابع می توانند از آنها استفاده کنند.
18
محدوده یک متغیر (Scope)
محدوده یک متغیر قسمتی از برنامه است که متغیر در آن دارای معنی و قابل استفاده است (در واقع، در این محدوده متغیر وجود دارد).
19
مثال: void main() { int y; int a = y; printf( “%d\n” , a);
} خطای کامپایل!! a خارج از محدوده بلاک معنی ندارد.
20
متغيرهاي بلوكي تودرتو j k m void func1() { for (int j=0;j<10;j++)
int k = j*10; printf(“%d,%d\n”, j , k ); int m = j+k; printf(“%d,%d\n”, m,j); } j k m Available on the course home page in code/functions/blockscope.cpp
21
هنگام فراخوانی تابع چه اتفاقی می افتد؟
با فراخوانی تابع کنترل برنامه (program counter) بعد از پاس کردن آرگومانهای تابع به بدنه تابع منتقل میشود دستورات در بدنه تابع اجرا میشود تا به دستور return برسیم در توابعی که مقدار بازگشتی ندارند به } برسیم بعد از اجرای تابع مقدار خروجی تابع تولید شده و کنترل برنامه به محل فراخوانی تابع بازگردانده میشود.
22
مکانیزم بیان شده چگونه توسط کامپایلر و سیستم عامل پیاده سازی میشود
پیاده سازی ساختار بیان شده با استفاده از پشته (Stack) انجام میشود. پشته یک ساختار داده ای است بصورت آخرین ورودی-اولین خروجی Last In First Out
23
توابع بازگشتي (چرخشي) Recursion
توابع مي توانند خودشان را صدا بزنند!! اين موضوع بازگشت نام دارد. از آنجا که خيلي از مسائل ماهيت بازگشتي دارند، لذا با استفاده از اين ويژگي بسياري از مسائل را ميتوان حل نمود. اغلب مي توان مسائلي كه صورت پيچيده دارند را با بازگشت به راحتي حل نمود.
24
مثالي از توابع بازگشتي تابع فاکتوريل ويا
25
پياده سازي تابع فاكتوريل بصورت بازگشتي
int factorial( int n ) { if (n == 0) return 1; else return (n * factorial(n -1)); } Available on the course home page in code/functions/factorias.cpp
26
اصول طراحي توابع بازگشتي
ابتدا حالات توقف (stop case) را تعريف کنيد. يعني شرايطي که ديگر لازم نيست تابع خودش را دوباره صدا کند. سپس مرحله بازگشت را مشخص کنيد. يعني مساله را به مساله يا مسائل کوچکتر ولي مشابه بشکنيد و دوباره تابع را صدا کنيد.
27
اصول طراحي توابع بازگشتي (ادامه)
اغلب با استفاده از يك دستور if مشخص ميشود كه كداميك از حالتها بايد انجام شود. (حالت تكرار يا توقف) if (به حالت توقف رسيدي) مساله را حل كن else تابع را بارديگر با پارامترهاي جديد فراخواني كن
28
مثال برنامه بازگشتی بنویسید که حاصل عبارت زیر را محاسبه کند:
(تعداد n تا a داریم) تابعی بازگشتی به نام rad(a,n) مينويسيم كه این کار را انجام دهد. قانون بازگشت و شرط خاتمه :
29
rad(2,3) = sqrt(2+sqrt(2+sqrt(2)))=1.961571
float rad(float a , int n) { if (n==1) return sqrt(a); else return sqrt(a+rad(a,n-1)); } void main() printf("%f",rad(2,3)); rad(2,3) Sqrt(2+rad(2,2)) Sqrt(2+rad(2,1)) Sqrt(2) rad(2,3) = sqrt(2+sqrt(2+sqrt(2)))=
30
تمرين: محاسبه ب.م.م دو عدد
برنامه ای بازگشتی بنویسید که ب.م.م دو عدد را محاسبه کند. ب. م .م :Common Divisor Greatest (GCD) می خواهیم تابعی به نام gcd(a,b) بنویسیم که ب.م.م دو عدد a و b را محاسبه کند. روش معمول محاسبه ب.م.م، روش پلکانی است. 3 1 2 33 9 6 3 27 6 6
31
با دقت در رابطه صفحه قبل می توان گفت:
gcd(33,9)=gcd(9,33%9) (%: باقی مانده) به این ترتیب می توان قانون بازگشت و شرط خاتمه را به صورت زیر به دست آورد:
32
تمرین يک تابع بازگشتي بنويسيد که يک مثلث به صورت زير چاپ کند.
triangle(4); * *** ***** ******* triangle(5); * *** ***** ******* *********
33
فراخوانی با مقدار در مقایسه با فراخوانی با مرجع (Call-by-value vs
فراخوانی با مقدار در مقایسه با فراخوانی با مرجع (Call-by-value vs. Call-by-reference) تا کنون، توابع ما فقط يک کپي از متغیر را دريافت مي کردند اين روش صدا کردن با مقدار ناميده مي گردد. چون مقدار متغیر به تابع فرستاده مي شود نه خود متغیر. ما مي توانيم توابعي را تعريف کنيم که آدرس متغیر (خود متغیر) را دريافت کنند. اين روش صدا کردن با مرجع ناميده مي گردد. در اين روش، تابع مي تواند متغیر را مستقيما تغيير دهد.
34
مراجع متغیر مرجع در واقع يک اسم جايگزين براي يک متغیر واقعي است.
هر متغیر مرجع بايد مقدار دهي اوليه شود تا ما را به يک متغیر ديگر (واقعي) ارجاع دهد. به محض اينکه اين نوع متغیر ارجاع داده شد (يعني مرجع آن مشخص شد) مي توان مانند بقيه متغيرها از آن استفاده کرد.
35
Reference Variable Example
int count; int &rcnt = count; // rcnt is the same variable as count count = 1; printf( “rcnt is %d\n” , rcnt ); rcnt++; printf( “count is %d\n” , count ); rcnt is 1 count is 2 Code is on the course home page in code/functions/testref.cpp
36
حافظه محتويات آدرس متغير 5 100 x 7 102 y 10 120 z r 100 102 120
int x=5; 100 102 120 int y=7; محتويات آدرس متغير 5 100 x 7 102 y 10 120 z r int z=10; int &r=z;
37
پارامترهاي مرجع در تعريف تابع
در تعريف يک تابع، مي توانيد از متغیرهاي مرجع استفاده کنيد. در اين صورت، هنگام صدا زدن تابع مرجع متغیر مشخص خواهد شد. void add10( int &x) { x = x+10; } … add10(counter); Code is on the course home page in code/functions/testref.cpp The parameter is a reference
38
تابعی بنویسید که دو متغیر بگیرد و محتویات آنها را جابجا کند
void swap( int &x, int &y) { int tmp; tmp = x; x = y; y = tmp; }
39
استفاده از متغيرهاي مرجع
اگر تابع بخواهد چند مقدار خروجي داشته باشد از متغيرهاي مرجع استفاده ميشود. از آنجا كه براي متغيرهاي مرجع حافظه جديد اخذ نميشود، براي بالا بردن سرعت پردازش و اجتناب از عمليات كپي كردن مقدار متغيرها از متغيرهاي مرجع استفاده ميشود. اگر بخواهيم متغيري درون تابع قابل تغيير نباشد از كلمه كليدي const استفاده ميشود.
40
استفاده از متغيرهاي مرجع
متغير محلي قابل تغيير در تابع، هنگام فراخواني حافظه جديد اخذ ميشود void ProcessOnVarible(CMyType a); متغير محلي غير قابل تغيير در تابع، هنگام فراخواني حافظه جديد اخذ ميشود void ProcessOnVarible(const CMyType a); متغير مرجع قابل تغيير در تابع ، هنگام فراخواني حافظه جديد اخذ نميشود void ProcessOnVarible(CMyType& a); متغير مرجع غير قابل تغيير در تابع ، هنگام فراخواني حافظه جديد اخذ نميشود void ProcessOnVarible(const CMyType& a);
Similar presentations
© 2025 SlidePlayer.com Inc.
All rights reserved.