Joined: 27 Nov 2004 Posts: 1232 Location: www.parsx.com
Posted: Mon Nov 29, 2004 11:27 pm Post subject: توابع function
تعریف برنامه :
به مجموعه دستوراتی که یک هدف کلی را پیاده سازی می نماید برنامه اطلاق می شود .
تعریف زیر برنامه :
وظایف یک برنامه عموما بین زیر برنامه ها تقسیم می شود . به چنین روشی در برنامهنویسی که وظایف ببین پیمانه های زیر برنامه ای تقسیم می شود به چنین روشی در برنامه نویسی که وظایف بین پیمانه های زیر برنامه ای تقسیم شده اند برنامه نویسی ماژولار می گویند .
انواع زیر برنامه نویسی :
زیر برنامه هابر دو نوع اند:
الف) زیر برنامه تابع که لزوما یک مقدار را به عنوان حاصل عملیات در نام خود بر می گرداند
ب) زیر برنامه پروسیجر(procedure) که مقداری به عنوان حاصل عملیات در نام خود بر نمی گرداند
مزایای برنامه نویسی ماژولار (ساخت یافته) نسبت به روش غیر ماژولار :
1) خطا یابی آسانتر
2) اصلاح و توسعه آسانتر
3) امکان پیاده سازی یک برنامه توسط یک تیم
4) کوتاهتر شدن source برنامه
5) خواناتر شدن برنامه و آسانتر شدن پیگیری منطق اجرایی یک برنامه
نکته :
در زبان C زیر برنامه procedure به صورت تابعی با خروجی بدون نوع ( خروجی void) تعریف می شود . هر تابعی را از دو جنبه مورد برسی قرار می دهیم .
الف) از لحاظ نحوه تعریف که خود در زبان C شامل دو بخش است :
1) تعریف اعلان یا الگو یا مبتدای تابع : که بایستی برای کلیه توابع یک برنامه لحاظ شود.وجای آن قبل از تعریف تابع main انجام می باشد .
2) تعریف بدنه تابع : این بخش برای یک تابع پس از بدنه تابع main در زبان C پیاده سازی می گردد .
در تعریف بدنه تابع ابتدا اگوی تابع آورده می شود سپس بدنه برنامه در یک بلاک ({ }) نظیر تابع main لحاظ می گردد .
یادآوری :
حوضه تعریف متغییرها عموما بر دو نوع محلی وسراسری است . متغییرهای محلی را در یک تابع تعریف می کنیم و فقط در همان تابع می توانید از آنها استفاده کنیم
ب) فراخوانی تابع در زبان C نیز با آوردن نام تابع و اسامی آرگمانهای که به جای پارامترهای تعریف شده در بخش تعریف تابع قرار می گیرند تابع را فراخوانی می کنیم .
اعلان ها در زبان C به صورت زیر مورد استفاده قرار می گیرند :
نوع[نام متغیر]پارامترها )نام تابع نوع);
مثال:تعریف اعلان یک تابع را بنویسید با نام f1 که یک ورودی صحیح و یک خروجی صحیح داشته باشد ؟
int f1(int x);
مثال:تعریف اعلان یک تابع را بنویسید با نام f2 که یک ورودی صحیح ، یک ورودی اعشار ، یک ورودی خروجی از نوع اعشار و یک خروجی اعشار از نوع double داشته باشد ؟
double f2 (int,flout,flout*);
مثال:تعریف اعلان یک تابع را بنویسید که یک ورودی ویک ورودی خروجی داشه بدون اینکه مقداری را باز گرداند ؟
void p1(int,int*);
بدنه توابع نیز به صورت زیر مورد استفاده قرار می گیرند :
معرفی نوع و نام پارامترها)نام تابع نوع )
{
معرفی متغییر های محلی
}
مثال:برنامه ای بنویسید که عدد 100 را گرفته و مجموع اعداد 1 تا 100 را با استفاده از یک تابع محاسبه کند ؟
#inclode <stdio.h>
#inclode <conio.h>
int sigma(int);
main(){
int x=100,y;
y=sigma(x);
printf("sigma of 1 to %d is %d",x,y);
getch();
return 0;
}
int sigma(int n)
{
int sum=0;
for(;n>0;n--)
sum+=n;
return (sum);
}
مثال:برنامه ای بنیویسید که سه عدد صحیح را از ورودی دریافت نموده بزرگترین کوچکترین ومیانگین آنها را محاسبه نموده سپس این نتایج را در خروجی چاپ کند ؟ (راهنمایی از پنج زیر برنامه برای عملیات فوق استفاده کنید . آنها به ترتیب : تابع Getvalues برای خواندن اطلاعات ، تابع max برای محاسبه بزرگترین عدد از بین سه عدد و تابع min و avrg را نیز به همین ترتیب تعریف کرده سپس تابع showResults را برای نمایش مقادیر حاصل به کار برد)
#include <stdio.h>
#include <conio.h>
void getvalues(int *,int *,int *);
int max(int,int,int);
int min(int,int,int);
float avrg(int,int,int);
void showResult(int,int,float);
main()
{
int x=0,y=0,z=0,mx,mn,i;
for(i=1;i<9;printf("hello%d",i),i++);
float av;
clrscr();
getvalues(&x,&y,&z);
mx=max(x,y,z);
mn=min(x,y,z);
av=avrg(x,y,z);
showResult(mx,mn,av);
getch();
return 0;
}
void getvalues(int*x,int*y,int*z)
{
printf("\n\n Enter a number(1) :");
scanf("%d",x);
printf("\n Enter a number(2) :");
scanf("%d",y);
printf("\n Enter a number(3) :");
scanf("%d",z);
return;
}
int max(int o1,int o2,int o3)
{
int maximum;
if(o1>=o2)maximum=o1;
else maximum=o2;
if(o3>=maximum)maximum=o3;
return(maximum);
}
int min(int g1,int g2,int g3)
{
int minimum;
if(g1<=g2)minimum=g1;
else minimum=g2;
if(g3<=minimum)minimum=g3;
return(minimum);
}
float avrg(int t1,int t2,int t3)
{
float sum;
sum=t1+t2+t3;
sum=sum/3;
return(sum);
}
void showResult(int p1,int p2,float p3)
{
printf("\n\n\t Max = %d \n\n\t Min = %d \n\n\tAvrg = %0.2f",p1,p2,p3);
return;
}
Last edited by arash on Thu Dec 02, 2004 6:23 am; edited 1 time in total
Joined: 27 Nov 2004 Posts: 1232 Location: www.parsx.com
Posted: Thu Dec 02, 2004 6:03 am Post subject:
در مثال بالا اول هدر توابع تعریف شده سپس در تابع main به ترتیب توابع فراخوانی شد وهر کدام وظیفه خود را انجام داده و کنترل برنامه پس از انجام هر یک از زیر برنامه ها دوباره به قسمتmain باز می گردد. اولین زیر برنامه یعنی تابع getvalues وظیفه گرفتن سه مقدار وقرار دادن آن در x,y,z را بر عهده دارد .
برای این کار ما آدرس سه متغییر x,y,z را ( به وسیله دستور &x,&y,&z ) به درون تابع می فرستیم زیرا قرار است مقدار این سه متغییر در درون تابع تغییر کند ( چون قرار است سه متغییر x,y,z را از نوع call by reference باشند ) پس برای اینکه بعدا ما متغییرهای x,y,z را فراخوانی می کنیم مقادیر را در مکانهایی از حافظه که نامهای آنها x,y,z است ذخیره می کنیم و در تعریف خود تابع x,y,z را به صورت اشاره گر تعریف میکنیم . به همین خاطر برای استفاده از دستورscanf در تابع (getvalues (Function احتیاجی نیست مقادیر را در آدرس x,y,z ذخیره کنیم چون در داخل x,y,z ، آدرس متغییرهای اصلی x,y,z ذخیره شده است .
لازم به یاد آوری نیست که یک x,y,z در بدنه اصلی برنامه تعریف شده وبه عنوان متغییرهای اصلی هستند و یک x,y,z نیز به صورت محلی در تابع getvalues تعریف شده است .
Posted: Sun Dec 05, 2004 10:10 pm Post subject: نكات تكميلي
متغير هايي كه در داخل تابع تعريف ميشوند متغير هاي محلي local ناميده ميشوند و تنها در همان تابع كه تعريف شده اند قابل استفاده هستند . اين متغير ها بيرون از تابع ناشناس هستند .
متغير هاي سراسري Global يا عمومي خارج از بدنه تابع تعريف ميشوند . معمولا متغيرهاي سراسري را قبل از تابع main() تعريف ميشوند .
نكته مهم در مورد توابع سراسري انستكه از خط تعريف به بعد در دسترس هستند .
int a;
main(){
int b;
.
.
.
}
int c;
function1(...){
int d;
.
.
.
}
int e;
function2(...){
...}
در مثال فوق متغير a براي تمامي توابع تعريف شده است . متغير b تنها براي تابع main تعريف شده است .
متغير c براي function1 و funtion2 تعريف شده است .
متغير d تنها براي function1 تعريف شده است .
متغير e براي تابع function2 به بعد تعريف شده است . يعني اين متغير براي تابع function1 تعريف نشده است .
Last edited by vahid on Sun Dec 05, 2004 10:52 pm; edited 1 time in total
Posted: Sun Dec 05, 2004 10:13 pm Post subject: نكات تكميلي
نكته مهمي كه بايد يادتان باشد انستكه : در ابتداي هر بلوك } در صورتي كه متغيري تعريف شود تنها در همان بلوك براي برنامه قابل شناسايي است و بلافاصله پس از خارج شدن از بلوك { متغير تعريف شده پاك ميشود .
حتما ميدانيد كه استفاده از اين بلوك ها براي چه زمانهايي هست ؟ مثلا براي دستوراتي چون while و for و if و ... در هنگام باز شدن بلوك ميتوان متغيري تعريف كرد و بسته شدن همان بلوك متغير مربوطه پاك ميشود . اين متغير ها در استك سگمنت ساخته ميشوند و بلافاصله پس از خروج از بلاك در استكمنت از بين ( گم ميشوند ) ميروند .
Last edited by vahid on Sun Dec 05, 2004 11:06 pm; edited 1 time in total
Posted: Sun Dec 05, 2004 10:17 pm Post subject: نكات تكميلي
متغيرهاي محلي در استك ساخته ميشوند . هر گاه مقدار دهي اوليه نشوند . معلوم نخواهد بود چه مقداري در انها خواهد بود .
متغيرهاي عمومي يا سراسري در ديتا سگمنت تعريف ميشوند و هر گاه مقدار دهي اوليه نشوند مقدار اوليه انها صفر است .
متغيرهاي سراسري تا انتهاي برنامه زنده ميمانند .
هرگاه متغيري محلي و عمومي با يكديگر همنام شدند ان متغير محلي در بلاك تعريف شده اولويت دارد .
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum