Salutare prieteni si bine v-am regasit, astazi vom discuta despre vectorii de cuvinte deoarece am observat faptul ca incep sa apara din ce in ce mai multe probleme de genu in variantele pentru Bacalaureat.
Atentie: Nu exista termenul “matrice de cuvinte” – este destul de des intalnit. Varianta corecta este “vector de cuvinte“.
Ce este un vector de cuvinte?
In caz ca nu stiti ce este un vector, va recomand mai intai sa urmariti tutorialul nostru Tablouri unidimensionale (vectori) . Un vector de cuvinte este practic un vector normal, numai ca in loc de numere, stocam cuvinte. Fiecare cuvant poate fi accesat individual folosind indici, iar fiecare cuvant are un predecesor si un succesor (bine-nteles cu exceptia primului si ultimului cuvant).
Cum declar un vector de cuvinte?
Pentru a folosii un vector de cuvinte trebuie sa cunoastem doua variabile importante:
- numarul total de cuvinte
- lungimea maxima a unui cuvant
char vectorCuv[10][51];
In exemplul de mai sus am declarat un vector cuvinte care:
- stocheaza maxim 10 cuvinte (folosind indicii de la 0 la 9)
- retine cuvinte ce au maxim 50 de caractere (retineti faptul ca adaugam un caracter in plus pentru caracterul \0)
Plasarea cuvintelor in vector
Sa spunem ca vrem sa citim 5 cuvinte ce pot sa aiba maxim 10 caractere. Primul pas este sa declaram vectorul de cuvinte respectand regula de mai sus. Daca citim urmatoarele cuvinte (in aceasta ordine):
- caine, pisica, tutoriale, arici, apa
Vectorul nostru o sa arate in felul urmator in memorie:
Iar pentru a plasa cuvintele vom scrie urmatorul cod:
char vectorCuv[5][11]; for(int i = 0; i < 5; i++) { char cuvant[11]; cin >> cuvant; strcpy(vectorCuv[i], cuvant); } for(int i = 0; i < 5; i++) cout << "Cuvantul de pe pozitia " << i << " este: " << vectorCuv[i] << "\n";
Ordonarea cuvintelor in ordine lexicografica (alfabetic)
Se da urmatoarea problema: Se citeste un text de la tastatura de maximum 255 caractere format din cuvinte ce contine litere mici ale alfabetului englez, separate prin cate un spatiu. Sa se afiseze cuvintele care formeaza textul, ordonate lexicografic. (adica alfabetic)
Pentru a rezolva aceasta problema vom folosii un vector de cuvinte, si algoritmul clasic de sortare invatat la scoala.
int total = 0; char vectorCuv[5][11]; char text[255]; cin.getline(text, 255); char *cuv = strtok(text, " "); while(cuv != NULL) { strcpy(vectorCuv[total], cuv); total++; cuv = strtok(NULL, " "); } for(int i = 0; i < total; i++) { for(int j = i + 1; j < total; j++) { if(strcmp(vectorCuv[i], vectorCuv[j]) > 0) { char aux[11]; strcpy(aux, vectorCuv[i]); strcpy(vectorCuv[i], vectorCuv[j]); strcpy(vectorCuv[j], aux); } } } for(int i = 0; i < total; i++) cout << vectorCuv[i] << "\n";
Pentru a rezolva problema vom presupune ca un cuvant nu poate sa aiba mai mult de 10 caractere.
Incepem prin a citii toata linia in care este stocat textul nostru. Mai apoi spargem propozitia in cuvinte folosind functia strtok() si plasam cuvintele pe masura ce le gasim in vector.
Dupa ce am plasat toate cuvintele in vector, aplicam algoritmul de sortare invatat in liceu, iar pe urma afisam pe cate o linie noua cuvintele sortate.