Sari la conținut
LECȚIA 9.2 · INFORMATICĂ

Cuvintele dintr-un text: numărare și transformări

Prelucrarea textelor cu spații: numărarea cuvintelor, inițiale și capitalizare.

Conținut verificat

Citirea unui text cu spații

Citirea unei linii intregi
#include <iostream>
using namespace std;

int main() {
    char s[256];
    cin.getline(s, 256);
    cout << s;
    return 0;
}

Atenție: Citirea obisnuita se opreste la primul spatiu. Pentru o linie intreaga se foloseste getline in C++, fgets in C, readln in Pascal si input in Python.

se trimit programului la citire

Numărarea cuvintelor

Un cuvânt nou începe acolo unde caracterul curent NU e spațiu, iar cel dinainte E spațiu (sau suntem la început):

Numararea cuvintelor
#include <iostream>
using namespace std;

int main() {
    char s[256];
    cin.getline(s, 256);
    int nr = 0;
    for (int i = 0; s[i] != '\0'; i++)
        if (s[i] != ' ' && (i == 0 || s[i - 1] == ' '))
            nr++;
    cout << nr;
    return 0;
}

Atenție: Un cuvant incepe acolo unde caracterul nu e spatiu dar cel dinainte era. Asa se numara corect si cand intre cuvinte sunt mai multe spatii.

se trimit programului la citire

Pentru "ana are mere" (cu două spații la mijloc): nr = 3 ✓: metoda e robustă la spații multiple.

Afișarea inițialelor

Aceeași condiție de "început de cuvânt":

Prima litera a fiecarui cuvant
#include <iostream>
using namespace std;

int main() {
    char s[256];
    cin.getline(s, 256);
    for (int i = 0; s[i] != '\0'; i++)
        if (s[i] != ' ' && (i == 0 || s[i - 1] == ' '))
            cout << s[i];
    return 0;
}
se trimit programului la citire

Pentru "limba si literatura romana": afișează lslr.

Prima literă mare la fiecare cuvânt (capitalizare)

Majuscula la inceput de cuvant
#include <iostream>
using namespace std;

int main() {
    char s[256];
    cin.getline(s, 256);
    for (int i = 0; s[i] != '\0'; i++)
        if (s[i] >= 'a' && s[i] <= 'z' && (i == 0 || s[i - 1] == ' '))
            s[i] = s[i] - 'a' + 'A';
    cout << s;
    return 0;
}

Atenție: Diferenta dintre codul unei minuscule si al majusculei corespunzatoare e 32. Pascal are upcase, Python are upper; in C si C++ se face prin scaderea lui a si adunarea lui A.

se trimit programului la citire

"ion popescu" devine "Ion Popescu". Conversia folosește aritmetica pe coduri: distanța 'a'-'A' e constantă (32).

Extragerea cuvintelor cu strtok (varianta din manuale)

Despartirea in cuvinte
#include <iostream>
#include <cstring>
using namespace std;

int main() {
    char s[256];
    cin.getline(s, 256);
    char *cuv = strtok(s, " ");
    while (cuv != 0) {
        cout << cuv << "\n";
        cuv = strtok(0, " ");
    }
    return 0;
}

Atenție: Python are split, care face totul dintr-o data. In C si C++ se foloseste strtok, iar in Pascal se taie repetat cu pos, copy si delete.

se trimit programului la citire

Primul apel primește șirul, următoarele primesc 0; strtok MODIFICĂ șirul original (pune '\0' în locul separatorilor).

Greșeli frecvente

  1. Numărarea spațiilor + 1 NU dă numărul de cuvinte când există spații consecutive sau la margini.
  2. strtok distruge șirul: fă o copie dacă îl mai folosești.
  3. Conversia la majusculă doar pentru litere mici: fără condiția a-z, strici cifrele și semnele.