ParsX.com
پذیرش پروژه از دانشجویی ... تا سازمانی 09376225339
 
   ProfileProfile   Log in to check your private messagesLog in to check your private messages  |  FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups Log inLog in   RegisterRegister 

فرق procedure و function جلسه هشت . 16 آذر

 
Post new topic   Reply to topic    ParsX.com Forum Index -> C/C++ Programming
View previous topic :: View next topic  
Author Message
arash
مدير بخش سي
مدير بخش سي


Joined: 27 Nov 2004
Posts: 1232
Location: www.parsx.com

PostPosted: Mon Dec 06, 2004 10:47 pm    Post subject: فرق procedure و function جلسه هشت . 16 آذر Reply with quote

برای اینکه تشخیص دهیم که یک تکه برنامه procedure است یا function کافیست به تعریف تابع نگاه کنیم . اکر تعریف تابع به صورت (y=f(x بود یعنی به شکل زیر :
Quote:
; ( آرگومانها) نام تابع = متغیر

آنگاه گوییم که این نوع تعریف تعریف یک تابع است زیرا یک مقدار را باز می گرداند .
واگر به شکله
Quote:
;( آرگومانها) نام پروسیجر

بود چون هیچ مقداری را باز نمی گرداند در نتیجه این نوع تعریف ، تعریف یک پروسیجر است .

نکته Exclamation :
اگر زیر برنامه ای فقط یک خروجی داشته باشد آنرا به شکل تابع می نویسیم اگر بیش از یک خروجی داشته باشد آنرا به شکل پروسیجری که خروجی هایش را پرامترهای call by reference تشکیل می دهند می نویسیم .

مثال : خروجی برنامه زیر چیست ؟

#include<stdio.h>
#include<conio.h>
void p1(int *,int);
int f1(int,int *);
main(){
int m=5,n,k=3;
p1(&m,n);
n=f1(m,&k);
printf(" m = %d , n = %d , k = %d ",m,n,k);
return 0;
}
void p1(int *a,int *b)
{
b+=5;
(*a)-=b;
b++;
return;
}
int f1(int a, int *b)
{
a++;
(*b)--;
return(*b)+a;
}

برای تحلیل مثله بالا کافیست همه پارامترها و آرگمنهای هر کدام از توابع تک تک مورد برسی قرار دهید .
جواب مثال بالا به صورت:: m = 0 , n = 3 , k=2 :: می باشد .

تمرین 1 :
برنامه ای بنویسید که یک عدد صحیح را از ورودی دریافت و فاکتریل آنرا در خروجی بنویسید ؟ (برنامه به صورت ماژولار بنویسید )

#include<stdio.h>
#include<conio.h>
int fact(int);
main(){
int x=1,y=1;
do{
clrscr();
printf("\n Enter a number : ");
scanf("%d",&x);
}while(x>=8);
y=fact(x);
printf("\n \n\n \t %d!  =  %d \n",x,y);
getch();
return 0;
}
int fact(int x)
{ int y=1;
for(;x>0;y*=x,x--);
return y;
}

در تمرین فوق برای اینکه کاربر اعداد بیش از 7 استفاده نکند از حلقه do...while استفاده شده است . و البته دستور ;()clrscr نیز برای پاک کردن صفحه از اطلاعات قبلی بکار می رود .

تمرین 2:
برنامه ای بنویسید که دو عدد صحیح m و n را از ورودی دریافت و مقادیر (comb(n,m و (perm(n,m را در خروجی چاپ کند ؟ (در این مثال!(perm(n,m)=n!/m!(n-m و !( comb(n,m)=n!/m!(n-m می باشد )

#include<stdio.h>
#include<conio.h>
int fact(int);
float comb(int,int);
float perm(int,int);
main(){
int x=1,y=1,x1;
float c=1,p=1;
do{
clrscr();
printf("\n Enter a number(x) : ");
scanf("%d",&x);
}while(x>=8);
do{
printf("\n Enter a number(y) : ");
scanf("%d",&y);
}while(y>=8);
if(x<y)
{
x1=x;
x=y;
y=x1;
}
c=comb(x,y);
p=perm(x,y);
printf("\n\n\n Comb(%d,%d)=%0.0f",x,y,c);
printf("\tPerm(%d,%d)=%0.0f \n",x,y,p);
getch();
return 0;
}
int fact(int x)
{ int y=1;
for(;x>0;y*=x,x--);
return y;
}
float comb(int x,int y)
{
return(fact(x)/(fact(y)*fact(x-y)));
}
float perm(int x,int y)
{
return(fact(x)/fact(y));
}


مثال : پروسیجر Inc و Dec را در زبان C پیاده سازی کنید ؟

#include<stdio.h>
#include<conio.h>
void inc(int*);
void dec(int*);
main(){
int x=1,y=1;
do{
clrscr();
printf("\n Enter x : ");
scanf("%d",&x);
}while(x>=108);
do{
printf("\n Enter y : ");
scanf("%d",&y);
}while(x>=108);
inc(&x);
dec(&y);
printf("\n \n\n \t inc(x)=%d , dec(y)=%d \n",x,y);
getch();
return 0;
}
void inc(int *x)
{(*x)++;
 return;
}
void dec(int *y)
{(*y)--;
return;
}

مثال : توابع Inc و Dec را به شکل توابعی به نامهای finc و fdec بنویسید ؟

#include<stdio.h>
#include<conio.h>
int inc(int);
int dec(int);
main(){
int x,y;
do{
clrscr();
printf("\n Enter x : ");
scanf("%d",&x);
}while(x>=108);
do{
printf("\n Enter y : ");
scanf("%d",&y);
}while(x>=108);
x=inc(x);
y=dec(y);
printf("\n \n\n \t inc(x)=%d \t,\t dec(y)=%d \n",x,y);
getch();
return 0;
}
void inc(int x)
{
 return ++x;
}
void dec(int *y)
{
return --y;
}


مثال : برنامه ای بنویسید که یک عدد صحیح از ورودی گرفته و مجموع اعداد زوج بین 0 تا آن عدد را محاسبه و در خروجی چاپ کند ؟

#include<stdio.h>
#include<conio.h>
int sum(int);
main(){
int x,y;
do{
clrscr();
printf("\n Enter x : ");
scanf("%d",&x);
}while(x>=108);
y=sum(x);
printf("\n \n\n \t sum(x)=%d \n",y);
getch();
return 0;
}
int sum(int x)
{int y;
 if(!(x%2))x--;
 for(;x>0;y+=x,x-=2);
 return y;
}


Last edited by arash on Tue Dec 07, 2004 9:08 pm; edited 1 time in total
Back to top
vahid
بي تو هرگز


Joined: 26 Nov 2004
Posts: 3067
Location: Tehran

PostPosted: Tue Dec 07, 2004 12:00 pm    Post subject: Reply with quote

آرگومان يك تابع ميتواند عبارتي محاسباتي باشد مانند :
sqrt(a+b)

تابع sqrt فوق ريشه دوم پارامتر خود را در خروجي ميدهد . اين تابع از توابع كتابخانه اي زبان C است بنابراين بايد قبل از ان در سرنام فايل يا همان header برنامه خط زير را اعلام كنيم :
#include <math.h>

در زبان c تابعي براي توان تعريف شده است :
pow(a,b)
كه به ترتيب a خود عدد يا پايه و b توان است .
در توابعي چون
cos()
بايد ورودي بر حسب راديان باشد بنابراين براي تبديل از درجه به راديان بايد عدد را در PI/180 ضرب كنيم كه مقدار 3.14 همان عدد PI ميباشد .
تابع بدون آرگومان در prototype يا همان پيش نمونه كه گاها declaration نيز ناميده ميشود به صورت
void function(void)
است . اما براي استفاده اين تابع در بدنه برنامه به صورت
function()
استفاده ميشود .
مثال زير را نگاه كنيد
#include ...
.
.
.
void circle(void);
.
.
.
main() {
   .
   .
   .
   circle();
   .
   .   
   }
void circle(void) {
printf("*\n");
printf("* *\n");
printf("*");
}

با نگاهي به برنامه فوق ميتوانيد به اين نتيجه برسيد كه قسمت prototype تابع با قسمت اصلي تعريف خود تابع هيچ تفاوتي ندارد منتهي در بخش prototype در انتهاي تعريف تابع يك سمي كالن نيز داريم ...
آرگومان واقعي : عبارتي است كه در داخل پرانتز هاي يك تابع قرار ميگيرند .
پارامتر ظاهري :شناسه اي است كه در تعريف يك تابع متناظر با آرگومان واقعي است .
در توابع يك خروجي ميتوان پرانتز را جلوي return قرار نداد . و مقدار return ميتواند به صورت محاسباتي بازگشت داشته باشد : return 2*I+c
در توابع با پارامتر هاي call by reference كه به صورت مثلا char *var تعريف ميشوند . به كامپايلر C ميگويد متغير var شامل آدرس متغير نوع char است . يا بهتر است بگوييم
متغير var اشاره گر به متغيري از نوع char است .
Back to top
vahid
بي تو هرگز


Joined: 26 Nov 2004
Posts: 3067
Location: Tehran

PostPosted: Tue Dec 07, 2004 12:01 pm    Post subject: نكات مرتبط ... Reply with quote

1. هنگام تعريف تابع به متغيرهايي كه داخل پرانتزنوشته ميشوند پارامترهاي تابع و هنگام فراخواني تابع به متغيرهايي كه داخل پرانتز نوشته ميشوند آرگومانهاي تابع ميگويند .
2. نام پارامترها كاملا اختياري است و ميتواند همنام آرگومانها باشد يا نباشد .
3. هنگام معرفي الگوي تابع نوشتن نام متغيرها كاملا اختياري است و ميتوان نام انها را ننوشت اما نوشتن نوع انها كاملا ضروري است .
4. هرگاه الگوي تابعي را ننويسيم يا انكه در هنگام تعريف الگو پشت ان نوع خروجي انرا مشخص نكنيم به صورت پيشفرض int فرض ميشود .
5. در صورت نوشتن void پشت نام تابع ديگر نيازي به نوشتن return براي تابع بدون خروجي ( يعني پراسيجر ) نداريم .
6. دستور return var1,var2 مقدار var2 را بر ميگرداند و عملگر كاما طبق معمول وظيفه خود را اجرا ميكند و سمت راستترين مقدار جايگزين ميشود .
7. معرفي الگوي تابع prototype يا declaration ميتواند بالاي تابع main باشد يا در تابع main باشد . اما در صورتي كه در تابع main بود حتما بايد قبل از اولين دستور اجرايي اعلان شود در غير اينصورت خطاي كامپايلري رخ خواهد داد . ميتوان اين اعلان را لابلاي تعريف متغيرها در ابتدا تابع main نيز داشت . كه به هر حال فراموش نشود كه بايد قبل از اولين دستور اجرايي اعلان الگوي تابع صورت بگيرد .
8. توابع در زبان C نميتوانند تو در تو تعريف شوند ( در پاسكال ميتوان ) اما ميتوانيد انها را تو درتو صدا كنيد . در ضمن صدا زدن توابع نيز مانند متغيرها ميباشد يعني تابعي كه مثلا تابع اول است نميتواند تابع دوم كه در زير خودش تعريف شده است را صدا بزند براي توضيحات بيشتر به درس توابع بازگرديد . اما اگر معرفي الگوي توابع به صورت global باشد ميتوان چنين كاري را انجام داد .
9. ميتوان در زبان C بخش معرفي الگوي تابع را حذف كرد . به شرطي كه تعريف خود توابع جاي انها را بگيرند ( دقيقا مانند پاسكال ).
Back to top
Display posts from previous:   
Post new topic   Reply to topic    ParsX.com Forum Index -> C/C++ Programming All times are GMT + 3.5 Hours
Page 1 of 1

 
Jump to:  
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