Kur të definohet zgjidhja e problemit duhet të definohen edhe të dhënat e nevojshme dhe rezulltatet të cilat paraqesin zgjidhjen e dëshiruar.
Për zgjidhjen e një problemi me kompjuter sëpari zgjidhet rruga përkatëse nëpër të cilën duhet kaluar ashtu që të fitohet rezulltati i duhur. Pastaj, rrjedha e procesit llogaritës në këtë rrugë shprehet përmes formës analitike të paraqitjes së algoritmit, ku për çdo procedurë caktohet plotësishtë pozita dhe momenti i paraqitjes
Grumbulli i veprimeve me një renditje të caktuar, të cilat ndërrmirren për zgjidhjen e një problemi me komjuter, quhet algoritëm, kështu psh komandat të cilat i jepen kompjuterit gjatë llogaritjes së sipërfaqesë s dhe perimetrit p të katërkëndshit, mundë të shkruhet si në fig, ku me * duhet nunëkuptuar shenjën e shumëzimit .
Fig1. Algoritmi për llogaritjen e sipërfaqes dhe të perimetrit
Vlerat e llogaritura në bazë të algoritmit të dhënë mundë të shtypen përmesë njësisë dalëse të komjuterit, psh në ekran, ose në printer
Përdorimi i formës analitike në rastet kur kemi të bëjmë me struktura algoritmike më të komplikuar është e pa përshtatshme sepëse përmes tij rëndë mund të paraqitet rrjedha e procesit
Algoritmet kryesishtë paraqiten grafikishtë,përmesë bllok diagrameve .kështu psh blok diagrami i algoritmit të dhënë në fig 1 do të duket si në fig 2, ku numrat e shenuar djathtas blloqeve u përgjigjen hapave të veqant në algoritëm
Me instruksionin lexo ,komjuterit i hurdhërohet që të lexoj (të dhënat që janë hyrëse ) vlerat numerike që figurojnë në bllokun që i përket këtij instruksioni dhe ti vendos në memorje .
Me instuksionin shtyp kompjuterit i urdhërohet që për madhësit që figurojn në bllokun që i përket këti instruksioni t’i printoj (shkruaj) vlerat përkatëse numerike përmes njësisë dalëse duke i marrë ato nga memorja .
Psh bllok diagrami i algoritmit të dhënë më parë në formë analike dotë dukej si në fig vijuese. Ku numrat e shënuar djathtas blloqeve u përgjigjen hapave të veqant në algoritëm.
Një metodë e përgjithshme për për zgjidhjen e problemeve është metoda e algoritmit ose algoritmi. Algoritmi është ndonjë bashkësi e operatorve ,përpunime elementare dhe rregullave mbi zbatimin e tyre me qëllim të fitimit të zgjidhjes së ndonjë problemi.Kjo llojë procedure përcakton rradhën e në ekzekutimin e operatorve .Të ekzekuturit e secilit operator paraqet një hap algoritmik. Si rrjedhim i kësaj ,rradhës së ekzekutimit të hapave algoritmik Mund tju ndahen numrat rendor i (i=0,1,2,...,k) .Si rezulltat i zbatimit të operatorit në hapin e i-të është mesë rezulltati Ri. Ku me Ro shenohet e dhëna fillestare ,ndërsa Rk e dhëna përfundimtare ose rezulltati i zgjedhjes së problemit.rezulltati Ri-1 shërben si vlerë fillestare për operatorin që do të ekzekutohet në hapin e i-të .Krakteristik me ranësi e algoritmit është se ai duhet ta zgjedhë secilin problem , vlerat fillestare të të cilit i takojnë ndonjë bashkësie të pafundme të dhënash.Kjo është e ashtuquajtura veti e masivitetit. Karakteristik tjetër e secilit algoritëm është në ate se sigurisht do ta jepë zgjidhjen e problemit të parapar nëse dhe ajo ekziston. Sa i përket metodave algoritmike problemet mund të jenë
te algoritmi i zgjidhëshëm problemi ekziston së paku në formulimin e tij
Problemi qëndron te algoritmi i pazgjedhshëm nëse ekzistojn argumente në pamundësin e formulimit të algoritmit për zgjidhjen e tij .Nëse për problemin e dhënë nuk ekziston kurfar argumenti ,ai i takon klasës së problemeve me zgjidhje të pakjartë algoritmike.
Algoritmi e zgjedhë problemin e dhënë nëse Rk është rezulltat i problemit të fitura në hapin logaritmik i=k ku k është numër natyral.Pasi koha e nevojshme për kryerje të secilit hap algoritmik e caktur ,zgjidhja e problemeve me ndimën e algoritmave arrihet në kohën e caktuar.
Hapat të cilët nga algoritmi dallojn vetëm në ate që nuk kanë veti të masivitetit ,pasi për ndonjë vlerë fillestare nuk japin rezulltat ,quhen procedura ose hapa procedural.
{Leximi -urdhërat për futje të të dhënave
Programi i cili ekzekutohet në kompjuter dhe të dhënat të cilat
përpunohen janë të qasasshme për përpunim vetëm prej kujtesës punuese të
komjuterit.Të dhënat,sipas regullit ,janë të pavarura prej programit sipas
nevojes futen në kujtesen e punës ose operative nga bartsi i jashtem i të
dhënave.Për këtë ,shumica e programeve të cilët përdoren sot në praktikë
përmbaj spaku një urdhër për futjen e të dhënave në kompjuter.Megithat jo të gjithë.
Përdoren dhe programet ,edhe pse shumë rrall,Te të cilët të dhënat jepen
në vetë programin.Të dhënat në këto programe janë madhësi të përhershme,
dhe me anë të urdhërit aritmetikë iu ndahen vlerat variablave .Këto
programe saher që ekzekutohen ,ekzekutohen gjithmon në të njejtën mënyrë
dhe japin të njejtin rezulltat.Athua a ka kuptim përpunimi vetëm njëher.
Nëse dëshirohet ndryshuar vlerat e ndonjërës variabël duhet bërë modifikime në
program.
ekzekutohen
Komjuterit duhet t'i jepen të dhënat që përpunohen.
Deklarimi i tyre brenda programit si konstante të emëruara
ose ndarja e vlerave variablave përmes operatorit të shoqërimit ,
gjithnjë nuk është praktikë.Kjo rrugë e futjes së të dhënave në
kompjuter e imponon nevojën e pasjes së verzionit burimor të programit ,
sa herë që duhet të ndryshohen që marrin pjesë në llogaritje .
Të dhënat në komjuterit mund t'i jepen përmes njërës nga njësit
hyrëse ,ose mund të merren direkt nga njësit memoruese të tij ,
ku janë vendosur më parë.Këtu do të spjegohet mënyra e përcjelljes
së të dhënave në komjuter përmes tastierës,e cila llogaritet
si njësi hyrëse standarte.
Procedurat për lexim
Në gjuhën pascal ,marrja ,ose siç thuhet ndryshe leximi i vlerave hyrëse,
të cilat komjuterit i jepen në tastierë ,bëhet me procedurën për lexim.
vlerat lexohen përmes variablave përkatëse,vendosen në memrjen e
komjuterit .
Procedura për lexim,shkruhet në dy verzione ,të cilat në formë
të përgjithshme duken kështu.
Read(v1,v2,. . .vn)
ReadLn(v1,v2,. . .vn)
Ku me v1,v2,. . .vn janë shënuar variablat në të cilat do të vendosen
vlerat e lexuara.
Numri i variablave brenda kllapave në procedurën për lexim e
përcakton numrin e vlerave hyrëse që duhet dhënë përmes tastierës.
Komjuteri nuk do ta vazhdoj ekzekutimin e matujeshëm të programit ,
gjersa nuk shkruhen vlerat për të gjitha variablat që paraqiten në
procedurën për lexim.
Leximi i vlerave numerike
Variablat, vlerat numerike të të cilave lexohen ,patjetër duhet të
deklarohen në fillim të programit ,përmes deklarimit përkatës,si
variabla të tipit përkatës
Shembull: Programi për leximin e vlerave numerike të
variablave a dhe b }
Program lexo_1;
uses wincrt;
Var
a,b:integer;
begin
clrScr;
WriteLn('Vlerat e lexuara:');
Read(a,b);
WriteLn('a= ',a,'b= ',b);
End.
{Ekzekutimi i komandave brenda trupit të programit fillon
me ekzekutimin e komandës ClrScr ,e cila fshinë ekranin.
Pas kësaj Vjen procedura Read ,përmes së cilës lexohen
vlerat e variablave të tipit intexher a e b .kompjuteri
hynë në regjimin e pritjes derisa përmes tastierës nuk
skruhen dy vlera numerike ,të ndara mes vete me më së
paku një zbrazësirë dhe pastaj shtypet pulla Enter.Pas
kësaj,vlerat numerike ,u shoqërohen Variablave a dhe b ,
duke pasur parasysh rradhën e shkruarjes
Kështu psh.
Në praktikë ,para procedurës për lexim rregullisht shkruhet
procedura për shtypje të tekstit ,ashtu që shfrytëzuesi i
programit të njoftohet se çka lexohet,gjegjësisht çfarë
vlerash duhet shkrua në tastierë.kështu në programin e dhënë
më sipër ,para procedurës për leximmund të shtohet psh. Procedura
Write ('vlerat për a dhe b:') si rezullat i së cilës në ekran
do të shtypet teksti
vlerat për a dhe b:
Pastaj komjuteri do të presë që pas dy pikave të shenohen vlerat që lexohen.
Leximi i vlerave mundë të bëhet edhe duke përdorur më shumë procedura
njëkohsisht.psh.programi i dhënë më sipër ,procedura për lexim mund të
zëvendsohet me dy procedura.
Read(a);
Read(b);
Me efekt plotësiahtë të njëjtë.
Për leximin përdoret edhe procedura ReadLn (ReadLine)
e cila dallohet nga procedura Read, sepse pas ekzekutimit të saj,
leximi i vlerave me procedurën vijuese vazhdon në rreshtin vijues.
Shembull: Programi për leximin e vlerave numerike të variablave x,y dhe z.
}
{shembulli 8.4
duhet sajuar programi përmes së cilit mund të futen tre numra
real:a,b dhe x,testoni se a i takon numri x intervalit[a,b]
dhe për nga kompjuteri shtypni mesazhin përkatës.
detyra mund të zgjidhet në dy mënyra.Zgjidhja e problemit do
të jetë e dhanun me njërën prej dy përgjigjigjjeve:
Numri x i takon intervalit [a,b] ose nuk i takon intervalit[a,b]
{1}
uses wincrt;
var
a,b,x:real;
begin
read(a,b,x);
If x>=a then
begin
if x<=b then
writeln('numri',x, 'i takon intervalit [a,b]')
else
writeln('numri',x, 'nuk i takon intervalit [a,b]')
end
else
writeln('numri',x, 'nuk i takon intervalit [a,b]')
end.
{Programi për zgjidhjen e ekuacionit a*x*x+b*x+c=0
ku a,b dhe c janë numra real
ZGJIDHJE
Q@ T@ p@rcaktohet forma e zgjidhjes s@ pari duhet p@rcaktuar
diskriminanten D=b*b-4a*c. Kur D>=0 ,rr@nj@t jan@ numra real
x1=(-b+sqrt(d))/(2*a)
x2=(-b-sqrt(d))/(2*a))
n@se D<0 zgjidhjet jan@ numra kompleks t@ konjuguara t@ form@s;
z=alfa+/- beta*i
ku jan@
-alfa-pjesa reale e numrit kompleks
-beta -pjesa imanagjinare e numrit kompleks ddhe
-i-nj@sia imagjinare
a dhe b jan@ elemente nga bashk@sia e numrave real , nd@rsa nj@sia imagjinare
@sht@ sipas definiconit i:=sqrt(-1) (p@rkujtojm sqrt(-a)=i*sqrt(abs(a)) )
alfa dhe beta llogariten sipas shprehjeve :
alfa =-b/(2*a) , beta =sqrt(abs(D))/(2*a)
}
Program Det_106;
Uses Crt;
Var
D,a,b,c:Real ;
Begin
WriteLn('Vlerat për konsantet a,b dhe c');
Write('a=');
Read(a);
Write('b=');
Read(b);
Write('c=');
Read(c) ;
WriteLn('Rrënjët janë:');
D:=b*b-4*a*c ;
If D>=0 then
Begin
writeln('x1=',(-b+sqrt(d))/(2*a));
writeln('x2=',(-b-sqrt(d))/(2*a))
end
else
begin
writeln('x1=', -b/(2*a),'+', sqrt(abs(D))/(2*a),'*i');
writeln('x2=', -b/(2*a),'-', sqrt(abs(D))/(2*a),'*i')
end
End.
{n@se testohet programi p@r vlerat a=-1, b=1,c=-3 fitohen zgjidhjet n@ form2n
x1=..............+-......*i dhe
x2=..............--......*i
pasi k@si lloj@ shenimi n@ matematik nuk @sht@ i r@ndomt duhet modifikuar
dhe algoritmin dhe programin ashtu q@ p@r vlera negative b shkrimi i
numrit kompleks t@ jet@ n@ form@n :
x1=..............+(-......*i) dhe
x2=..............-(-......*i)
Program Det_106;
Uses Crt;
Var
D,x1R,x2R,x1I,x2I,a,b,c:Real ;
Begin
WriteLn('Vlerat për konsantet a,b dhe c');
Write('a=');
Read(a);
Write('b=');
Read(b);
Write('c=');
Read(c) ;
writeln('a',a:4:2,' ,b=',b:4:2, ' ,c= ',c:4:2 );
writeln(a,'x*x+',b,'x+',c,'=0');
D:=b*b-4*a*c ;
If D<0
Then
Begin
x1R:=-b/(2*a);
x2R:=X1R;
x1I:=sqrt(abs(D))/(2*a);
x2I:=-x1I
End
else
Begin
x1R:=(-b+sqrt(D))/(2*a);
x2R:=(-b-sqrt(D))/(2*a);
x1I:=0;
x2I:=0;
End;
WriteLn('Rrënjët janë:');
WriteLn(x1R:8:2,'+j(',x1I:4:2,')');
WriteLn(x2R:8:2,'+j(',x2I:4:2,')');
End.
{Programi përmes së ciulit gjendet faktorieli i numrit të dhënë n}
Program while_1;
Uses wincrt;
Var
n,i:integer;
F:real;
Begin
Write('Vlera e variabës n:');
Readln(n);
F:=1;
i:=1;
While i<=n Do
begin
F:=F*i;
i:=i+1;
End;
writeln('Vlera e llogaritur:',n:4,'!=',F:8:0);
Readln
End.
{programi për gjetjen e mbetjes së pjestimit të dy numrave
të plotë.}
program while_1;
uses wincrt;
var
m,n:integer;
begin
clrscr;
m:=19;
n:=4;
write('Mbetja e pjestimit ',m,'/',n,' është ');
while m>=n Do
m:=m-n;
writeln(m);
readln
end.
{1. Repeat . . . Until
Përmes unazës Repeat ,do të përsëritet ekzekutimi i komandës
,ose grupit të komandave x ,derisa të plotësohet kushti k
,gjegjësisht ekzekutimi i unazës ndërpritet kur vlera e
kushtit k bëhet True .Pas daljes prej unazës repeat
ekzekutimi i programit vazhdon me komandën e parë që
gjindet nën te .
Shembull programi për shtypjen e numrave natyral mes 1 dhe 9 }
Program Repea;
uses Crt;
Var
i:Integer;
Begin
i:=1;
Repeat
Write(i:2);
i:=i+1
Until i>9;
ReadLn
End.
{Për shtypje është përdorur unaza repeat ,me të cilën
përsëritrt ekzekutimi i unazës (Komandat që gjinden mes
fjalëve Repeat dhe Until) derisa kushti i përfundmit të saj i>9
është False (nuk është i sakt) .Në momentin kur kushti i
përfundimit të unazës bëhet i sakt (Vlera e shprehjes i>9
është True )dilet nga unaza dhe ekzekutohet komanda e parë
vijuese ReadLn-Gjatë përdorimit të unazës Repeat duhet pasur
kujdes sepse kushti për përfundimin e saj vendoset në fund të unazës}
{Programi për llogaritjen e shumës së Katrorve të numrave natyror
tek mes 1 Dhe n}
Program Repeat_1;
uses wincrt;
Var
n,i:Integer;
S:Real;
Begin
Write('Vlera e variables n:');
Readln(n);
S:=0;
i:=1;
Repeat
S:=S+Sqr(i);
i:=i+2;
Until i>n;
writeln('Shuma e kërkuar është S=',S:8:0);
Readln
End.
Programi përmes së cilit tregohet realizimi i komandës while të
programit while_1 ,duke i përdorur komandat if dhe goto}
Program while_2;
uses crt;
var
m,n:integer;
label
d;
begin
m:=19;
n:=4;
write('Mbetja e pjestimit ',m,'/',n,' është ');
d:if m>=n
then
begin
m:=m-n;
goto d
end
else
writeln(m);
readln;
end.
{shembulli 9_3}
Program Nrthjesht(input ,output) ;
Uses wincrt;
(* programi teston se a është vlera e lexuar e variables
numër i thjesht*)
Var
Nr:Integer;(*numri i cili testohet*)
n:Integer; (*Pjestuesi i mundshëm*)
Begin
Write('Jepni numrin e dëshiruar:');
Read(Nr);
n:=1 ;
Repeat
n:=n+1;
Until Nr Mod n=0;
If n=Nr Then
WriteLN(Nr,'është numër i thjesht')
Else
Writeln(Nr,' është i pjestueshëm me ',n);
End.
Programi permes se cilit tregohet perfshirja e unazes for
brenda nje unaze tjeter.}
Program For_14;
Uses Crt;
Var
i,j:Integer;
Begin
For i:=0 To 9 Do
Begin
For j:=0 To i Do
Write(j:2);
WriteLn
End;
ReadLn
End.
{shkruani segment te programit i cili shtyp
*********
*******
*****
***
*
}
Program For_14;
Uses WinCrt;
Var
k,i,j:Integer;
Begin
ClrScr;
For k:=5 DownTo 1 Do
Begin
For i:=1 To 5-k Do
Write(' ');
For j:=1 To 2*k-1 Do
Write('*');
WriteLn
End;
ReadLn
End.}
{Program Jokorekt(Input,output);
uses wincrt;
{programi lexon vergun e numrave natyral dhe gjen vleren e
tyre mesatare , per perfundim jepet vlera -1}
{Const
fund=-1;
Var
n:Integer;
Nr,shuma:Real;
Begin
n:=0;
shuma:=0;
Repeat
Read(Nr);
shuma:=shuma+nr;
n:=n+1
Until Nr=fund ;
WriteLn('Vlera mesatare eshte',shuma/n:4:2);
End.
Const
fund=-1;
Var
n:Integer;
Nr,shuma:Real;
begin
n:=0;
shuma:=0;
Repeat
Read(Nr) ;
If Nr<> fund Then
begin
Shuma :=Shuma+Nr;
n:=n+1
End
Until nr=fund;
Writeln('Vlera mesatare eshte ',shuma/n:4:2)
End.}
program Vleramesat(input,output);
Uses wincrt;
var
Nr ,s,shuma:Real;
i,j,k,m,n:integer;
Begin
Shuma:=0;
ReadLn(n,m);
For i:=1 To n Do
Begin
s:=0;k:=0 ;
For j:=1 To m do
Begin
readLn(Nr);
s:=s+Nr;
k:=k+1
End;
Shuma:=shuma +s;
Writeln(' vlera e ',i:2,'-të mesatare është ',s/k:5:2 )
End;
Writeln('Shuma e fundit përmban',k:2,' numra');
Writeln('Vlera mesatare e këtyre numrave është', shuma/n:5:2)
End.
program tabel_f;
uses crt;
const
x:real=1.0;
h=0.5;
f=4.0;
a=' x y z v';
b=' ______________________________________';
var
y,z,v:real;
begin
writeln(b);
writeln(a);
writeln(b);
repeat
y:=2*(x/3-4.5)+6;
z:=x-1;
v:=3+4*(x+2-x/3);
writeln(x:8:2,y:8:2,z:8:2,v:8:2);
x:=x+h;
until x>f;
writeln(b);
readln;
end.
PROGRAMI PERMES SE CILIT tregohet perdorimi i operatorve
Or ,And dhe Xor mbi numrat intexher a dhe b me madh[si i bajt}
Program Bit_or;
Uses WinCrt;
Var
a,b,c,d,e:Byte;
Begin
Write('Dy numra me vlerë deri 255:');
Read(a,b);
c:=a Or b;
WriteLn(a,' OR ',b,' =',c);
d:=a And b;
WriteLn(a,' AND ',b,' =',d);
e:=a xOr b ;
WriteLn(a,' XOR ',b,' =',e);
ReadLn
End.
tregimi i përdorimit të operatorve Shl dhe shr, kur çvendosja
bëhet me një numër të dëshiruar vendesh}
Program Shr_shl;
Uses WinCrt;
Var
a,b,c,t:Byte;
Begin
Write('Numri a:');
ReadLn(a);
WriteLn('t a shl t a shr t');
WriteLn('..............................');
For t:=1 To 8 Do
Begin
b:= a shl t;
c:= a shr t;
WriteLn(t:3,b:12,c:12)
End;
WriteLn('..............................');
ReadLn
end.
{Set operatatorët
Në pascal mund të operohet me grumbujt duke shfrytëzuar rregullat
që përdoren në matematikë
Operataor Funksioni Tipi i operandit
+ Unioni
- Diferenca(diference
* Prerja (intersection)
Rezulltati i set-operatorit pajtohet me rregullat e grumbullit
logjik (set logic)
" Një vlerë e të dhënave rendore C është në A+B vetëm nëse
C është në A ose B
" Një vlerë rendore C është A-B vetëm nëse C është në A dhe jo në B
" Një vlerë rendore C është në A*B vetëm nëse C është në dyjat
A dhe B
" Nëse vlera rendore më e vogël që është antarë i rezulltatit
nga set operatori është A dhe më e madhja është B ,atëhere tipi i
rezulltatit është
Set of A..B
Shembull programi përmes së cilit gjinden se ajanë shifrat e sistemit
decimal elemente të grumbullit të shifrave decimale s,grumbullit të
shifrave çiftë a, dhe grumbullit të shifrave tek b, pastaj unionin
(a+b) diferencën (a-b) dhe premjen (a*b) }
program set_op;
uses wincrt;
type
shifra=0..9 ;
g=set of shifra ;
var
s,a,b,u,d,p:g;
i,j :integer;
x :array[1..6] of char;
begin
s:=[0,1,2,3,4,5,6,7,8,9];
a:=[0,2,4,6,8];
b:=[1,3,5,7,9];
u:=a+b ;
d:=a-b ;
p:=a*b;
writeln(' i s a b u d p') ;
writeln(' ..... .............................');
for i:=0 to 9 Do
begin
if i In s then x[1]:='+' else x[1]:='-';
if i In a then x[2]:='+' else x[2]:='-';
if i In b then x[3]:='+' else x[3]:='-';
if i In u then x[4]:='+' else x[4]:='-';
if i In d then x[5]:='+' else x[5]:='-';
if i In p then x[6]:='+' else x[6]:='-';
write (i:5);
for j:=1 to 6 do
write(x[j]:5);
writeln;
end;
readln
end.
{Në fillim të programit përmes deklarimit type është
deklaruar tipi i të dhënave me emrin shifra , dhe prej tyre
është formuar grumbulli g më pas ky tip është shfrytëzuar
për deklarimin e variablave tjera ;s,a,b,u,d,p.brenda
programit janë deklaruar ose formur grumbujt
" S-grumbulli i shifrave decimale
" a grumbulli i shifrave decimale çif
" b grumbulli i shifrave decimale tek
" u-unioni i grumbujve a dhe b
" d-diferenca e grumbujve a dhe b
" p- premja e grumbujve adhe b
në fund duke përdorur operatorin relacional IN është gjetur
prezenca e sistemit decimal në grumbujt e veçantë dhe për
prezenc është përdorur simboli + ndërsa për mosprezencë
simboli' -'.,janë vendosur në vektorin x që njëkosisht
shtypen duke formuar tabelën si do ta shihni gjatë ekzekutimit .
}
Koka e procedurës definon emrin për procedur dhe parametrat formal
(nëse ka )
Një procedurë aktivizohet me urdhërin procedure
Koka e procedurës fillon me :
- pjesën e deklarimeve ku deklaron parametrat lokal
- urdhërat ndërmjet Bigin dhe end; përcaktojn se çka duhet të
ekzekutohet kur të thirret procedura .
nëprogramet procedure shkruhen ngjajshëm me nënprogramet e tipit function
me tre dallime esenciale vijuse.
" Emri i tipit procedure është vetëm për thirrjen e tij ,
por jo edhe varibël sikurse te nënprogrami function .
" Brenda kllapave te titulli i nënprogramit procedure ,
përmes parametrave hyrës që shenohen te nënprogramet function ,
shenohen dhe parametrat dalës ,përmes së cilëve merren rrezulltatet
nga nënprogrami .
" Thirrja e nëprogramit procedure bëhet përmes emrit të tij duke
e shkruar atë si një komand e veçantë, por jo dhe brenda shprehjeve të
ndryshme ,sikurse thirret nëprogrami function
shembull: Programi p@r gjrtjen dhe shtypjen e vler@s m@ t@ vog@l
(mes vlerave a dhe b}
Program Proc_1;
Uses wincrt;
Var
a,b:Integer;
Procedure Min;
Begin
program Proc_1; {programi me nje nenprogram procedure pa parametra}
uses wincrt;
Const
PI=3.1415962;
Var
S,P,r:real;{dekl i. var. që perdoren ne prog. dhe nenprog-parametrat global}
Procedure RRETHI;{deklarimi i proc. rrehti pa parametra lokal}
Begin
S:=PI*Sqr(r);
P:=2*PI*r;
End;
Begin
Write('rrezja e rrethit r:');
Readln(r);
RRETHI;{thirja e procedures me emrin rrethi në program}
writeln('Sipërfaqja e rrethit S=',S:8:4);
Writeln('Perimetri i rrethit P=',P:8:4);
Readln
End.
Me qëllim që procedura të jetë e përgjithshme , në
vazhdim të emrit të saj brenda kllapave shënohen parametrat
formal ,përmes së cilave definohen llogaritjet e ndryshme në
proceedur.Parametrat formal mund të jenë dy llojesh :
Parametra variablash (varible parameters) dhe parametra
vlerash (value parameter)
Parametrat e variablave breanda kllapave të procedures
dekklarohen të tipit të caktuar,kurse parametrat e
vlerave shoqërohen vetëm me tipin e tyre
Gjatë thirjes së procedures në program në program ,
parametrat formal zëvendsohen me ato aktual ,duke ruajtur
numrin ,rradhën dhe tipin e tyre .
}
Program Proc_2;{ forma me parametra}
Uses wincrt;
Const
PI=3.1415962;
Var
S,P,r:real; {parametrat global}
Procedure RRETHI(p,a:Real;Var x,y:Real);{parametrat formal hyres/dales}
Begin
x:=p*Sqr(a);
y:=2*p*a;
End;
Begin
Write('rrezja e rrethit r:');
Readln(r);
RRETHI(PI,r,S,P); {thirja e pare e procedures me paramtra në program}
writeln('Sipërfaqja e rrethit S=',S:8:4);
Writeln('Perimetri i rrethit P=',P:8:4);
RRETHI(PI,5,S,P); {thirja e dytë e procedures me paramtra}
Writeln('Rezulltati i dytë për r=5.0: S=',S:8:4,' P=',P:8:4);
Readln
End.
{Në procedur janë shfrytëzuar parametrat formal për definimin e llogaritjes së sipërfaqes dhe perimitrit të rrethit si parametra formal janë përdor :
a-rrezja
p-konstanta PI
x-sipërfaqja
y-perimetri
Gjatë thirjes së procedurës ,parametrat formal janë zavendsuar
me parametrat aktual ,duke pasur kujdes që të ruhetv rradha ,
tipi dhe numri i tyre.,zavensimi është si më poshtë.
Parametrat formal parametrat aktual
RRETHI(PI,r,s,p) RRETHI(PI,5.0,s,p)
..........................................................................................................
a r 5.0
p PI PI
x s s
y p y
..........................................................................................................
parametrat formal mund të jenë të njëjt me parametrat aktual ,
te programi i dhënë më sipër ,rezulltati nuk do të ndryshoj aspak
nëse shfrytëzohet deklarimi deklarimi i procedures
Procedure RRETHI(PI,r:Real;Var s,p:Real)
Begin
S:=PI*sqr(r);
P:=2*PI*r;
End;
}
{PROGRAMI I STRUKTURUAR -DETALIZIMI HAP PAS HAPI
ekzistojnë metoda të ndryshme me të cilat bazohet
ndërtmi i programit. Në programin e strukturuar,me rastin e
ndërtimit të programit Përdoret metoda lart posht(Top-down
disgn. Kjo metod bazohet në krijimin e programit ashtu që
ai zbërthehet në një varg modulesh të cilët ndërmjet veti
lidhen.Në të vërtet ,fjala është mbi detalizimin hap pas hapi
të përshkrimit të një zgjidhje globale
Nga një tërsi komplekse fitohen nëntërsit të cilat
janë të nevojshme dhe më tutje të zbërthehen derisa të
vie deri te niveli i gjuhës programuese.Strukturat komplekse
për secilin hap të detalizuar(profiluar)shprehen përmes
strukturave të thjeshta -derisa të mos arrihet deri te strukturat
primare që janë prezente(që ekzistojn) në gjuhën programuese
Për përshkrim Global të programit zakonisht përdoret
ndonjë tip i pseodo gjuhës,pra gjuhës folëse e cila përshtatet
në gjuhën programuese në të cilën programi do të shkruhet.
Për këtë qëllim në pseudo-gjuhën zakonisht përdoren strukturat
primare të cilat ekzistojnë dhe në gjuhën Programuse në të cilën
shprehet (shkruhet) programi .Rregullat sintaksore të
Pseodo-gjuhës ,sipas rregullit ,nuk janë strikte si në gjuhën
programuese
Të gjithë Modulet e Përgjithëshme shkruhen me ndimën
e pseodo-gjuhës .Modulet finale Me rastin e procedurës të detalizimit
shkruhen mendimën e gjuhës programuese në të cilën shprehet programi
Që të skjarrojm procedurën e detalizimit të programit
hap pas hapi,do ta shkoqitim një shembull konkret
SHEMBULL:- shkruani programin për
leximin e një varg të dhënash :
shifra e shtëpisë së mallrave ,sasia e mallit të shitur,çmimi
sipas njësisë matse derisa të mos largohemi prej fajllit hyr
ës
Shtypja e raportit i cili përmban shifrën e shtëpisë së mallrave
dhe fitimin total në bazë të të dhënave hyrëse
supozohet se fajlli hyrës të mos jet i zbrazt.
ZGJIDHJE :
ZGJIDHJE shumë e përgjithëshme e detyrës së parashtruarështë:
SHTYPJA e fitimit total për secilën shtëpi të mallrave ,të prezentuara
me shifra ,në bazë sasisë dhe çmimit për njësin matëse për
lloje të ndryshme të mallit
Në të vërtet këtu detyra e parashtruar është vetëm ndryshe e formuluar.Me
rëndsi është me rastin Kso lloj paraformulimeve të mos ndrrhoet kuptim
i detyrës së shtruar.
Në përgjithësi detyrën e parashtruar mundemi ta shprehim më detalisht
me ndimën e tre moduleve
1) leximi i të dhënave hyrëse
2) PëRPUNIMI i të dhënave hyrëse dhe FORMIMI i të dhënave dalëlse
3) SHTYPJA e të dhënave dalëse
dhe kjo zgjidhje akoma është e përgjithshme , dhe duhet qasur detalizimit
të moduleve .Mirpo më parë është e nevojshme të definohen të dhënat me
të cilat operohet .Tri të dhënat hyrëse: shifra ,sasia dhe çmimi për
njësi matëse përbëjnë një lloj tërsie .Këto të dhëna mund ti Baashkojm
në jë rekord të cilin mund ta definojm në mënyrën si në vazhdim
RekordiHyres= Record
shifra:0..Maxint;
sasia : Real
cmimi : Real
End;
Kemi Supozuar se shifra është numër i plot jo negativë ,Ndërsa sipas
natyrës së gjërave sasia dhe cmimi janë numra real
Më e përshtatshme është që dhe të dhënat dalëse të trajtohen si një rekord
Prej dy komponeneteve .Shifra e shtepisë së mallrave dhe fitimi. Shifrat
e Njërës shtëpi të mallrave munden shumëher të lajmrohen në hyrje ,gjerësa
në dalje duhet lajmrohet vetëm njëher. Sipas Kësa secili rekord hyrëse duhet
të ruhet -që të mundësohet përpunimi i tij .Më e Përshtashme është që rekordet
Hyrëse dhe dalëse të vendosen në dy vektor dhe të ruhet numri i antarve të
këtyre vektorve (Vargjeve)
Tani mund tju qasemi detalizimit të matutjem të module të mëparme.
MODULI 1 detalisht përshkruet në mënyrën si në vazhdim
(1.1) Tju ndaj 0 numrin e rekordeve hyrëse.
(1.2 ) Derisa të mos haset Fundi i fajllit hyrës BëNI sinë vazhdim:
(1.3 RRITNI numrin e rekordeve hyrëse për 1.
(1.4) LEXONI KOMPONENTET e tjetrit rekord hyrës.
Të gjitha "urdhërat" e mëparshëm të Pseodu-kodit (1.1)-(1,4) mund të
shprehen në pascal .Nëse me m shënojm numrin e rekordeve hyrëse ,ndërsa
me H[m] rekordi i m -të hyrës ,pseodo-kodin e mëparshë
me ndimën e pascalit e shkruajm në mënyrën si në vazhdim
m:=0;
While Not eof Do
Begin
m:=m+1;
ReadLn(H[m].shifra ,H[m].saisia .H[m].cmimi
end;
Thën ndryshe ,kemi ardhur deri te një modul final,d.m.th
deri te një procedur në pascal
Procedurë të ngjajshme të detalizimit e zbatojm për modulin
(2) dhe (3). Pasi është prejedikuar se ekziston së paku një
rekord hyrës ,Detalizimi imodulit (2) fillon me formimin
e rekordit të parë dalës në bazë të të parit hyrës:
(2.1) shifren e rekordit të parë NDAJA shifrës së atij të parë
Dalës.Saisin e rekordit të parë hyrës shumzone me çmin dhe
NDAJA shumës të rekordit të dytë.
(2.2) nËSE numri i rekordeve hyrëse është më i madhë se 1 ATËHERE
(2.3) PËRPUNO secilin rekord hyrës prej 2 deri te i fundit
Hapat (2.1) dhe 2.2 mund të shprehen në pascal,Hapin (2.3), megjë that
zbërthim duhet dhe mëtutje përpunu
Hapin(2.3) në program është përshkruar meprocedurën llogaritje dhe
kështu mund ta Përshkruajm me pseodu-kod
(2.3.1)Për secilin rekord dalës Bëni:
(2.3.2) NËSE ekziston shifra e rekordit hyrës ATËHERE
(2.3.3.) shumzoni sasin dhe çmimin e rekordit hyrës dhe ndanja
shumës të rekordit dalës
(2.3.4 Nëse nuk ekziston shifra e rekordit hyrës në asnjë dalës ATËHERE
2.3.5 formoni rekord të ri dalës dhe rritni numrin e rekordit dalës
për 1
Me këtë kemi arritur deri te niveli i pascalit .Kujtojm se
në praktik nuk bëhet detalizimi deri në këtë shkallë.Detalizimi
i hapit (2.3) nga moduli (2) mund të bëhet direkt në pascal
Moduli (3) përmes pseodo kodit shprehet në mënyrën si në vijim:
(3.1) SHTYPNI KOKëN përkatëse .
(3.2) PËR secili rekord prej 1 deri te i fundit:
(3.3) shtypni shifren dhe shumën
Me lidhjen emoduleve të përshkruara vie deri te programi
final i cili ka struktur kiarekike
}
Uses wincrt;
{llogaritet fitimi total i seciles shitore ne baze:}
{shifra e shitores,sasia e mallit dhe cmimi i mallit per njesi}
Const n=200;
Type
RekordHyr=Record
shifra:0..maxint;
sasia:Real;
cmimi:real
End;
Rekorddal=Record
Shifra:0..maxint;
shuma:Real
End;
Vektorihyr=Array[1..n] of Rekordhyr ;
Vektoridal=Array[1..n] Of Rekorddal;
derien=0..n;
Var
h:Vektorihyr;
s:Vektoridal;
m,k:Derien ;
(*---------------------------------------------------------*)
Procedure hyrje( Var h:vektorihyr;Var m:derien);
begin
WriteLn('jepni ,sipas rradhes,shifra e shitores,sasia dhe çmimi');
m:=0;
While Not eof Do
begin
m:=m+1;
Readln(h[m].shifra,h[m].sasia,h[m].cmimi)
End
End; {hyrja}
Procedure perpunimi(Var s:VektoriDal;h:VektoriHyr;m:derien;Var k:derien);
Var i:derien;
Procedure llogaritje(P:RekordHyr;Var s:Vektoridal;Var k:derien);
Var ind:Boolean;
j:derien;
Begin
ind:=True;
For j:=1 To k Do
iF p.shifra=s[j].shifra then
Begin
s[j].shuma:=s[j].shuma +p.sasia*p.cmimi;
ind:=false
end;
if ind Then Begin
k:=k+1;
s[k].shifra:=p.shifra;
s[k].shuma:=p.sasia*p.cmimi
End
end;{llogaritja}
(*---------------------*)
Begin {perpunimi }
s[1].shifra:=h[1].shifra;
s[1].shuma:=h[1].sasia * h[1].cmimi;
k:=1;
If m>1 Then
For i:=2 To m Do
llogaritje(h[i],s,k)
End; {Perpunimi}
{*****************************************************************}
procedure shtypje(s:Vektoridal;k:derien);
Var i:derien;
begin
Writeln;
WriteLn('fitimi total per secilen shitore');
Writeln;
writeln('shifra e shitores fitimi') ;
writeln;
For i:=1 to k Do
WriteLn(s[i].shifra,' ',s[i].shuma)
end;{shtypja}
{***************************************************************}
{PROGRAMI KRYESOR}
{***************************************************************}
begin
hyrje(h,m);
perpunimi(s,h,m,k);
shtypje(s,k)
{RANGIMI I KANDIDATVE PËR REXHISTRIM NË FAKULTET
shkruani programin për formimin e ranglistes së kandidatve
të cilët kanë konkuruar për tu rexhistruar në fakultet
prej fajllit hyrës së pari lexohen numri i kandidatve,dhe
më pas për secilin kandidat të dhënat si në vazhdim
-Emri dhe mbiemri (me gjatsi 25 shenja)
-4 notat të lëndës kryesore prej 4 klasve të shkollës së
mesme,si dhe nota të provivimit të maturës të shkollës së mesme
(Këto Të dhëna Mund Të mirren numra të plot prej 2..5
-Numri i poenave në provimin pranues (prej 0 deri 25
Rang-Lista formohet në bazë Të numrit Total i cili fitohet
me mbledhjen e notave të provimit kryesor nga katër klasët
e shkollës së mesme ,notës të provimit Të maturës në shkollë të mesme
dhe numrit Të poenave që ka arritur në provimin Pranues.Dhe
shtypet rang lista
ZGJIDHJE
sipas detyrës së parashtruar,një kandidat karakterizohet
me të dhënat si në vazhdim
1-emri dhe mbiemri
2-notat e lëndës kryesore në shkollë të mesme dhe nota e provimit të maturës
3-numrit të poenave provimin pranues
4-numrit total të poenave
Më e përshtashme është që këto Të dhëna të grupohen në një rekord në
formën(Në vazhdim në vend të fjalës kandidat do të përdorim fjalën
student) Studenti=Record
emri:EmriStud;
L1,L2,L3,L4,PM:2..5;
para:0..25;
s:10..50
End
këtu lajmrohet tipi i padefinuar EmriStud Ky tip lypset që më parë
të definohet si paket string prej 25 shenjave.Në këtë mënyrë kemi
përcaktuar gjatësin maksimale tëemrave dhe nëse emri është më i shkurt
nevojitet të plotësohet me zbrastira -nëse emri është më i gjatë duhet
shkurtuar
Të dhënat mbi kandidatët (studentënt) i ruajmë në një varg(vektor)
Rekordesh Algoritmi global mund të shkruhet në mënyrën si në vazhdim
1. LEXOHET numri i studentve(me shenjën n)
2.KUR i ndryshon prej 1 deri n
3.LEXOHEN të dhënat mbi I-tin student
4.LLOGARITEN numri total i poenave të studentit të i-të
5.RENDITJA e vektorit me rekorde me rendije jo rritëse sipas
numrit total të poenave
6.shtypja e kokës
7.KUR i ndryshon prej 1 deri n
8.SHTYPEN të dhënat e studentit të i-Të
Në përshkrim global të algoritmit , hapat 1,2,6,7 realizohen drejtpërdrejt
në Pascal.Hapat 3,4 dhe 8 realizohen përmes procedurave të thjeshta të
cilat menjëher shkruhen në pascal.Secila nga këto procedura ka nga një
rekord hyrës student
Hapi i 5 stë është më i komp.komplikuari.Në këtë hapë duhet renditur rekordet
ashtu që numri i poenave sipas rekordeve të jetë jo rritës(Nëse dy ose
më shumë studenta kanë të njejtat poena ,renditen sipas rradhës)Sortimi
i rekordeve bëhet me procedurë
n renditje }
Program ranglista(input,output);
Uses wincrt;
{Rang lista e kandidatve per rexhistrim ne fakulltetet}
Type
Nr=1..50;
EmriStud=Packed Array[1..25] Of Char ;
Studenti=Record
emri:EmriStud;
L1,L2,L3,L4,PM:2..5;
para:0..25;
s:10..50
End;
VektoriStudent=Array[Nr] Of Studenti;
Var
i,n:Nr;
ListStud:VektoriStudent;
Procedure Leximi(Var Stud:studenti);
Var
i:1..25;
Begin
WriteLn('EMRI I STUDENTIT ,L1, L2, L3, L4, PM, PARA ?');
With Stud Do Begin
For i:=1 To 25 do Read(emri[i]);
Read( L1,L2,L3,L4,PM,PARA)
END;
Readln
End; {leximi}
Procedure llogaritje(Var Stud:Studenti);
begin
with stud Do s:=L1+L2+L3+L4+PM+PARA
END;{LLOGARITJE}
pROCEDURE Renditje(Var lista:VektoriStudent;n:Nr);
Var
i,j:Nr;
StudNdimes:Studenti;
begin
For i:=1 To n-1 Do
For j:=i+1 To n Do
If Lista[i].s <lista[j].s
Then Begin
StudNdimes:=Lista[i];
Lista[i]:=lista[j];
Lista[j]:=StudNdimes
End
End;{ renditja}
Procedure Shtypje (k:Nr;Stud :Studenti);
Begin
With Stud Do
Write(k:2,'. ', Emri,L1:3,L2:3,L3:3,L4:4,PM:3,PARA:4,S:6);
writeln
End;{shtypja}
Begin{Programi kryesor}
Writeln('RANG-LISTA E STUDENTVE');
writeln('jepni te dhanat per studentet');
Writeln;
write('sa studenta?');readln(n);
For i:=1 to n Do Begin
leximi(listStud[i]);
llogaritje(ListStud[i])
End;
Renditje(ListStud,n);
writeln;writeln;
writeln('NR. EMRI E MBIEMRI (L1 ,L2 ,L3 ,L4, PARA) SHUMA');
writeln;writeln;
For i:=1 To n Do shtypje(i,liststud[i])
End.{ranglista}
{POINTERËT -TREGUESIT
shumica e ndryshoreve të deklaruara ,kryesisht paraqesin
madhësi statike të pa ndryshueshme ,dhe memoria që ju ndahet
mbetet në pronë të tyre prej fillimit deri në fund të ekzekutimit
të programit.Mirpo në kuadër të memories dinamike (Heap)
vendosen tipet dinamike të të dhënave të njohura si terguesit-
ang pointer .
Ndryshoret treguese -pointerët kanë natyrë dinamike ,sepse
mund të krijohen dhe të shkatrrohen gjatë ekxekutimit të
programit.Shkurt , tipet e ndryshme të ndryshoreve munden
më shumë herë të përdorin të njejtën memorie.
Përdorimi i pointerëve zgjeron hapësirën e kujetesës që mund të
përdoret për të dhënat në kuadër të programit.Përdorimi i mundëson
që programi të ekzekutohet me hapsirë më të vogël të kujtesës
pointerët nuk i mbajnë të dhënat njësoj si tipet tjera të
ndryshoreve .Në fakt ky tip i ndryshoreve në vend të vlerave
ruajn lokacionet gjegjësisht adresën e vlerës së vërtet .P.sh.,Nëse
kemi ndryshoren p,e cila ruan adresën e ndryshores së tipit integer
,atëhere p mund të përdoret si tregues në ndryshoren e tipit integer,
edhepse p vetvetiu nuk është e tipit integer.
P.sh
.......
p:^Integer;
i:Integer;
Kur programi fillon ekzekutimin ,kujtesa dinamike është e zbrazt.Para se të
përdoret pointeri p, duhet dhën urdhërin New(p) i cili urdhëron Turbo Pascalin
që tia ndaj një adres në kuadër të kujtesës dinamike.
urdhëri Dispose(p) kryen funksionin e kundërt(zbrazjen) .Ndryshorja
që ndodhet në kujtesën dinamike mund të përdoret në shprehjet dinamike
dhe të shoqrimit duke shtuar simbolin ^ pas ekzekutimit p.sh
p^:=100;
Simboli ^ i tregon pascalit se ka të bëj me ndryshoren e cila ndodhet
në kujtesën dinamike .
....... PËRDORIMI I OPERATORIT @ dhe ^.................
kur kryhen operacione me adresa ,shpesh nevojitet që ponterit t'i
ndahet adresa e ndonj@ ndryshore ose procedure.Kjo realizohet me anë
të operatorit @ ,i cili jep adresën e identifikatorit i cili pason.P.sh.
nëse A është varibël integer atëhere @A tregon lokacionin e variblas
A në kujtesë
ose Me operatorin @ merret adrresa ku është vendosur variabla në kujtesën
e kompjuterit.Nëse p.sh në një program është përdorur variabla k ,me @k
gjindet adresa(lokacioni) i kësaj varible në kujtesë ,kurse p.sh
Varibla T është pointer i tipit Char, me T^gjindet karakteri ku tregon
pinteri T
Shembull:Tregimi i pointerit dhe operatorit @ ose funksionit addr}
Program Adresa ;
Uses Crt;
Type
B_Varg=Array[1..2] Of Byte ;
Var
i:Word;
b:^B_Varg;{b-tregues pointer në vargun prej dy bajtave }
T:^Char;
a:char;
Begin
i:=0;
b:=@i;{ky urdhër shkakton që b të shënjoj në B_varg}
WriteLn(b^[1]:4,b^[2]:4); {b^ behet ri-itepretues i vleres
Byte sikurse te ishte nje array[0..1] of byte}
WriteLn;
a:='a';
T:=@a;
a:=^T;
writeln('a=',a)
End.