تهیه و تنظیم: فاطمه قاسمی دانشگاه صنعتی شریف – پاییز 86 تابع و رویه 2 تهیه و تنظیم: فاطمه قاسمی دانشگاه صنعتی شریف – پاییز 86
مروری بر مطالب با نوشتن تابع و رویه آشنا شدیم. اگر بخواهیم چندین مقدار را به خروجی بفرستیم؟ انواع پارامتر (آرگمان) رویه
پارامترهای رویه (یا تابع) پارامترهای صوری (Formal) : به پارامترها در تعریف تابع می گویند. پارامترهای اصلی (Actual): به پارامترها در فراخوانی تابع گفته می شود. لازم است میان پارامترهای صوری و اصلی تناظر یک به یک وجود داشته باشد. تعداد ، ترتیب و (در موقعیت یکسان در لیست) نوع سازگار داشته باشند.
پارامترهای رویه (ادامه) Var x, y: real; Procedure ReportSumAve (num1, num2: real); Var sum, average: real; Begin sum:=num1+num2; average := sum /2; writeln(‘the sum is ’, sum); writeln(‘the average is ‘,average); End; x : = 0.6; y:= 3.5; ReportSumAve(x,y); End.
پارامترهای رویه (ادامه) یک جریان داده از پارامترها در برنامه اصلی به پارامترهای صوری وجود دارد. ناحیه داده های برنامه اصلی ناحیه داده های روال ها num1=0.6 x=0.6 num2=3.5 y=3.5 average=? sum=?
پارامترهای صوری پارامترهای ارزشی : پارامترهایی که فقط مقدارشان را از پارامترهای اصلی می گیرند و رویه نمی تواند مقدار پارامتر اصلی را تغییر دهند. (تا کنون فقط این نوع پارامتر را دیدیم). پارامترهای متغیرها :پارامترهایی که در واقع آدرسشان، آدرس پارامترهای اصلی است. پس می تواند مقدار پارامتر اصلی را تغییر دهد.
پارامترهای صوری (ادامه) Var x, y,z,w: real; Procedure ReportSumAve (num1, num2: real; var sum, average: real); Begin sum:=num1+num2; average := sum /2; End; x : = 0.6; y:= 3.5; ReportSumAve(x,y,z,w); writeln(‘the sum is ’, z); writeln(‘the average is ‘,w); End.
پارامترهای صوری (ادامه) یک جریان داده از پارامترها در برنامه اصلی به پارامترهای صوری اصلی وجود دارد و یک جریان داده دو طرفه بین پارامترهای اصلی و پارامترهای صوری متغیری وجود دارد. ناحیه داده های برنامه اصلی ناحیه داده های روال ها x=0.6 num1=0.6 y=3.5 num2=3.5 Z=? average w=? Sum
پارامترهای صوری (ادامه) پارامتر متغیرها هم به عنوان ورودی استفاده می شود و هم می تواند تغییر کند و خروجی رویه باشد. پارامترهای ارزشی، پارامترهای اصلی را در مقابل تغییر محافظت می کند.
پارامترهای صوری (ادامه) مثال Var s,n : Integer; Procedure sum(n:integer; var s:integer); Begin S:=0; while n>0 do begin s:=S+n; n:= n-1; end; End; readln(n); sum(n,s); writeln (n*sqrt(s));
پارامترهای صوری (ادامه) چه وقت از پارامتر متغیر و چه وقت باید از پارامتر ارزشی استفاده کرد؟ اگر اطلاعات فقط به رویه ارسال می شود اما از رویه ارجاع نمی شود، در اینصورت از پارامتر ارزشی استفاده می کنیم. (پارامتر ورودی) اگر اطلاعات از رویه به برنامه فراخوان ارجاع شوند ، در اینصورت از پارامتر متغیرها استفاده می کنیم.(پارامتر خروجی) اگر اطلاعاتی که به رویه ارسال می شوند، احتمالا اصلاح شده و سپس به صورت داده جدیدی ارجاع داده می شود. در اینصورت از پارامتر متغیرها استفاده می کنیم. (پارامتر ورودی/خروجی).
پارامترهای صوری (ادامه) لازم است پارامترهای اصلی و صوری با یکدیگر تناظر داشته باشند: تناظر از روی موقعیت آن ها در لیست پارامترها تعیین می شود. لیست ها باید هم اندازه باشند. در مورد پارامترهای متغیری، نوع پارامتر اصلی و صوری باید یکسان باشند. در مورد پارامترهای ارزشی، نوع پارامتر اصلی و صوری باید سازگار باشند. برای پارامترهای متغیر، پارامتر اصلی باید یک متغیر باشد اما بجای پارامتر اصلی می توان از یک متغیر، ثابت یا عبارت استفاده کرد.
مثال : خروجی برنامه را بدست آورید Var w,x,y,z : integer; Procedure SumDiff(n1,n2: integer, var n3,n4:integer); Begin n3 := n1+n2 ; n4 := n1- n2; End; x:= 5; y:=3; z:=7; w:=9; SumDiff(x,y,z,w); SumDiff(x,z,w,y); SumDiff(x,w,z,y);
مثال: بررسی قواعد نحوی Var x,y,z : real; m, n : integer; Procedure Message(var A,B:real; x: integer); … Message(x,y,z); NO Message(m,y,n);NO Message(25.0, 15,x); NO Message(y+z,y-z,m);NO Message(x,y,m+n);Yes Message(z,y, maxInt);Yes
حوزه عمل شناسه ها هر شناسه دامنه ای دارد که حوزه عمل آن شناسه نامیده می شود. دامنه شناسه بخشی از برنامه است که شناسه در آن تعریف شده است. هر شناسه تنها توسط دستوری که در حوزة عملش قرار دارد می تواند بازیابی شود.
حوزه عمل شناسه ها (ادامه) حوزه عمل قانون شماره 1: حوزه سراسری (جهانی) و محلی شناسه ای که در برنامه اصلی تعیین شده است دارای حوزه عمل سراسری بوده و می تواند در هر جای برنامه بازیابی شود. شناسه ای که در درون یک رویه و یا تابع تعیین شود دارای حوزه عمل محلی بوده است و فقط توسط آنچه تعیین شده است قابل بازیابی است. قواعد حوزه عمل در مورد تمام شناسه ها اعم از اسامی ثابت ها، متغیرها ، روال ها و پارامتر های صوری صادق است. حوزه عمل قانون شماره 2: تعیین نوع های چندگانه برای یک شناسه هر گاه شناسه ای بازیابی می شود، در واقع محلی ترین تعریف (نزدیکترین تعریف) در نظر گرفته می شود.
حوزه عمل شناسه ها (ادامه) Var x,y,z : real; Procedure pro1 (m,n,me:real); Var x, you : real; Begin … End; Procedure pro2 (var s,p,x: real); const blank = ‘ ‘; var hi,bye : string; begin …. ….. حوزه عمل x,y,z,pro1 , pro2 حوزه عمل n,m,me,x,you حوزه عمل x,p,s,blank,hi,bye
حوزه عمل شناسه ها (ادامه) حوزه عمل برای رویه های تو در تو Var m, n:real; Procedure outer (var x,y:real); Var p,q:real; procedure inner; var p,t :real; begin {inner} …. end;{inner} begin{outer} ……. end{outer}; Begin … End. حوزه عمل m,n,outer شناسه قابل دسترسی بدنه روال M,n,outer M,n,x,y,p,q,outer,inner M,n,x,y,p,q,t, Inner,outer بدنه اصلی Outer Inner حوزه عمل inner,q,p,y,x حوزه عمل p,t
مثال: با توجه به قواعد حوزه عمل و نوع پارامترها خروجی برنامه را بدست آورید! = writeln(x,y,z,m); Var x,y,z,m :real; Procedure t2(m:real; var z:real); Begin z:=m+10; end; Procedure t1(var x:real; y: real); Var m: real; Begin ; m:=1; t2(z,m); x := y+m*z; ; end; Begin x:= 10; y:= 11; m:=101; z := -1; ; t1(y,x); End. x, y, z, m 10 ,11, -1, 101 11, 10, -1, N 1 , 10, -1, 9 10 ,1 , -1, 101
پارامترهای تابع مطالب گفته شده در مورد تابع صادق است؛ تابع خروجی دارد و می تواند به کمک پارامترهایش خروجی های دیگر داشته باشد.