Ligjerata 6 - Dr. Fisnik Dalipi

Download Report

Transcript Ligjerata 6 - Dr. Fisnik Dalipi

Universiteti Shtetëror i Tetovës
Fakulteti i Shkencave Matematike-Natyrore
Departamenti i Informatikës
PROGRAMIM I
Ligjerata 6
[email protected]
fisnikd.wordpress.com
Funksionet



Duke perdorur funksionet programi ndahet ne
module te vogla dhe eshte me e thjeshte te
programosh me to. Nje funksion eshte nje bllok
instruksionesh qe ekzekutohet kur theritet nga nje
pike e programit. Ka kete sintakse deklarimi i nje
funksioni
tipi emri ( arg1, argt2, ...) bllok instruksionesh
ku:
· tipi eshte tipi i te dhenave qe kthen funksioni.
· emri eshte emri i funksionit qe perdoret edhe per ta theritur funksionin .
· arg cdo argument perbehet nga tipe te dhenash shoqeruar nga identifikuesit. Keto bejne
te mundur qe funksionit ti kalohen parametra ne momentin kur thirren per ekzekutim.
Parametrat ndahen me presje.
· bllok instruksionesh eshte trupi i funksionit qe kufizohet nga { }.
Mr. Fisnik Dalipi
Funksionet
1.
// funksion shembull

2.
#include <iostream >

3.
int shuma (int a, int b)
4.
{

5.
int r;

|
6.
r=a+b;

z = shuma(5, 3);
7.
return (r);
8.
}
9.
int main ()
10.
{
11.
int z;
14.
15.
Pra fuksioni thirret sipas te njejtes
menyre si eshte deklaruar:
int shuma(int a,int b)
|
z = shuma (5,3);
12.
13.
Output: Rezultati eshte 8
cout << " Rezultati eshte" << z;
return 0;
}
Mr. Fisnik Dalipi
| |
Funksionet




Ne momentin qe funksioni thirret prej main, kontrolli humbet
nga main dhe kalon te funksioni shuma. Vlerat e te dy
parametrave (5 dhe 3) kopjohen ne variablat lokale int a dhe
int b brenda funksionit.
Funksioni shuma deklaron nje variabel (int r;), qe mer vleren e
a+b. Meqe vlerat e parametrave a dhe b jane 5 dhe 3
perkatesisht, rezultati eshte 8
Kodi: return (r);
Finalizon funksionin shuma, dhe kthen kontrollin mbrapsht te
funksioni qe e thirri (main) qe vazhdon egzekutimin ne te
njejtin pike ku ishte shkeputur prej funksionit shuma, gjithashtu
kthen vleren 8, vlere qe i jepet variablit z.
Mr. Fisnik Dalipi
Funksione pa tip_kthimi (void)

Tipi qe paraprin ne deklarimin e variablit duhet te
jete i njejte me tipin e kthimit te instruksioni return.
Nese nuk duam qe funksioni te kthej nje vlere
atehere perdoret fjala kyce void. Kjo perdoret
edhe kur funksioni nuk mer parametra. Ne C++
mund edhe te mos e perdoresh void ne rastin kur
nuk mer parametra. Por sa here te thirret funksioni
perdoret emri bashke me kllapat qe jane te
detyrueshme te shkruhen, sepse tregon qe eshte
thirje funksioni dhe jo variabel.
Mr. Fisnik Dalipi

Per funksionet qe afishojne mesazhe normalisht ska
nevoje per tip kthimi. Per shembull:

#include <iostream.h>

void hello (void)

{
cout << “Tung nga Interneti!";




}
int main ()
{

hello ();

return 0;

}
Mr. Fisnik Dalipi
Funksionet – sipas references




Deri tani, parametrat i kalohen fuksionit me vlere. Kjo dmth se
kur therasim nje funksion me parametra I kemi kaluar funksionit
vetem vlerat e variablave dhe jo vete variablat. Per shembull:
int x=5, y=3, z;
z = shuma ( x , y );
Ne kete rast thiret funksioni duke i kaluar vlerat x dhe y, dmth
5 dhe 3 dhe jo vete variablat.
Ne kete menyre kur funksioni shuma thirret vlerat e
variablave te tij a dhe b behen 5 dhe 3 por cdo modifikim i a
apo b brenda funksionit shuma nuk do te kene efekt te x dhe
y jashte tij, sepse variablat x dhe y kaluan thjesht vlerat e tyre
perkatese
Mr. Fisnik Dalipi
Funksionet - kalimi me reference

