In primele doua videoclipuri am discutat despre sirurile de caractere, iar astazi vom lua pe rand 7 probleme clasice ce se intalnesc atunci cand lucram cu acest capitol si le vom rezolva impreuna.
Prima litera dintr-un cuvant | Siruri de caractere in C++
Incepem cu cea mai usoara problema: avem un sir de caractere “Ana se duce la piata” iar noi trebuie sa identificam prima litera din fiecare cuvant. Pentru a rezolva aceasta problema vom separa mai intai propozitia in cuvinte folosind functia strtok explicata in tutorialul precedent.
Dupa ce am separat fiecare cuvant din propozitie utilizam cuvant[0] pentru a afisa fiecare litera din primul cuvant.
#include <iostream> using namespace std; int main() { char propozitie[128] = "Ana se duce la piata"; char *cuvant = strtok(propozitie, " "); while(cuvant) { cout << cuvant << " -> prima litera: " << cuvant[0] << "\n"; cuvant = strtok(NULL, " "); } return 0; }
Ultima litera a unui cuvant | Siruri de caractere in C++
Urmatoarea problema este similara cu prima, doar ca de data aceasta trebuie sa afisam ultima litera. Tot ceea ce trebuie sa facem este sa schimbam cuvant[0] cu cuvant[strlen(cuvant) – 1] deoarece cu strlen(cuvant) obtinem lungimea totala a sirului, iar mai apoi scadem -1 deoarece numerotarea incepe de la 0, iar pentru a ajunge la ultima litera trebuie sa scadem 1.
#include <iostream> using namespace std; int main() { char propozitie[128] = "Ana se duce la piata"; char *cuvant = strtok(propozitie, " "); while(cuvant) { cout << cuvant << " -> prima litera: " << cuvant[ strlen(cuvant) - 1 ] << "\n"; cuvant = strtok(NULL, " "); } return 0; }
Numar de vocale dintr-un sir de caractere in C++
Vom presupune ca avem un text similar cu cel din problema precedenta: “Ana se duce la piata” pentru a numara numarul de vocale din acest text, vom face o functie auxiliara eVocala care va returna true / false in functie de caracterul trimis prin parametru.
#include <iostream> #include <cstring> using namespace std; bool eVocala(char c) { if(c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') return true; if(c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U') return true; return false; } int main() { char propozitie[128] = "Ana se duce la piata"; int lungime = strlen(propozitie); int vocale = 0; for(int i = 0; i < lungime; i++) { if(eVocala(propozitie[i])) { cout << "Vocala: " << propozitie[i] << "\n"; vocale = vocale + 1; } } cout << "Avem: " << vocale << " vocale in text."; return 0; }
Palindromul unui cuvant | Sir de caractere in C++
In cateva probleme de Bacalaureat ni se cere sa calculam palindromul unui cuvant. Pentru a face acest lucru vom lucra cu doua cuvinte “mere” si “cojoc”. Incepand de la cap vom construii rand pe rand fiecare litera.
Algoritmul arata in felul urmator:
#include <iostream> #include <cstring> using namespace std; int main() { char cuvant[10]; char palindrom[10]; cin >> cuvant; int lungime = strlen(cuvant); palindrom[lungime] = cuvant[lungime]; for(int i = 0; i < lungime; i++) { palindrom[lungime - 1 - i] = cuvant[i]; } cout << palindrom; return 0; }
Sufixul unui cuvant | Siruri de caractere in C++
Sa presupunem ca avem sufixul “aur” si propozitia “Am un dinozaur portocaliu care este centaur“, trebuie sa identificam cuvintele care il au drept sufix pe “aur” (adica acele cuvinte care se termina cu “aur”), mai precis: dinozaur si centaur. Pentru a face acest lucru vom cauta in ultimele litere ale unui cuvant folosind pointerii.
Daca v-ati uitat la primul videoclip din aceasta seria atunci probabil stiti despre ce este vorba. De exemplu, daca am un cuvant[10] = dinozaur si afisez cout << cuvant voi obtine dinozaur. In schimb, daca execut cout << cuvant + 1 voi obtine inozaur.
Asadar, rezolvarea este urmatoarea:
#include <iostream> #include <cstring> using namespace std; int main() { char sufix[10] = "aur"; char propozitie[100] = "Am un dinozaur portocaliu care este centaur"; int lungime_sufix = strlen(sufix); char *cuvant = strtok(propozitie, " "); while(cuvant) { int lungime_cuvant = strlen(cuvant); int pozitie = lungime_cuvant - lungime_sufix; if(pozitie > 0) { char sufix_cuvant[10] = ""; strcpy(sufix_cuvant, cuvant + pozitie); if(strcmp(sufix_cuvant, sufix) == 0) cout << cuvant << "\n"; } cuvant = strtok(NULL, " "); } return 0; }
Prefixul unui cuvant | Siruri de caractere in C++
Acum vom presupune ca avem prefixul “sar” iar propozitia este “Nu imi plac sarmalele si sardinele“, trebuie sa identificam cuvintele care il au drept prefix pe “sar” (adica acele cuvinte care incep cu “sar”), mai precis: sarmalele si sardinele. Pentru a face acest lucru vom folosii functia strncpy care copiaza primele n caractere ale unui cuvant.
Asadar, rezolvarea este urmatoarea:
#include <iostream> #include <cstring> using namespace std; int main() { char prefix[10] = "sar"; char propozitie[100] = "Nu imi plac sarmalele si sardinele"; int lungime_prefix = strlen(prefix); char *cuvant = strtok(propozitie, " "); while(cuvant) { char prefix_cuvant[10] = ""; strncpy(prefix_cuvant, cuvant, lungime_prefix); if(strcmp(prefix_cuvant, prefix) == 0) cout << cuvant << "\n"; cuvant = strtok(NULL, " "); } return 0; }
Numarul de aparitii al unui cuvant | Siruri de caractere in C++
Iar ultima dintre cele mai populare probleme este aceea in care trebuie sa numaram de cate ori apare un cuvant intr-o propozitie. De exemplu daca avem propozitia: “Azi este Soare si Mihai este milionar. Mihai se duce sa manance caracatita cu caramael” trebuie sa numaram de cate ori apare “Mihai” in propozitie.
Pentru a rezolva aceasta problema, vom sparge propozitia in cuvinte si vom numara de cate ori apare cuvantul cerut.
#include <iostream> #include <cstring> using namespace std; int main() { char cauta_cuvant[10] = "Mihai"; char propozitie[100] = "Azi este Soare si Mihai este milionar. Mihai se duce sa manance caracatita cu caramael"; int nr = 0; char *cuvant = strtok(propozitie, " "); while(cuvant) { if(strcmp(cuvant, cauta_cuvant) == 0) nr = nr + 1; cuvant = strtok(NULL, " "); } cout << cauta_cuvant << " a aparut de " << nr << " ori.\n"; return 0; }