Marti, 15 mai 2012 ne-am intalnit pentru a opta oara in cadrul cursului de BGT si am vorbit despre Array-urile cu o singura dimensiune.
Un array poate fi considerat un set de variabile de acelasi tip si cu acelasi nume, referirea la una dintre ele facandu-se printr-un index, un numar de ordine.
Avem de foarte multe ori nevoie de mai multe variabile care sa aiba valori diferite, dar de acelasi tip. Sa zicem ca vrem 5 variabile care sa contina 5 prenume diferite.
Desigur ca am putea sa cream separat cele 5 variabile in felul urmator:
string prenume1="Ion", prenume2="Gheorghe", prenume3="Cristian", prenume4="Vasile", prenume5="Nicolae";
Vom vedea ca declarand separat variabilele duce la ineficienta cand lucram apoi in cod cu ele.
Pentru a declara un array, trebuie sa punem dupa tip, lipit de acesta, paranteza dreapta deschisa si paranteza dreapta inchisa:
string[], int[], float[], double[] sau bool[].
Pentru exemplul de mai sus, cel cu prenumele, unde stim exact ce valori sunt continute, putem imediat dupa ce scriem numele array-ului, dupa un egal, sa scriem intre acolade, cu virgula intre ele, cele 5 valori intre ghilimele (acestea fiind string-uri).
Asadar, cream un array cu 5 variabile, un array de tip string numit prenume:
string[] prenume={"Ion", "Gheorghe", "Cristian", "Vasile", "Nicolae"};
Din acest moment avem array-ul prenume cu o marime de 5.
Pentru a ne referi la una dintre variabilele acestui array, punem intre paranteze drepte, lipit de nume, numarul de ordine.
Numarul de ordine, indexul array-ului este 0 based, asadar "Ion" este la indexul 0, iar "Nicolae" este la indexul 4.
De exemplu, pentru a afisa intr-un alert "Ion" la titlul ferestrei si "Vasile" in corpul acesteia, scriem:
alert(prenume[0], prenume[3]);
Sa presupunem ca acum am avea nevoie ca JAWS sa ne spuna cele 5 prenume.
Daca nu am avea array-uri si am fi creat 5 variabile diferite: prenume1, prenume2, prenume3, prenume4, prenume5, ar trebui sa scriem 5 randuri diferite in care am repeta aceeasi functie: screen_reader_speak_interrupt():
screen_reader_speak_interrupt(1, prenume1);
wait(2000);
screen_reader_speak_interrupt(1, prenume2);
wait(2000);
screen_reader_speak_interrupt(1, prenume3);
wait(2000);
screen_reader_speak_interrupt(1, prenume4);
wait(2000);
screen_reader_speak_interrupt(1, prenume5);
wait(2000);
Trebuie sa punem si un wait(2000), o asteptare de doua secunde, altfel nu am auzi decat "Nicolae", celelalte anunturi fiind intrerupte, astfel pana la urma am ajuns la 10 randuri.
Cine stie sa utilizeze bucla for, poate foarte usor sa faca intr-un cod scurt ca cele 5 prenume sa fie spuse de JAWS din array:
for(int x=0, x<5, x++)
{
screen_reader_speak_interrupt(1, prenume[x]);
wait(2000);
}
Blocul de cod se repeta de 5 ori, x crescand cu cate 1, fapt care ne face posibila referirea pe rand la toate variabilele array-ului prenume.
In primul mod de verbalizare a celor 5 nume avem nevoie de 10 randuri pentru vorbirea propriu-zisa a tuturor prenumelor, in cel de-al doilea mod avem doar doua randuri, plus for-ul.
Daca am vrea sa auzim si un beep inaintea fiecarui nume, automat ar trebui la primul mod sa punem de 5 ori aceeasi functie, pe cand cu for-ul si array punem in plus doar un rand ca prima instructiune in blocul de cod al for-ului.
Mai putem defini array-uri fara sa le incarcam direct cu valori, doar specificand tipul, numele si intre paranteze rotunde numarul de variabile care sa fie continute, urmand ca la runtime sa fie modificate dupa caz valorile acestora.
De exemplu pentru a crea un array numit numere cu 10 variabile de tip int, scriem:
int[] numere(10);
Din acest moment, putem sa ne referim la oricare dintre cele 10 variabile scriind:
numere[0] - pentru prima,
numere[1] - pentru a doua,
...
numere[9] - pentru a zecea etc.
Daca am vrea sa facem ca la indexul 0 al array-ului numere sa fie valoarea 17, atribuim valoarea precum la o simpla variabila, scriind:
numere[0]=17;
Daca vrem ca a zecea variabila a array-ului sa aiba valoarea 1001, scriem:
numere[9]=1001;
Daca vrem ca toate cele 10 variabile sa aiba valoarea 5, nu scriem 10 randuri in care sa spunem:
numere[0]=5;
numere[1]=5,
...
numere[9]=5;
ar fi enervant si ineficient.
Folosim for-ul:
for(int x=0; x<10; x++)
{
numere[x]=5;
}
Exista tot felul de metode pentru a redimensiona un array, pentru a-i adauga variabile, pentru a sorta valorile etc, dar ramane sa detaliem cand vom trece de cursul in care invatam clasele cu proprietatile si metodele lor.
Tot in cadrul acestei intalniri, a opta, am facut o mica aplicatie practica.
Am creat array-ul numere cu o dimensiune de 10, iar printre valorile acestui array plimbandu-ne ca pe un drum cu sagetile stanga - dreapta, auzim JAWS spunand "Mergi"sau "Sari".
Ne putem imagina deplasarea cu sagetile pe un drum care e neted unde valoarea variabilei este 0, si prag intr-un singur loc unde valoarea este 1.
Pentru aceasta am facut intai ca toate valorile sa fie 0, iar apoi am ales una dintre ele random sa fie 1.
Mai jos e tot codul comentat:
Cod: Selectaţi tot
void main()
{
// Cream o fereastra cu un titlu pentru asa-zisul joculet:
show_game_window("Drum de 10 pasi cu un singur prag");
// Punem o functie din BGT care face ca cu JAWS pornit sa fie utilizabile sagetile:
install_keyhook();
// Declaram array-ul numere de tip int cu o marime de 10:
int[] numere(10);
// Nivelam terenul facand ca toate cele 10 valori sa fie 0:
for(int x=0; x<10; x++)
{
numere[x]=0;
}
// Atribuim unei variabile int y o valoare random intre 0 si 9:
int y=random(0, 9);
// La index-ul y, deci la locul aleatoriu determinat mai sus, punem valoarea 1 pentru prag:
numere[y]=1;
// Cream o variabila int z care sa se schimbe la sageti, astfel incat sa ne plimbam pe drumulet:
int z=0;
// Cream while-ul principal care sa fie activ atata vreme cat nu apasam q:
while(!key_pressed(KEY_Q))
{
// daca se apasa sageata dreapta:
if(key_pressed(KEY_RIGHT))
{
// daca nu e mai mare de 9, z sa creasca cu cate 1:
if(z<9) z++;
// acum in functie de valoarea aflata la indexul z al array-ului, JAWS spune "Mergi" sau "Sari":
if(numere[z]==00) screen_reader_speak_interrupt(1, "Mergi");
else screen_reader_speak_interrupt(1, "Sari");
}
// Daca se apasa sageata stanga, deplasarea in sens invers:
if(key_pressed(KEY_LEFT))
{
// Daca z e mai mare decat 0 sa scada cu cate 1:
if(z>0) z--;
// Acum sa spuna din nou "Mergi" sau "Sari" in functie de ceea ce se gaseste pe locatie:
if(numere[z]==0) screen_reader_speak_interrupt(1, "Mergi");
else screen_reader_speak_interrupt(1, "Sari");
}
// Daca se apasa tasta F4 sa auzim locul pe care ne aflam:
if(key_pressed(KEY_F4))
{
screen_reader_speak_interrupt(1, ""+z);
}
wait(5); // asteptare de 5 milisecunde pentru procesor.
}
exit();
}
De observat ca am fost atenti ca valoarea lui z sa nu iasa din marimea array-ului, fapt care ar face sa apara o eroare "Runtime error, out of bounds", iar programul s-ar inchide fortat.
Un alt lucru de observat este ca daca la un if avem doar o singura instructiune, aceasta poate sta si fara acoladele care ar delimita blocul de cod aferent. Aceeasi regula e valabila si pentru while si for.
Avand in vedere ca am scris rezumatul destul de tarziu si pana marti, 22 mai, cand ne intalnim pentru a noua oara este putin timp, nu mai dau nici o tema.
Data viitoare continuam tot cu array-urile si vom vorbi despre cele bidimensionale si despre string-uri ca array.
Imprimarea intalnirii de marti 15 mai 2012,
Array-uri (partea 1), este la link-ul urmator:
Download Fisier MP3 08._Curs_BGT_-_Arrays-Partea1.mp3 (55,9 MB)