Por mund te lind
nevoja te
manipulojme brenda
funksionit vlera te
variablave external
(jashtem). Per keto
raste perdoren
argumentet qe
kalojne me
reference, si vijon:
1.
// kalimi me reference
2.
#include <iostream >
3.
void dubliko (int& a, int& b, int& c)
4.
{
a*=2; b*=2; c*=2;
5.
6.
}
7.
int main ()
8.
{
int x=1, y=3, z=7;
9.
10.
11.
dubliko (x, y, z);
cout << "x=" << x << ", y=" << y << ", z=" << z;
return 0;
12.
13.
}
Dalja: x=2, y=6, z=14
Mr. Fisnik Dalipi
Funksionet - kalimi me reference


Nese verejme deklarimin e funksionit dubliko tipi i
cdo argumenti ndiqet nga nje ampersand (&), qe
tregon se variabli do te kalohet me reference dhe
jo me vlere si zakonisht.
Kur i kalon parametrat me reference, po kalojme
vete variablin dhe cdo modifikim qe bejme brenda
funksionit per parametrat, do te kene efekt jashte
tij.
Mr. Fisnik Dalipi
Funksionet - kalimi me reference




Nese e deklaronim funksionin si:
void dubliko (int a, int b, int c)
do te kalonin vetem vlerat dhe variablat nuk do te
ishin te modifikuar ne main
Ky tip deklarimi "me reference" duke perdorur (&)
perdoret vetem te C++. Ne C perdoren pointerat
per te bere dicka ekuvalente
Mr. Fisnik Dalipi
1.
Shembull:
12.
2.
// me shume se nje vlere kthimi
13.
3.
#include <iostream.h>
14.
4.
void prevnext (int x, int& prev, int& next)
5.
{
8.
9.
return 0;
}
Dalja :Previous=99, Next=101
prev = x-1; next = x+1;
6.
7.
cout << "Previous=" << y << ", Next=" << z;
}
int main ()
{
10.
int x=100, y, z;
11.
prevnext (x, y, z);
Mr. Fisnik Dalipi
Vlerat default te argumenteve
Kur deklarojme nje funksion
mund tu japim vlera default
(paradefinuar) argumentave
te tij. Kjo vlere do te perdoret
nese parameteri eshte bosh
ne te majte kur thiret
funksioni. Per te bere kete
thjesht i jep nje vlere
argumentave te deklarimi i
funksioneve. Nese vlera per
nje parameter nuk kalohet kur
funksioni thiret perdoret vlera
defoult, por nese vlera
specifikohet atehere vlera
default nuk meret parasysh:
1.
// vlera default (e paradefinuar)
2.
#include <iostream.h>
3.
int divide (int a, int b=2)
4.
{
int r; r=a/b;
5.
6.
return (r);
7.
}
8.
int main ()
9.
{
10.
cout << divide (12);
11.
cout << endl;
12.
cout << divide (20,4);
13.
return 0;
14.
}
Mr. Fisnik Dalipi
Rezultati:
6
5

Vlerat default te argumenteve






Si shihet ka dy thirje te funksionit divide. E para:
divide (12)
kemi specifikuar vetem nje argument , por funksioni
kerkon dy. Keshtu divide mer si vlere 2 per
parametrin e dyte . Rezultati i kesaj thirrje te
funksionit eshte 6 nga (12/2).
Ne thirrjen e dyte:
divide (20,4)
dhe rezultati eshte 5 nga (20/4).
Mr. Fisnik Dalipi
Funksionet Overloaded

Dy funksone te ndryshem mund te kene te njejtin
emer nese prototipet e argumentave te tyre jane
te ndryshem, kjo dmth qe mund tu japim te njejtin
emer disa funksioneve nese ata kane ose numer te
ndryshem argumentash ose tipe te ndryshem
argumentash. Per shembull:
Mr. Fisnik Dalipi
Funksionet overloaded
1.
// funksione overloaded
11.
int main ()
2.
#include <iostream.h>
12.
{
3.
int divide (int a, int b)
13.
4.
{
14.
float n=5.0,m=2.0;
15.
cout << divide (x,y);
return (a/b);
5.
6.
7.
8.
}
float divide (float a, float b)
{
return (a/b);
9.
10.
16.
}
17.
int x=5,y=2;
cout << "\n";
cout << divide (n,m);
18.
cout << "\n";
19.
return 0;
20.
}
Mr. Fisnik Dalipi
Rezultati:
2
2.5
Funksionet overloaded


Ne kete rast ne kemi percaktuar dy funksione me me te
njejtin emer, por njeri pret argumenta te tipit int dhe tjetri
te tipit float. Kompilatori e di cilin te theras ne cdo rast
duke ekzaminuar tipet, kur funksioni thirret. Nese thirret
me dy ints si argument therret funksionin qe ka dy int ne
prototip , nese thirret me dy float therret funksionin tjeter.
Per thjeshtesi, kemi shkruar te njejtin kod ne trupin e
funksioneve. Mund te ndertojme dy funksione me te njejtin
emer por me sjellje komplet te ndryshme.
Mr. Fisnik Dalipi
Rekursiviteti



Rekursiviti eshte procesi, kur nje funksion therret
vetveten . Per shembull:
n! = n * (n-1) * (n-2) * (n-3) ... * 1
E ilustrojme rekursivitetin me nje shembull si vijon:
Mr. Fisnik Dalipi
Rekursiviteti - shembull
1.
// factorial calculator
9.
int main ()
2.
#include <iostream.h>
10.
{
3.
long faktoriel (long a)
11.
long i;
12.
cout << “Jep nje numer: ";
13.
cin >> i;
4.
{
if (a > 1)
5.
6.
return (a * faktoriel (a-1));
else
7.
return (1);
8.
}
14.
15.
16.
cout << i<< "!" << " = " << faktoriel (i);
return 0;
}
Mr. Fisnik Dalipi
Jep nje numer:9
9!=362880
Prototipi i funksioneve


Deri tani, keni percaktuar funksionet perpara shfaqjes se pare
te thirjes per to, qe zakonisht ishte ne main, duke lene
funksionin main ne fund. Nese perserisim shembujt duke
vendosur funksionin main para funksioneve te tjera, do te
shihnim nje gabim. Arsyeja eshte se per te qene e mundur
thirrja e nje funksioni, duhet te deklarohet paraprakisht ky si
funksion
Por ka nje alternative per te shmangur shkrimin e te gjithe
funksioneve para main. Kjo realizohet me ane te prototipit. Qe
dmth te besh nje deklarim paraprak per funksionin.
Kompilatori duhet te dije argumentat dhe tipin e kthimit.
Mr. Fisnik Dalipi
Prototipi i funksioneve







Sintaksa eshte:
type name ( argument_type1, argument_type2, ...);
Eshte identik me rrjeshtin e pare te deklarimit te funksionit
pervec :
Nuk permban {}
Nuk ka ne fund (;).
Te argumentat eshte e mjaftueshme te shtypen tipet e tyre.
Per shembull:
Mr. Fisnik Dalipi
1.
// prototipet
16.
2.
#include <iostream.h>
17.
3.
void tek (int a);
18.
4.
void cift (int a);
5.
6.
7.
8.
int main ()
{
int i;
do {
19.
20.
21.
22.
23.
9.
cout << “Jepe numrin(0 per dalje):";
10.
cin >> i;
24.
11.
tek (i);
25.
12.
}
26.
13.
while (i!=0);
14.
return 0;
15.
}
27.
void tek (int a)
{
if ((a%2)!=0)
cout << “Numri eshte tek.\n";
else cift (a);
}
void cift (int a)
{
if ((a%2)==0)
cout << “Numri eshte cift.\n";
else tek (a);
}
Jepe nje numer(0 per dalje):9
Numri eshte tek.
Jepe nje numer(0 per dalje):112
Numri eshte cift.
Prototipi i funksioneve





Ky shembull eshte ndertuar ne menyren me te gjate per te
shpjeguar prototipet.
Prototipet e funksioneve jane:
void tek (int a);
void cift (int a);
qe mundeson qe funksionet te perdoren para se te
deklarohen plotesisht, per shembull ne main.
Shume programues rekomandojne qe per cdo funksion
duhet te shkruajme prototipin. Egzistenca e tyre ne te
njejtin vend lehteson pune gjate programimit dhe
gjithashtu lehteson procesin e krijimit te ‘header file’.
Mr. Fisnik Dalipi
PYETJE?