تمریناتی  درمورد روال procedureو تابعfunction

تمریناتی  درمورد روال procedureو تابعfunction

1.     سه عدد را خوانده و ماکزیمم آنها را باfunction بنویسید.

2.     سه عدد را خوانده و ماکزیمم آنها را باprocedureبنویسید.

3.  فرض کنید در یک فروشگاه یک4 نوع جنس با عناوینa,b,c,d, باقیت به ترتیب 25و20و12و5ریال موجود می باشد بر نامه ای بنویسید هر جنس با تعداد آن را در یافت قیمت نهایی را اعلام نماید شرط اتمام بر نامه وارد کردن حرفe باشد.

4.     به طور کلی تفاوت روال و تابع  در چیست؟

5.     خروجی تابع زیر اگر n=40باشد چه مقداری است؟

6.      

Function  ad (n: byte):word;

Begin

If n=1 then

Ad: =1

Else

Ad: =ad (n-1) +n;

End;

پاسخ سوالات تشریحی

1)                   

Program t1;

Var

a,b,c :integer;

Function max (a,b,c: integer): integer;

Var

m: integer;

Begin

m:=a;

if b>m then  m:=b;

if c>m  then  m:=c;

max:=m ;

End;

Begin

Write ('please enter a, b, c :');

Readln (a ,b ,c);

 Write (max(a ,b ,c));

Readln;

End.

2)                  

Program t1;

Var

a, b, c, m :integer;

Procedure    Max (a, b, c: integer; Var m: integer);

Begin

m: =a;

If b>m then m: =b;

If c>m then m: =c;

End;

Write ('please enter a, b, c :');

Readln (a, b, c);

Max (a, b ,c ,m);

Write (m);

Readln;

End.

3)                  

Program t3;

Label 10;

Var

Ch: char;

n, sum :integer;

Function    call (ch: char; n: integer): integer;

Begin

Case ch of

'a', 'A': call:=n*5;

'b', 'B' : call:=n*12;

'c', 'C' : call:= n*20;

'd', 'D' : call:=n*25;

End;

End;

Begin

Writeln;

Writeln ('**** enter "E" to exit ****');

Sum: =0;

While true do

Begin

Write ('enter kind of (a, b, c, d) :');

Readln ( ch );

If (ch='e') or (ch='E') then goto 10;

Write ('enter numbers :');

Readln (n);

Sum:=sum+ call( ch , n);

End;

10:write('pay =' , sum);

Readln;

End.

4)                 

به طور کلی تفاوت روال و تابع  در نحوه فراخوانی آنهااست.

5)       این برنامه مقدارزيگما i ازi=1تا n=40 را محاسبه می کند می دانیم این مجموع برابر است با

n(n+1)/2

بنابراین داریم :

n=40        ,      40(40+1)/2=820 

خروجی 820است .

 

کلیات درمورد روال و تابع

زیر بر نامه ها به صورت روال و توابع بیان می شوند در بر نامه نویسی ساخت یافته ،واحدی منطبق بر این است که اگر بر نامه بزرگتر را به قسمت های کوچکتر تقسیم کنیم نوشتن بر نامه آسانتر و بهتر خواهد بود که در زبان پاسکال به این قسمت های کوچک  روال یا تابع می گویند در زیر روال ها می توان هر زیر روال را به طور جداگانه نوشته و اجرا کرده ودر صورت صحت آن را می توان به بر نامه اصلی اضافه کرد همچنین می توان در پاسکال متغیر ها را به روال و توابع انتقال داد .

تعریف روال در پاسکال

برا ی تعریف روال حداقل دو چیز نیاز داریم:

1.     نام روال

2.     یک بلاک کد

تفاوت بین روال و تابع عبارتند از:

1.  فراخوانی یک روال به صورت دستوالعمل مستقل می باشد ولی فراخوانی یک تابع بایستی قسمتی از یک عبارت باشند به عبارت دیگر توابع مشابه متغیر ها می باشندکه مقدارآنها بستگی به پارامتر های انتقال داده شده به آنها دارد.

2.     ازروال نمیتوان دردستورهای جایگزینی ومقایسه ای وعبارتهای حسابی استفاده کرد.

3.  یک روال می تواندیک متغیری رابرگشت داده وسپس می توان ازآن درمتغیربه صورت عبارت های حسابی استفاده کرد.زمانی که نیازبه یک نتیجه مشخص معینی داشته باشیم  معمولا از توابع استفاده می کنیم .یک پروسیجر به جای بر گشت دادن یک نتیجه مشخص و معین عملیاتی را انجام می دهد که ممکن است چند نتیجه را برگشت دهد یا هیچ نتیجه ای را بر گشت ندهد.

 

