طبق قولی که دادم امروز درباره توابع صحبت میکنم .
خوب . دوستان برنامه ای که تاحالا نوشتیم تنها شامل یه تابع اصلی به نام main بود. اما وقتی طول برنامه مون بزرگ بشه و دارای قسمت های مختلف شد باید برای هر قسمت جداگانه کدنویسی کنیم و به هر یک از این بخشها تابع گویند. در واقع تابع برنامه ای است برای حل بخشی از مساله نوشته می شود.
تعداد زیادی از توابع که در اغلب برنامه ها مورد استفاده قرار می گیره و کاربرد زیادی دارند از قبل نوشته شده و به همراه کامپایلر C ارائه می گردد. مثل تابع clrscr یا sin یا cos و ... که به این جور توابع ، توابع کتابخانه ای گویند . اما من اینجا میخوام چگونگی نوشتن تابع رو یادتون بدم. تا بتونید به برنامه تون انعطاف بیشتری بدید.
نوشتن تابع:
اگر ما بدونیم کار تابع ما چیه هدفش چیه ؟ از ورودی چی میگیره و به خروجی چی ارسال میکنه نوشتن اون هم راحت تر میشه ×
هرتابع 2تا جنبه داره یکی جنبه ی تعریف و دیگری فراخوانی هست. نام یه تابع از قوانین یک متغیر پیروی میکنه.
تابع همانطوری که گفتیم 2 تا بخش داره یکی الگوی تابع یا همون تعریف و یکی هم عنوان اون که تو فراخوانی موثر هست حالا به تصویر زیر دقت کنید بیشتر توضیح میدم.
توضیح : در قسمت 1 اول تابعمون رو همانند یک متغیر تعریف میکنیم و پارامتر هایی که میگیره رو هم مینویسیم. در قسمت 2 تابع رو با مقادیر a و b که به ترتیب به جای x و y قرار میگیره صدا میزنم . در قسمت 3 هم بدنه ی تابع رو مینویسیم.
حالا قبل از این که مثال بزنم چندتا نکته میگم که بهش نیاز دارید :
1- اگر تابع دارای آرگومان نباشد مثلا sample() بود (شبیه sub تو ویبی) باید به جای آرگومان آنها void بنویسیم :
2- در صورتی که عنوان تابع یا قسمت 3 رو قبل از تابع main بنویسیم نیازی به نوشتن الگوی تابع یا بخش 1 نداریم.
3- برای اینکه تابع ما مقداری رو برگشت بده (function در ویبی) باید از دستور return که قبلا توضیح دادم استفاده کنید.
4- در صورتی که تابع با استفاده از void تعریف بشه دیگه نمی توته مقداری رو برگردونه.
توابعی که هیج مقداری رو بر نمیگردونند
Example 1:
برنامه ای بنویسید (شما که نمی نویسید پس برنامه ای بنویسم
) که ساعت ، دقیقه و ثانیه رو بگیره و زمان رو بر حسب ثانیه چاپ کنه.(سورس ضمیمه شد)
یه نگاه به سوال کرده باشید میفهمید باید یه تابع بنویسید که هیچ مقداری رو برگشت نمیده فقط فقط چاپ میکنه !
توضیحات :
همان طور که گفتیم تابع چیزی رو برنمی گردونه پس به صورت void تعریف میکنیم و چون تابع ما آرگومانی نداره بجاش void میزایم.
به دلیل اینکه تعداد ثانیه ممکنه زیاد باشه پس long int تعریف میکنیم (اعداد صحیح بزرگ)
کد:
kol =(long int) (s+m*60+h*3600);
پس از محاسبه ، تعداد ثانیه رو به long int تبدیل میکنیم و داخل متغیر kol قرار میدیم. (اینا رو قبلا گفتم ) بعد هم نتیجه چاپ میشه!
Example 2:
برنامه ای بنویسید که 3 مقدار صحیح رو از ورودی بگیره بعد بزرگترین مقدار رو چاپ کنه. (سورس ضمیمه شد)
Example 2:
کد:
void findmax(int x, int y, int z){
int max;
max = (x>y) ?x:y;
max = (max>z) ? max:z;
printf ("Maximum is : %d\n",max);
}
توضیح : نیازی نداره فقط قسمت مقایسه عدد بزرگتر رو بهتون میگم : عملگر ؟ رو که میدونید چیه اگر نمیدونید دوباره از صفر شروع کنید . اگر x بزرگتر بود انتخاب شده در غیر این صورت y منتخب میشود. بعد هم عدد بزرگتر با z مقایسه میشه و در خروجی چاپ میشه همین.
نکته :زمانیکه داخل یه تابع هستید (منظورم بدنه تابع هست) مقادیر آرگومان رو تغییر بدید مشکلی پیش نمیاد و مقدار جدید میگیره اما هنگامی که از تابع بیرون میره دوباره مقدار های اولیه خودشو بدست میاره.
توابعی که یک مقدار رو برمیگردانند.
همانطوری که گفتم نمیشه با void تعریف کرد زیرا تابع باید مقادیری رو برگردونه.
برای برگشت هم باید از return استفاده کرد که این دستور باعث میشه مقداری رو که ما بهش میدیم در نام تابع قرار بده.
با یه مثال بیشتر باهاش آشنا بشید. (سورس ضمیمه شد)
برنامه ای بنویسید که شعاع دایره رو از ورودی بخونه به تابعی ارسال کند و تابع مساحت دایره رو حساب کنه و به برنامه اصلی برگرداند.
Example 3 :
شعاع هم شاید .... :-"
کد:
مساحت دایره = 3.14 * شعاع * شعاع
کد:
res=circle(r);
float circle (float r){
float s;
s= r*r*3.14;
return s;
}
توضیح : تابع با متغیر r فراخوانی میشه بعدش مقدار مساحت در متغیر s ذخیره می شود در آخر مقدار متغیر s به عنوان نام تابع برگشت داده میشود و متغیر res با مقدار s مقداردهی میشه.
متغیر های محلی همنام با متغیر های عمومی:
توضیحی مختصر میدم و اما در جلسه بعدی به طور کامل روش بحث خواهیم کرد.
اگر در تابعی متغیری تعریف کنیم حوزه ی این متغیر محلی است اگر در بالای تابع main بعد از include ها تعریف بشه حوزه ی فعالیت این نوع متغیر عمومی میباشد.
و اینو بدونید هنگام مقدار دهی در یک تابع اولویت با متغیر محلی میباشد.
محاسبه قاکتوریل با استفاده از یک تابع
اینم از اون دسته از سورس هاست که باید باید یاد بگیرید . در این جور برنامه ها تابع خودش رو فراخوانی میکنه .
اصلا فاکتوریل چیه ؟(خوب شاید بعضی ها نمیدونن اشکالی نداره که)
کد:
4!=1*2*3*4
یا
4!=3!*4
Example 4:
برنامه ای بنویسید که فاکتوریل یک عدد رو به کمک تابع بازگشتی محاسبه کند (سورس ضمیمه شد)
کد:
unsigned long fact(int f){
if (f != 0)
return (f*fact(f-1));
return 1;
}
اینو دیگه توضیح نمیدم میترسم تنبل بشید
. یه بار با دقت تریس کنید مطمئن هستم یاد میگیرید.
امروزم روش نوشتن تابع و فراخوانی اونو یاد گرفتیم سعی میکنم از جلسه بعد فشرده تر کار کنیم تا زود این زبان تموم بشه منم برم پی کارم.
شوخی کردم ما مخلص بروبکس iranvig هستیم
جلسه ی بعد درباره کلاس های حافظه و متغیر ها توضیح میدم.
اگر نظر خوبی نسبت به آموزش های بنده دارید با تشکر اعلام کنید (بالاخره ما هم باید واسه خودمون تو سایت آبرو جمع کنیم :d)
موفق باشید.