Curs5, Functiile partea a doua
Am vorbit in continuare despre functii, subiect inceput inainte cu o saptamana.
Primul lucru asupra caruia ne-am oprit a fost parametri optionali, cu valoare implicita.
O functie poate avea oricati parametri optionali, cu conditia ca acestia sa fie plasati ca ordine dupa parametri obligatorii.
Functiile definite inainte cu o saptamana aveau toate parametri obligatorii, daca nu completam vreunul interpretorul semnala eroare inca de la lansarea fisierului .BGT.
Pentru a defini un parametru optional cu valoare implicita, trebuie ca la scrierea variabilei locale dintre parantezele rotunde sa scriem in completare dupa nume = valoare (semnul egal si o valoare de tipul variabilei).
Sa presupunem ca avem nevoie de numere aleatorii intre o valoare minima specificata de noi si una maxima care in majoritatea cazurilor sa fie un milion.
Pentru a ne fi putin usurata munca, definim o functie random2() care sa aiba al doilea parametru optional, adica nefiind completat sa fie considerata valoarea 1000000:
Cod: Selectaţi tot
int random2(int nrmin, int nrmax=1000000)
{
return random(nrmin, nrmax);
}
Cod: Selectaţi tot
void main()
{
int aleatoriu;
aleatoriu=random2(7, 15);
alert("Salut!", "Un numar intre 7 si 15 este "+aleatoriu+".");
aleatoriu=random2(7);
alert("Salut!", "Un numar intre 7 si un milion este "+aleatoriu+".");
exit();
}
Un al doilea lucru prezentat in cadrul intalnirii trecute a fost despre parametri cu transfer prin referinta.
Poate nu suntem tentati sa folosim foarte des o astfel de facilitate, dar sunt cazuri in care avem nevoie.
Am vazut inainte cu o intalnire ca schimbam o variabila atribuindu-i valoare returnata de o functie.
Tot asa putem schimba valoarea unei variabile scris ca parametru al unei functii definite.
O functie poate returna o singura valoare, dar avand posibilitatea modificarii valorii prin referinta, teoretic putem schimba oricate variabile.
Sa presupunem prin absurd ca avem nevoie de o functie care sa adune la o valoare tot timpul 2:
Cod: Selectaţi tot
void adunarecu2(int &out nr)
{
nr+=2;
}
Utilizam in scriptul de mai jos functia creata: adunarecu2():
Cod: Selectaţi tot
void main()
{
int x=10;
alert("Salut!", "Valoarea lui x este "+x+".");
adunarecu2(x);
alert("Salut!", "Valoarea lui x este acum "+x+".");
exit();
}
Codul este comentat:
Cod: Selectaţi tot
// Definim doua variabile globale:
int x=5, y=7;
void main()
{
// Aratam intai valoarea celor doua variabile:
alert("Salut!", "Valoarea lui x este "+x+", iar valoarea lui y este "+y+".");
// Aplicam functia de inversare, functie definita dupa inchiderea blocului main:
inversare_valori(x, y);
alert("Salut!", "Acum, dupa inversare, valoarea lui x este "+x+", iar valoarea lui y este "+y+".");
exit();
}
void inversare_valori(int &out nr1, int &out nr2)
{
// Atribuim lui temp1 valoarea primului parametru sa o tinem minte:
int temp1=nr1;
// Atribuim lui temp2 valoarea celui de-al doilea parametru sa o tinem minte:
int temp2=nr2;
// Atribuim lui nr1 valoarea lui temp2:
nr1=temp2;
// Atribuim lui nr2 valoarea lui temp1:
nr2=temp1;
}
Un al treilea lucru despre care am vorbit doar teoretic este recursivitatea functiilor.
O functie este recursiva daca se poate chema pe ea insasi, formand o ciclicitate.
In BGT / C++ exista aceasta posibilitate, de a se tot chema o functie pe ea pana o conditie este indeplinita. Nu insistam cu exemple deoarece inca nu am invatat if-ul, astfel incat ne este greu sa decidem cand sa se incheie bucla, repetarea functiei.
Dintre cele trei probleme despre care am vorbit in aceasta intalnire, cea in legatura cu parametrii impliciti / optionali este cea mai importanta, celelalte doua putand fi exersate si intelese si mai tarziu.
Ca tema de casa propun:
1. Sa se creeze o functie numita alert2() cu doi parametri. Aceasta functie sa poata afisa implicit ca titlu al ferestrei cu buton Ok string-ul "La revedere!", iar corpul sa fie obligatoriu de scris.
Codul urmator ar trebui sa functioneze nemodificat daca functia alert2() este creata corect:
Cod: Selectaţi tot
void main()
{
alert2("Salut!", "Bine ai venit, speram sa iti placa jocul nostru!");
alert2("Te mai asteptam sa incerci acest joc!");
exit();
}
2. Sa se creeze o functie random2() care sa aiba implicit ca numar minim numarul 0, astfel incat daca scriem doar un parametru valoarea returnata sa fie intre 0 si valoarea acestuia.
Codul urmator trebuie sa returneze un numar intre 0 si 5 daca functia random2() este creata corect:
Cod: Selectaţi tot
void main()
{
int aleatoriu=random2(5);
alert("Salut!", "Un numar aleatoriu intre 0 si 5 inclusiv este "+aleatoriu+".");
exit();
}
Imprimarea acestei intalniri este la link-ul urmator:
Download Fisier MP3 05._Curs_BGT_-_Functiile_Partea2.mp3 (43,5 MB)