مقادیر ومتغیر ها در لیست پارامتر ها

مقادیر ومتغیر ها در لیست پارامتر ها

  

وقتی در جلوی پارامتر ها Var   قرار می دهیم با مراجعه به نام این پارامتر ها می توان آنرا به سابروتین وارد کرد و یا نتیجه گرفت . ولی در صورتیکه جلوی پارامتری Var قرار ندهیم ،مقدار آن پارامتر مورد نظر خواهدبود در حالت اول کامپیوتر محلی برای متغیر در نظر می گیریدو هر بار به آن محل مراجع می کند و محتوای آنرا انتقال می دهد . و این محتوا داخل و خارج برنامه قابل استفاده است .در حالت دوم کامپیووتر یک کپی از مقدار متغیر را به سابروتین می برد ومحلی را برای آن در نظر نمی گیردکه به تواند حاصل تغییر به بر نامه اصلی باز گردئد .تغییرات داخل سابروتین نیز روی کپی متغیر انجام می شود.بنابر این هر گاه تغییرات متغییری در داخل سابروتین مورد نظر مانیست آنرا بدون Var  قرار می دهیم.

معرفی قبلی سابروتین ها

 

گاه اتفاق می افتد که یک سابروتین در بر نامه سابروتین دیگری را فرا مکی خواند. از آنجا که قبل از تعریف هیچ عاملی نمی توان از آن استفاده کرد سابروتین فرا خوانده شده باید قبلا معرفی شده باشد حال اگر قرار باشد گاه سابروتین 2 را فرا خواند و گاه سابروتین 1 را ،در اینجا اشکالی بوجود می آید . به شکل زیر توجه نمائید.

 

 

Procedure   test1 (some: integer);

Begin

If     some<10 then      test2 ('y');

{………..etc.}

Procedure   test2 (another parameter: char);

Begin

test1 (15);

{………..etc.}

End;

این اشکال به این صورت رفع می شود که از کلمه forward استفاده کرده سابروتین دوم را قبلا معرفی می کنیم گر چه سابروتین دومی به تفضیل شرح داده شده ولی معرفی آن قبا از سابروتین  1 مشکل را رفع می کند به بر نامه زیر توجه کنید :

Program test;

Var

A, b, c, x, y, z: integer;

Procedure   proc (Var   a, b: integer; c: integer);

Forward;

Procedure   proc2;

BEGIN

Clrscr ;

Readln(x);

Proc(x, y, z);

Writeln(x: 10, Y: 10);

End;

Procedure proc2 (Var A, B: Integer; c: Integer);

Begin

Writeln (A: 10);

B: =A*A*A;

C: =100;

END;

{*******************************}

Begin

Proc1;

End.

مثال

1.برنامه فاکتوریل را با procedure بنویسید.

Program t1;

Var

N: Integer;

M: Longint;

Procedure     fact (n :integer ; Var f: Longint);

Var

I: byte;

Begin

F: =1;

For   I: =1 to n do

     F: =F*I;

End;

Begin

Write ("please enter n:");

Readln (n);

Fact (n, m);

Write (m);

Readln;

End.

2. برنامه فاکتوریل را با Function بنویسید.

 

Program t2;

Var

N: Integer;

K: real;

Function   fact (n: integer) Longint;

Var

I: byte;

f: Longint

Begin

F: =1;

For   I: =1 to n do

     F: =F*I;

Fact: =F;

End;

Begin

Write ("please enter n:");

Readln (n);

Write (Fact (n));

Readln;

End.

توابع و پردازه هاPROCEDURES  &  FUNCTIONS  

توابع و پردازه هاPROCEDURES  &  FUNCTIONS 

 

پردازه و تابع دو نوع متفاوت از بر نامه های فرعی(زیر بر نامه ها) می باشند . تفاوت تابع با سابروتین آن است که یک مقدار را به بر نامه باز می گرداند , در حالی که پردازه چند مقدار را می تواند منتقل سازد . هر دو نوع می توانند شامل  انواع ثابت و متغیر داده ها , پردازه ها و توابع باشند . اینها ایه بر نامه ریزی ساختاری هستند .

از محاسن وجود این دو نوع بر نامه فرعی موارد زیر را می توان بر شمرد .

