Lecture 12.pdf

‫ﻣﺪرس ‪ :‬ﻧﻮري‬
‫آذر ‪88‬‬
‫زﻳﺮﺑﺮﻧﺎﻣﻪ‬
‫‪) Procedure y‬زﻳﺮﺑﺮﻧﺎﻣﻪ(‪:‬‬
‫‪ y‬ﻣﺎﻧﻨﺪ ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﻛﻮﭼﻚ اﺳﺖ ﺑﺎ ﻫﻤﺎن ﺳﺎﺧﺘﺎر‪.‬‬
‫‪ y‬ﺑﻠﻮك ﺳﺎﺧﺘﻤﺎﻧﻲ ﻳﻚ ﺑﺮﻧﺎﻣﻪ اﺳﺖ‪.‬‬
‫‪ y‬از ﻫﺮ ﺟﺎﻳﻲ ﻗﺎﺑﻞ ﻓﺮاﺧﻮاﻧﻲ اﺳﺖ )از ﺟﻤﻠﻪ زﻳﺮﺑﺮﻧﺎﻣﻪﻫﺎي دﻳﮕﺮ(‬
‫‪2‬‬
‫ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ ﭘﺎﺳﻜﺎل – داﻧﺸﮕﺎه ﺻﻨﻌﺘﻲ ﺷﺮﻳﻒ‬
‫ﻣﺪرس‪: ‬ﻧﻮري‬
‫ ﺗﻌﺮﻳﻒ و ﻓﺮاﺧﻮاﻧﻲ زﻳﺮﺑﺮﻧﺎﻣﻪ‬Syntax
procedure pname (formal parameters);
declaration section
begin
‫ﺗﻌﺮﻳﻒ زﻳﺮﺑﺮﻧﺎﻣﻪ‬
procedure body
end;
pname(actual parameters);
‫ﻧﻮري‬: ‫ﻣﺪرس‬
‫ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ ﭘﺎﺳﻜﺎل – داﻧﺸﮕﺎه ﺻﻨﻌﺘﻲ ﺷﺮﻳﻒ‬
‫ﻓﺮاﺧﻮاﻧﻲ زﻳﺮﺑﺮﻧﺎﻣﻪ‬
3
‫ﻗﻮاﻋﺪ اﺳﺘﻔﺎده از زﻳﺮﺑﺮﻧﺎﻣﻪ‬
‫‪ y‬اﻧﻄﺒﺎق ﭘﺎراﻣﺘﺮﻫﺎي اﺻﻠﻲ و ﻗﺮاردادي از روي ﻣﺤﻞ آﻧﻬﺎ در ﻟﻴﺴﺖ‬
‫ﭘﺎراﻣﺘﺮﻫﺎ ﻣﺸﺨﺺ ﻣﻲﺷﻮد‪.‬‬
‫‪ y‬ﻧﻮع ﭘﺎراﻣﺘﺮ اﺻﻠﻲ در ﻣﻮرد ﭘﺎراﻣﺘﺮﻫﺎي ﻣﺘﻐﻴﺮي )‪:(variable‬‬
‫‪ y‬ﺑﺎ ﻧﻮع ﭘﺎراﻣﺘﺮ ﻗﺮاردادي ﺑﺎﻳﺪ ﻋﻴﻨﺎً ﻳﻜﻲ ﺑﺎﺷﺪ‪.‬‬
‫‪ y‬ﻧﻮع ﭘﺎراﻣﺘﺮ اﺻﻠﻲ در ﻣﻮرد ﭘﺎراﻣﺘﺮﻫﺎي ﻣﻘﺪاري )‪:(value‬‬
‫‪ y‬ﻛﺎﻓﻲ اﺳﺖ ﻗﺎﺑﻞ اﻧﺘﺴﺎب ﺑﻪ ﻧﻮع ﭘﺎراﻣﺘﺮ ﻗﺮاردادي ﺑﺎﺷﺪ‪.‬‬
‫‪ y‬ﭘﺎراﻣﺘﺮ اﺻﻠﻲ در ﻣﻮرد ﭘﺎراﻣﺘﺮﻫﺎي ﻣﺘﻐﻴﺮي‪:‬‬
‫‪ y‬ﺣﺘﻤﺎً ﺑﺎﻳﺪ ﻣﺘﻐﻴﺮ ﺑﺎﺷﺪ‪.‬‬
‫‪ y‬ﭘﺎراﻣﺘﺮ اﺻﻠﻲ در ﻣﻮرد ﭘﺎراﻣﺘﺮﻫﺎي ﻣﻘﺪاري‪:‬‬
‫‪ y‬ﻣﻲﺗﻮاﻧﺪ ﻣﺘﻐﻴﺮ‪ ،‬ﻣﻘﺪار ﺛﺎﺑﺖ ﻳﺎ ﻳﻚ ﻋﺒﺎرت ﺑﺎﺷﺪ‪.‬‬
‫‪4‬‬
‫ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ ﭘﺎﺳﻜﺎل – داﻧﺸﮕﺎه ﺻﻨﻌﺘﻲ ﺷﺮﻳﻒ‬
‫ﻣﺪرس‪: ‬ﻧﻮري‬
var
x,y,z : real;
m, n : integer;
‫ﻣﺜﺎل‬
procedure Message(var A,B:real; x: real); …
Message(x,y,z);
Message(m,y,n);
Message(25.0, 15,x);
Message(y+z,y-z,m);
Message(x,y,m+n);
Message(z,y, MaxInt);
‫ﻧﻮري‬: ‫ﻣﺪرس‬
‫ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ ﭘﺎﺳﻜﺎل – داﻧﺸﮕﺎه ﺻﻨﻌﺘﻲ ﺷﺮﻳﻒ‬
5
‫ﻗﻮاﻋﺪ اﺳﺘﻔﺎده از زﻳﺮﺑﺮﻧﺎﻣﻪ‬
‫‪ y‬ﺑﻬﺘﺮ اﺳﺖ از ﻣﺘﻐﻴﺮﻫﺎي ﻫﻢ ﻧﺎم ﻛﻪ ﻳﻜﻲ ﺳﺮاﺳﺮي و دﻳﮕﺮي ﻣﺤﻠﻲ اﺳﺖ‬
‫اﺳﺘﻔﺎده ﻧﺸﻮد )ﺑﺮاي ﺟﻠﻮﮔﻴﺮي از اﺷﺘﺒﺎه ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ(‬
‫‪ y‬ﻫﻨﮕﺎم اﺳﺘﻔﺎده از ﻣﺘﻐﻴﺮ ﺑﻪ ﺣﻮزه دﺳﺘﺮﺳﻲ آن ﺗﻮﺟﻪ ﻛﻨﻴﺪ‪.‬‬
‫‪ y‬ﻣﺘﻐﻴﺮﻫﺎي ﺳﺮاﺳﺮي در ﻛﻞ ﺑﺮﻧﺎﻣﻪ ﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ ﻫﺴﺘﻨﺪ‬
‫‪ y‬ﻣﺘﻐﻴﺮﻫﺎي ﻣﺤﻠﻲ ﻓﻘﻂ در زﻳﺮﺑﺮﻧﺎﻣﻪاي ﻛﻪ در آن ﺗﻌﺮﻳﻒ ﺷﺪهاﻧﺪ‪.‬‬
‫‪ y‬ﺗﻌﺮﻳﻒ ﻫﻤﻪ ﻣﺘﻐﻴﺮﻫﺎي ﻻزم ﺑﻪ ﺻﻮرت ﺳﺮاﺳﺮي ﻣﺸﻜﻼت ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ را‬
‫ﺣﻞ ﻧﻤﻲ ﻛﻨﺪ‪.‬‬
‫‪ y‬در ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺑﺰرگ ﺗﻌﻴﻴﻦ اﻳﻦ ﻛﻪ ﻛﺪام زﻳﺮﺑﺮﻧﺎﻣﻪ ﻣﻘﺪار ﻣﺘﻐﻴﺮ ﺳﺮاﺳﺮي‬
‫را ﺗﻐﻴﻴﺮ ﻣﻲدﻫﺪ دﺷﻮار اﺳﺖ‪.‬‬
‫‪6‬‬
‫ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ ﭘﺎﺳﻜﺎل – داﻧﺸﮕﺎه ﺻﻨﻌﺘﻲ ﺷﺮﻳﻒ‬
‫ﻣﺪرس‪: ‬ﻧﻮري‬
‫ﺧﺮوﺟﻲ اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﭼﻴﺴﺖ؟‬
program MUSIC (output);
const SCALE = 'The note is ';
var JohnnyOneNote : char;
procedure Tune;
const SCALE = 'The note now is ';
var JohnnyOneNote : char;
begin JohnnyOneNote := 'A';
writeln(SCALE, JohnnyOneNote )
end;
The note is D The note now is A The note is D begin JohnnyOneNote := 'D';
writeln(SCALE, JohnnyOneNote );
Tune;
writeln(SCALE, JohnnyOneNote )
end.
‫ﻧﻮري‬: ‫ﻣﺪرس‬
‫ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ ﭘﺎﺳﻜﺎل – داﻧﺸﮕﺎه ﺻﻨﻌﺘﻲ ﺷﺮﻳﻒ‬
7
‫ﻋﻤﻠﻜﺮد اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﭼﻴﺴﺖ؟‬
var w,x,y,z : integer;
procedure SumDiff(n1,n2: integer; var n3,n4:integer);
begin
n3 := n1+n2 ;
n4 := n1- n2;
end;
begin
x:= 5; y:=3; z:=7; w:=9;
SumDiff(x,y,z,w);
SumDiff(x,z,w,y);
SumDiff(x,w,z,y);
SumDiff(x,y,z,w);
end.
‫ﻧﻮري‬: ‫ﻣﺪرس‬
‫ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ ﭘﺎﺳﻜﺎل – داﻧﺸﮕﺎه ﺻﻨﻌﺘﻲ ﺷﺮﻳﻒ‬
8
‫ﻓﺮاﺧﻮاﻧﻲ زﻳﺮﺑﺮﻧﺎﻣﻪ‬
‫‪ y‬ﻋﻼوه ﺑﺮ اﻳﻦ ﻛﻪ زﻳﺮﺑﺮﻧﺎﻣﻪﻫﺎ را ﻣﻲﺗﻮان از ﺑﺮﻧﺎﻣﻪ اﺻﻠﻲ ﻓﺮاﺧﻮاﻧﻲ ﻛﺮد‪ ،‬از‬
‫زﻳﺮﺑﺮﻧﺎﻣﻪﻫﺎي دﻳﮕﺮ ﻧﻴﺰ ﻗﺎﺑﻞ ﻓﺮاﺧﻮاﻧﻲ ﻫﺴﺘﻨﺪ‪.‬‬
‫‪ y‬ﻓﻘﻂ زﻳﺮﺑﺮﻧﺎﻣﻪ ﻓﺮاﺧﻮاﻧﻲ ﺷﺪه ﺑﺎﻳﺪ ﻗﺒﻞ از زﻳﺮﺑﺮﻧﺎﻣﻪ ﻓﺮاﺧﻮاﻧﻨﺪه ﺗﻌﺮﻳﻒ‬
‫ﺷﺪه ﺑﺎﺷﺪ‪.‬‬
‫‪9‬‬
‫ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ ﭘﺎﺳﻜﺎل – داﻧﺸﮕﺎه ﺻﻨﻌﺘﻲ ﺷﺮﻳﻒ‬
‫ﻣﺪرس‪: ‬ﻧﻮري‬
‫ﻓﺮاﺧﻮاﻧﻲ زﻳﺮﺑﺮﻧﺎﻣﻪ‬
procedure B;
begin
WriteLn('B is called');
WriteLn('B is finished');
end;
procedure A;
Begin
WriteLn('A is called');
WriteLn('Calling B');
B;
WriteLn('A is finished');
end;
Begin
WriteLn('Calling A');
A;
WriteLn('Calling B');
B;
end.
‫ﻧﻮري‬: ‫ﻣﺪرس‬
‫ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ ﭘﺎﺳﻜﺎل – داﻧﺸﮕﺎه ﺻﻨﻌﺘﻲ ﺷﺮﻳﻒ‬
10
‫زﻳﺮﺑﺮﻧﺎﻣﻪﻫﺎي ﺗﻮ در ﺗﻮ‬
‫‪y‬‬
‫‪y‬‬
‫‪y‬‬
‫‪y‬‬
‫‪11‬‬
‫ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﮔﻔﺘﻪ ﺷﺪ‪ ،‬زﻳﺮﺑﺮﻧﺎﻣﻪ‪ ،‬ﺧﻮد ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﻛﻮﭼﻚ اﺳﺖ‪.‬‬
‫ﺑﻨﺎﺑﺮاﻳﻦ ﻣﻲﺗﻮاﻧﺪ ﺷﺎﻣﻞ ﻫﻤﻪ ﭼﻴﺰﻫﺎﻳﻲ ﻛﻪ در ﻳﻚ ﺑﺮﻧﺎﻣﻪ وﺟﻮد دارد ﺑﺎﺷﺪ‪،‬‬
‫از ﺟﻤﻠﻪ ﻳﻚ زﻳﺮﺑﺮﻧﺎﻣﻪ دﻳﮕﺮ‪.‬‬
‫ﻣﺘﻐﻴﺮﻫﺎي ﻣﺤﻠﻲ زﻳﺮﺑﺮﻧﺎﻣﻪ ﺑﻴﺮوﻧﻲ‪ ،‬ﻫﻤﺎﻧﻨﺪ ﻣﺘﻐﻴﺮﻫﺎي ﺳﺮاﺳﺮي ﺑﺮاي‬
‫زﻳﺮﺑﺮﻧﺎﻣﻪ داﺧﻠﻲ ﻣﻲﺑﺎﺷﻨﺪ‪.‬‬
‫زﻳﺮﺑﺮﻧﺎﻣﻪ داﺧﻠﻲ‪ ،‬ﻓﻘﻂ از زﻳﺮﺑﺮﻧﺎﻣﻪ ﺑﻴﺮوﻧﻲ ﻗﺎﺑﻞ ﻓﺮاﺧﻮاﻧﻲ اﺳﺖ و از ﺳﺎﻳﺮ‬
‫ﺑﺨﺶﻫﺎ ﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ ﻧﻴﺴﺖ‪.‬‬
‫ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ ﭘﺎﺳﻜﺎل – داﻧﺸﮕﺎه ﺻﻨﻌﺘﻲ ﺷﺮﻳﻒ‬
‫ﻣﺪرس‪: ‬ﻧﻮري‬
‫زﻳﺮﺑﺮﻧﺎﻣﻪ ﺗﻮ در ﺗﻮ‬
procedure A;
var
x, y: integer;
procedure B;
var
y, z: real;
begin
y := 10;
z := 54;
writeln(x + y + z)
end;
begin
x := 6;
y := 4;
writeln(x + y);
B;
writeln(x + y)
end;
begin
A
end.
‫ﻧﻮري‬: ‫ﻣﺪرس‬
‫ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ ﭘﺎﺳﻜﺎل – داﻧﺸﮕﺎه ﺻﻨﻌﺘﻲ ﺷﺮﻳﻒ‬
12
‫زﻳﺮﺑﺮﻧﺎﻣﻪ ﺑﺎزﮔﺸﺘﻲ‬
‫‪ y‬ﻋﻼوه ﺑﺮ اﻳﻦ ﻛﻪ ﻳﻚ زﻳﺮﺑﺮﻧﺎﻣﻪ ﻣﻲﺗﻮاﻧﺪ زﻳﺮﺑﺮﻧﺎﻣﻪﻫﺎي دﻳﮕﺮ را ﻓﺮاﺧﻮاﻧﻲ‬
‫ﻛﻨﺪ‪ ،‬ﻣﻲﺗﻮاﻧﺪ ﺧﻮد را ﻧﻴﺰ ﻓﺮاﺧﻮاﻧﻲ ﻛﻨﺪ‪.‬‬
‫‪ y‬در اﻳﻦ ﺻﻮرت ﻳﻚ زﻳﺮﺑﺮﻧﺎﻣﻪ ﺑﺎزﮔﺸﺘﻲ ﺧﻮاﻫﻴﻢ داﺷﺖ‪.‬‬
‫‪13‬‬
‫ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ ﭘﺎﺳﻜﺎل – داﻧﺸﮕﺎه ﺻﻨﻌﺘﻲ ﺷﺮﻳﻒ‬
‫ﻣﺪرس‪: ‬ﻧﻮري‬
‫ﻣﺜﺎل‬
program RecursiveProcedure;
var
n : Integer;
procedure Print(index: Integer);
begin
WriteLn(index);
if index > 0 then Print(index-1)
end;
begin
Print(10);
Print(4);
n := 7;
Print(n)
end.
‫ﻧﻮري‬: ‫ﻣﺪرس‬
‫ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ ﭘﺎﺳﻜﺎل – داﻧﺸﮕﺎه ﺻﻨﻌﺘﻲ ﺷﺮﻳﻒ‬
14
‫ﻣﺜﺎل‬
program RecursiveProcedure;
var
n : Integer;
procedure Print(index: Integer);
begin
if index > 0 then Print(index-1);
WriteLn(index)
end;
begin
Print(10);
Print(4);
n := 7;
Print(n)
end.
‫ﻧﻮري‬: ‫ﻣﺪرس‬
‫ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ ﭘﺎﺳﻜﺎل – داﻧﺸﮕﺎه ﺻﻨﻌﺘﻲ ﺷﺮﻳﻒ‬
15
‫ﺗﻐﻴﻴﺮ ﭘﺎراﻣﺘﺮ ﻣﻘﺪاري‬
program RecursiveProcedure;
var
n : Integer;
procedure Print(index: Integer);
begin
WriteLn(index);
index := index – 1;
if index > 0 then Print(index)
end;
begin
n := 7;
Print(n);
WriteLn(n)
end.
‫ﻧﻮري‬: ‫ﻣﺪرس‬
‫ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ ﭘﺎﺳﻜﺎل – داﻧﺸﮕﺎه ﺻﻨﻌﺘﻲ ﺷﺮﻳﻒ‬
16
‫ﺗﻐﻴﻴﺮ ﭘﺎراﻣﺘﺮ ﻣﻘﺪاري‬
program RecursiveProcedure;
var
n : Integer;
procedure Print(var index: Integer);
begin
WriteLn(index);
index := index – 1;
if index > 0 then Print(index)
end;
begin
n := 7;
Print(n);
WriteLn(n)
end.
‫ﻧﻮري‬: ‫ﻣﺪرس‬
‫ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ ﭘﺎﺳﻜﺎل – داﻧﺸﮕﺎه ﺻﻨﻌﺘﻲ ﺷﺮﻳﻒ‬
17
‫زﻳﺮﺑﺮﻧﺎﻣﻪﻫﺎي ﺑﺎزﮔﺸﺘﻲ‬
‫‪ y‬اﮔﺮ دو زﻳﺮﺑﺮﻧﺎﻣﻪ ‪ A‬و ‪ ،B‬ﻫﺮ ﻛﺪام از دﻳﮕﺮي اﺳﺘﻔﺎده ﻛﻨﻨﺪ‪ ،‬ﻳﻚ ﺣﻠﻘﻪ را‬
‫ﺗﺸﻜﻴﻞ ﻣﻲدﻫﻨﺪ ﻛﻪ در اﻳﻦ ﺻﻮرت ﻧﻴﺰ در زﻳﺮﺑﺮﻧﺎﻣﻪﻫﺎ ﺑﺎزﮔﺸﺖ اﺗﻔﺎق‬
‫ﻣﻲاﻓﺘﺪ‪.‬‬
‫‪ y‬ﭼﻮن زﻳﺮﺑﺮﻧﺎﻣﻪﻫﺎ ﺑﻪ ﺗﺮﺗﻴﺐ ﺗﻌﺮﻳﻒ ﻣﻲﺷﻮﻧﺪ و ﻫﻨﮕﺎم ﺗﻌﺮﻳﻒ اوﻟﻲ‪،‬‬
‫زﻳﺮﺑﺮﻧﺎﻣﻪ دوم ﻗﺎﺑﻞ اﺳﺘﻔﺎده ﻧﻴﺴﺖ‪ ،‬ﭘﺎﺳﻜﺎل ﻣﻔﻬﻮﻣﻲ را ﺑﺎ ﻋﻨﻮان‬
‫‪ forward reference‬ﻣﻌﺮﻓﻲ ﻣﻲﻛﻨﺪ‪.‬‬
‫‪ y‬ﺑﺎ اﻳﻦ ﻣﻔﻬﻮم ﻣﻲﺗﻮان ﭘﻴﺶ از ﺗﻌﺮﻳﻒ ﻛﺎﻣﻞ ﻳﻚ زﻳﺮﺑﺮﻧﺎﻣﻪ از آن اﺳﺘﻔﺎده‬
‫ﻛﺮد‪.‬‬
‫‪18‬‬
‫ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ ﭘﺎﺳﻜﺎل – داﻧﺸﮕﺎه ﺻﻨﻌﺘﻲ ﺷﺮﻳﻒ‬
‫ﻣﺪرس‪: ‬ﻧﻮري‬
‫ﻣﺜﺎل‬
program ForwardReferenceExample;
procedure B(index : Integer); forward;
procedure A(index : Integer);
begin
if index > 0 then
B(index div 2)
end;
procedure B(index : Integer);
begin
if index > 0 then
A(index-2)
end;
begin
B(10);
A(50);
end.
‫ﻧﻮري‬: ‫ﻣﺪرس‬
‫ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ ﭘﺎﺳﻜﺎل – داﻧﺸﮕﺎه ﺻﻨﻌﺘﻲ ﺷﺮﻳﻒ‬
19
‫ﻣﺜﺎل‬
program ForwardReferenceExample;
procedure B(index : Integer); forward;
procedure A(index : Integer);
begin
if index > 0 then
B(index div 2)
end;
procedure B;
begin
if index > 0 then
A(index-2)
end;
begin
B(10);
A(50);
end.
‫ﻧﻮري‬: ‫ﻣﺪرس‬
‫ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ ﭘﺎﺳﻜﺎل – داﻧﺸﮕﺎه ﺻﻨﻌﺘﻲ ﺷﺮﻳﻒ‬
20
‫ﻣﺜﺎل‬
program ForwardReferenceExample;
Var NumberOfTimes : Integer;
procedure WriteALine(var count : Integer); forward;
procedure Decrement(var index : Integer);
begin
index := index – 1;
if index > 0 then WriteALine(index)
end;
procedure WriteALine;
begin
WriteLn(‘The value of the count is now ‘, count);
Decrement(count)
end;
begin
NumberOfTimes := 7;
Decrement(NumberOfTimes);
WriteLn;
NumberOfTimes := 7;
WriteALine(NumberOfTimes)
end.
‫ﻧﻮري‬: ‫ﻣﺪرس‬
‫ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ ﭘﺎﺳﻜﺎل – داﻧﺸﮕﺎه ﺻﻨﻌﺘﻲ ﺷﺮﻳﻒ‬
21
‫ﺗﺎﺑﻊ‬
‫‪ y‬ﻳﻚ ﺗﺎﺑﻊ ﻫﻤﺎﻧﻨﺪ ﻳﻚ زﻳﺮﺑﺮﻧﺎﻣﻪ اﺳﺖ‪ ،‬ﺑﺎ اﻳﻦ ﺗﻔﺎوت ﻛﻪ ﻫﻤﻮاره ﻳﻚ ﻣﻘﺪار‬
‫ﺑﺮﮔﺸﺘﻲ ﻧﻴﺰ دارد‪.‬‬
‫‪ y‬ﺑﻨﺎﺑﺮاﻳﻦ ﺑﻌﺪ از ﻟﻴﺴﺖ ﭘﺎراﻣﺘﺮﻫﺎي ﺗﺎﺑﻊ‪ ،‬ﺑﺎﻳﺪ ﻧﻮع ﻣﻘﺪار ﺑﺮﮔﺸﺘﻲ را‬
‫ﻣﺸﺨﺺ ﻛﻨﻴﻢ‪.‬‬
‫‪ y‬ﭘﺎﺳﻜﺎل در ﺑﺪﻧﻪ ﺗﺎﺑﻊ‪ ،‬ﻣﺘﻐﻴﺮي ﻫﻤﻨﺎم ﺑﺎ ﻧﺎم ﺗﺎﺑﻊ در اﺧﺘﻴﺎر ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺲ‬
‫ﻗﺮار ﻣﻲدﻫﺪ ﺗﺎ ﺑﺘﻮاﻧﺪ ﻣﻘﺪار ﺑﺮﮔﺸﺘﻲ را در آن ﻗﺮار دﻫﺪ‪.‬‬
‫‪22‬‬
‫ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ ﭘﺎﺳﻜﺎل – داﻧﺸﮕﺎه ﺻﻨﻌﺘﻲ ﺷﺮﻳﻒ‬
‫ﻣﺪرس‪: ‬ﻧﻮري‬
‫ﺗﺎﺑﻊ ﺟﻤﻊ زدن دو ﻋﺪد‬
program TestFunction;
var
a, b, c: Integer;
function Add(x, y : Integer) : Integer;
begin
Add := x + y;
end;
begin
ReadLn(a, b);
c := Add(a, b);
WriteLn(‘The sum is ‘, c)
end.
‫ﻧﻮري‬: ‫ﻣﺪرس‬
‫ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ ﭘﺎﺳﻜﺎل – داﻧﺸﮕﺎه ﺻﻨﻌﺘﻲ ﺷﺮﻳﻒ‬
23
‫ﺗﺎﺑﻊ‬
‫‪ y‬ﻳﻚ ﺗﺎﺑﻊ را ﻧﻤﻲﺗﻮان ﺑﻪ ﺻﻮرت ﻳﻚ دﺳﺘﻮر ﻣﺠﺰا ﻓﺮاﺧﻮاﻧﻲ ﻛﺮد‪ ،‬ﺑﻠﻜﻪ ﺑﺎﻳﺪ‬
‫در ﻳﻚ ﻋﺒﺎرت اﺳﺘﻔﺎده ﺷﻮد‪.‬‬
‫;)‪Add(a, b‬‬
‫‪ y‬ﻣﻲﺗﻮان ﺗﺎﺑﻊ را ﺑﻪ ﺻﻮرت ﭘﺎراﻣﺘﺮي از ﻳﻚ زﻳﺮﺑﺮﻧﺎﻣﻪ ﻳﺎ ﺗﺎﺑﻊ دﻳﮕﺮ اﺳﺘﻔﺎده‬
‫ﻛﺮد )آن ﭘﺎراﻣﺘﺮ ﺑﺎﻳﺪ ﻣﻘﺪاري ﺑﺎﺷﺪ(‬
‫;))‪:= Add(10, Add(a, b‬‬
‫‪24‬‬
‫ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ ﭘﺎﺳﻜﺎل – داﻧﺸﮕﺎه ﺻﻨﻌﺘﻲ ﺷﺮﻳﻒ‬
‫‪c‬‬
‫ﻣﺪرس‪: ‬ﻧﻮري‬
‫ﺗﺎﺑﻊ ﻣﺤﺎﺳﺒﻪ ﺣﺎﺻﻠﻀﺮب‬
function Multiply(x, y : Integer) : Integer;
var
temp : Integer;
begin
temp := x * y;
Multiply := temp;
end;
‫ﻧﻮري‬: ‫ﻣﺪرس‬
‫ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ ﭘﺎﺳﻜﺎل – داﻧﺸﮕﺎه ﺻﻨﻌﺘﻲ ﺷﺮﻳﻒ‬
25
‫ﺗﺎﺑﻌﻲ ﺑﺮاي ﺳﺆال از ﻛﺎرﺑﺮ‬
var
i : Integer;
function UserQuits : Boolean;
var
Answer : Char;
begin
Write(‘Another value ? (Y/N)’);
ReadLn(Answer);
UserQuits := Upcase(Answer) <> ‘Y’
end;
begin
i := 0;
repeat
i := i + 1;
WriteLn(‘i = ‘, i)
until UserQuits
end.
‫ﻧﻮري‬: ‫ﻣﺪرس‬
‫ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ ﭘﺎﺳﻜﺎل – داﻧﺸﮕﺎه ﺻﻨﻌﺘﻲ ﺷﺮﻳﻒ‬
26
‫ﺗﺎﺑﻊ‬
‫‪ y‬در ﺑﺪﻧﻪ ﺗﺎﺑﻊ ﻧﺒﺎﻳﺪ ﻣﺘﻐﻴﺮ ﻫﻤﻨﺎم ﺗﺎﺑﻊ را در ﺳﻤﺖ راﺳﺖ ﻳﻚ ﻋﻤﻠﻴﺎت‬
‫اﻧﺘﺴﺎب ﻗﺮار داد‪.‬‬
‫;‪function Fact(n : Integer) : Integer‬‬
‫‪var‬‬
‫;‪i : Integer‬‬
‫اﺷﺘﺒﺎه اﺳﺖ‪ ،‬زﻳﺮا ﭘﺎﺳﻜﺎل‪Fact ،‬‬
‫‪begin‬‬
‫ﺳﻤﺖ راﺳﺖ را ﺑﻪ ﻋﻨﻮان‬
‫;‪Fact := 1‬‬
‫ﻓﺮاﺧﻮاﻧﻲ ﺗﺎﺑﻊ در ﻧﻈﺮ ﻣﻲﮔﻴﺮد‪.‬‬
‫‪for i := 1 to n do‬‬
‫‪Fact := i * Fact‬‬
‫;‪end‬‬
‫‪27‬‬
‫ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ ﭘﺎﺳﻜﺎل – داﻧﺸﮕﺎه ﺻﻨﻌﺘﻲ ﺷﺮﻳﻒ‬
‫ﻣﺪرس‪: ‬ﻧﻮري‬
‫ﺗﺼﺤﻴﺢ ﺑﺮﻧﺎﻣﻪ ﻗﺒﻞ‬
function Fact(n : Integer) : Integer;
var
i : Integer;
f : Integer;
begin
f := 1;
for i := 1 to n do
f := i * f;
Fact := f
end;
‫ﻧﻮري‬: ‫ﻣﺪرس‬
‫ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ ﭘﺎﺳﻜﺎل – داﻧﺸﮕﺎه ﺻﻨﻌﺘﻲ ﺷﺮﻳﻒ‬
28
‫ﺗﺎﺑﻊ ﺑﺎزﮔﺸﺘﻲ‬
‫‪ y‬ﻫﻤﺎﻧﻨﺪ زﻳﺮﺑﺮﻧﺎﻣﻪ‪ ،‬ﻳﻚ ﺗﺎﺑﻊ ﻣﻲﺗﻮاﻧﺪ ﺧﻮد را ﻓﺮاﺧﻮاﻧﻲ ﻛﻨﺪ‪.‬‬
‫‪ y‬در اﻳﻦ ﺻﻮرت ﺗﺎﺑﻊ ﺑﺎزﮔﺸﺘﻲ ﺧﻮاﻫﻴﻢ داﺷﺖ‪.‬‬
‫‪ y‬اﺳﺘﻔﺎده از ﺗﺎﺑﻊ ﺑﺎزﮔﺸﺘﻲ ﺑﺮاي ﺣﻞ ﺑﺴﻴﺎري از ﻣﺴﺎﻳﻞ دﺷﻮار ﻣﻨﺎﺳﺐ اﺳﺖ‪.‬‬
‫‪ y‬وﻟﻲ ﻛﺎراﻳﻲ ﺗﻮاﺑﻊ ﺑﺎزﮔﺸﺘﻲ ﺑﻪ ﻧﺴﺒﺖ ﺗﻮاﺑﻊ ﻣﻌﻤﻮﻟﻲ ﻛﻤﻲ ﻛﻤﺘﺮ اﺳﺖ‪.‬‬
‫‪29‬‬
‫ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ ﭘﺎﺳﻜﺎل – داﻧﺸﮕﺎه ﺻﻨﻌﺘﻲ ﺷﺮﻳﻒ‬
‫ﻣﺪرس‪: ‬ﻧﻮري‬
‫ﻣﺤﺎﺳﺒﻪ ﻓﺎﻛﺘﻮرﻳﻞ ﺑﻪ روش ﺑﺎزﮔﺸﺘﻲ‬
‫;‪function Fact(n : Integer) : Integer‬‬
‫‪begin‬‬
‫‪if n <= 0 then‬‬
‫‪Fact := 1‬‬
‫‪else‬‬
‫)‪Fact := n * Fact(n-1‬‬
‫;‪end‬‬
‫‪30‬‬
‫ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ ﭘﺎﺳﻜﺎل – داﻧﺸﮕﺎه ﺻﻨﻌﺘﻲ ﺷﺮﻳﻒ‬
‫ﻣﺪرس‪: ‬ﻧﻮري‬
‫دﺳﺘﻮر ‪Exit‬‬
‫‪ y‬ﺑﺮاي ﺧﺮوج از زﻳﺮﺑﺮﻧﺎﻣﻪﻫﺎ و ﺗﻮاﺑﻊ در ﺷﺮاﻳﻂ ﺧﺎص‪ ،‬ﻣﻲﺗﻮان از دﺳﺘﻮر‬
‫‪ Exit‬اﺳﺘﻔﺎده ﻛﺮد‪.‬‬
‫;‪function Fact(n : Integer) : Integer‬‬
‫‪begin‬‬
‫‪if n <= 0 then‬‬
‫‪begin‬‬
‫;‪Fact := 1‬‬
‫‪Exit‬‬
‫;‪end‬‬
‫)‪Fact := n * Fact(n-1‬‬
‫;‪end‬‬
‫‪31‬‬
‫ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ ﭘﺎﺳﻜﺎل – داﻧﺸﮕﺎه ﺻﻨﻌﺘﻲ ﺷﺮﻳﻒ‬
‫ﻣﺪرس‪: ‬ﻧﻮري‬
‫ﺗﻌﺮﻳﻒ ﺗﻌﺪادي ﺗﺎﺑﻊ و زﻳﺮﺑﺮﻧﺎﻣﻪ‬
program UnCapping;
const
UPPERLowerDifF = 32;
procedure UnCapOf(Ch: Char; var
LowerCh: Char);
var
Code, NewCode: Integer;
begin
if ('A' <= Ch) and (Ch <= 'Z')
then
begin
Code := Ord(Ch);
NewCode := Code +
UpperLowerDiff;
LowerCh := Chr(NewCode);
end
else
LowerCh := Ch;
end; { UnCapOf }
‫ﻧﻮري‬: ‫ﻣﺪرس‬
procedure UnCap(var Ch: Char);
begin
if ('A' <= Ch) and (Ch <= 'Z')
then
Ch := Chr(Ord(Ch) +
UpperLowerDiff);
end; { UnCap }
function UnCapped(Ch: Char): Char;
begin
if ('A' <= Ch) and (Ch <= 'Z')
then
UnCapped := Chr(Ord(Ch) +
UpperLowerDiff)
else
UnCapped := Ch;
end; { UnCapped }
‫ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ ﭘﺎﺳﻜﺎل – داﻧﺸﮕﺎه ﺻﻨﻌﺘﻲ ﺷﺮﻳﻒ‬
32
‫اداﻣﻪ‬
function IsUnCapped(Ch: Char): Boolean;
begin
if ('A' <= Ch) and (Ch <= 'Z') then
IsUnCapped := False
else
IsUnCapped := True;
end; { IsUnCapped }
var
Ch, NewCh, Extra: Char;
begin { Main }
{ Testing UnCapOf }
Write('Enter a Character followed by Return:
');
ReadLn(Ch);
UnCapOf(Ch, NewCh);
WriteLn('The lower case is ', NewCh);
‫ﻧﻮري‬: ‫ﻣﺪرس‬
{ Testing UnCap }
Write('Enter a Character followed by Return: ');
ReadLn(Ch);
UnCap(Ch);
WriteLn('The lower case is ', Ch);
{ Testing UnCapped }
Write('Enter a Character followed by Return:
');
ReadLn(Ch);
WriteLn('The lower case is ', UnCapped(Ch));
{ Testing IsUnCapped }
Write('Enter a Character followed by Return:
');
ReadLn(Ch);
if IsUnCapped(Ch) then
WriteLn('It is lower case ')
else
WriteLn('It is capitalized');
end. { UnCapping }
‫ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ ﭘﺎﺳﻜﺎل – داﻧﺸﮕﺎه ﺻﻨﻌﺘﻲ ﺷﺮﻳﻒ‬
33