1.     را ه پی گیری اشکالات ودنبال کردن مسیراجرای دستورالعملهاراکوتاه می سازد .

2.     تست بر نامه جزء جزء انجام می شود . هر بخش را جداگانه می توان برسی نمود .

3.     در ک مسئله و اعمال تغیرات روی آن بسیار ساده تر می شود.

4.  بساری از دستورات پاسکال که دستور العمل نامیده ایم در اصل پر دازه ها و تابع هایی هستند که بافر اخوانی آنها عمل را انجام می دهند. از آن جمله  پر دازه WRITELNکه متغیر های خودرابه دستورالعملهای خروجی و یابه فایل های موردنظرمی فرستد.همچنین تابعsucc( ) که عدد 6 را پس از انجام عملیات داخلی به خودگرفته وبه برنامه بازمی گرداند.

دامنه انتقال متغییر ها در رابطه باپردازه و تابع

دو نوع متغیر در رابطه باپردازه ها وتوابع وجود دارد :

1.     داده های فراگیر یا global

2.     داده های محلی local

داده های محلی LOCAL

داده های فراگیر که در بالا ترین سطح بر نامه معرفی می شود در همه بر نامه های فرعی نیز دیده می شود.متغیر هایی که در داخل سابروتین ها تعریف می شوند محلی هستند و تغییرات آنها به خارج از سابروتین نفوذ نمی کند .

معرفی متغیر ها در پردازه و تابع

متغیر ها در قبل از اینکه بتوانند به کار روند باید معرفی کرد .به همین دلیل داده های فراگیر راباید قبل از همه در خط های اولیه معرفی کرد .همچنان ,سابروتین ها در قبل از اینکه فراخوانده شوند باید معرفی کرد.

چگونگی تعریف پر دازه ها و توابع

 

پردازه و توابع را باید پس از Varوقبل از بر نامه اصلی معرفی کرد معرفی هر پردازه یا تابع , اطلاعات زیر را شامل می باشد:

1.     نام پر دازه که تابع ضوابط نام گذاری در تربو اسکال است.

2.  نام پارامتر ها ونوع آنها هرقلم از اطلاعات که باید به بر نامه ها وارد شود, وهر اطلاعاتی که پس از پردازش از بر نامه صادر شود , باید در داخل پرانتز جلوی نام سابروتین آورده می شود.

3.  در داخل پرانتز پارامترها می تواننند مقادیر باشندیا پارامتر های متغیری باشندکه قبل از آنها Var می آید . چنین پامتر هایی در داخل سابروتین تغییر کرده وتغییرات آن به خارج نفوذ می نماید.

4.  در مورد تابع پس از پرانتز نوع اطلاعات باز گشتی به بر نامه اصلی که تحت نام خود تابع می باتشد , معرفی می گردد.نوع تابع لزوما" نباید با نوع رانتز آن یک باشدگرچه مثلا"  تابع  succ( )  همان نوعی از اطلاعات را برگشت می دهد که بکار می برد.

عبور وانتقال اطلاعات از پردازه هاوتوابع

 

وقتی یک سابروتین رابه کارمی بریم ،معمولا می خواهیم مقداری را به آن وارد و اطلاعاتی را از آن خارج سازیم. اطاعات وارده ،گاه ثابت هایی هستند که دذر طول سابروتین تغیر نمی کنند بطوریکه قبلا نیز اشاره شد متغیر های وارد صادره از سابروتین ها می توانند محلی یا فراگیر باشند

برای انتقال اطلاعات به سابروتین و بر عکس لیست پارامتر ها را جلوی نام سابروتین داخل پرانتز قرار می دهم. لیست پارامتر ها شامل نام متغیر ها ونوع آنها می باشد . در زمان فراخوانی سابروتین هانیز در بر نامه اقلامی از دادهخ ها را که می خواهیم،داخل پرانتز قرار می دهیم.

نکاتی که باید در تهیه لیست پارامتر ها در نظر گرفت:

1.     باید دید چه پارامتر هایی مورد نیاز است .

2.  در نظر گرفت کدام مقادیر باید به سابروتین داده شود . در جلوی این پارامتر ها باید کلمه Var  ر ا قرار داد.

3.     پارامتر هارا بایدنظم داد به تر تیبی که موقع فراخوانی نیز همان نظم را داشته باشد .

4.     ترتیب و نوع پارامتر ها با اقلامی که موقع فراخوانی بکار می رود باید یکسان باشد.