Ce vei învăța astăzi?
După această lecție vei putea combina mai multe prelucrări de șiruri într-un singur program și vei rezolva aplicații integrate: găsirea celui mai lung cuvânt, curățarea unui text de spații multiple și extragerea cifrelor.
Ce este o aplicație integrată?
Definiție: O aplicație integrată este un program care combină mai multe prelucrări asupra acelorași date, într-o succesiune logică: citește textul, îl separă în cuvinte, numără, transformă și afișează rezultatele. Fiecare pas folosește tehnicile învățate separat: parcurgerea, funcțiile din <cstring>, conversiile șir-număr.
De exemplu, un program care primește un eseu poate afișa simultan: numărul de cuvinte, cel mai lung cuvânt, numărul de cifre și suma lor. Toate aceste prelucrări folosesc aceeași parcurgere de bază, dar cu reguli diferite.
Analogia: linia de asamblare
O aplicație integrată seamănă cu o linie de asamblare dintr-o fabrică: materia primă (textul citit) trece prin mai multe stații (prelucrări), iar fiecare stație adaugă un rezultat. La final, toate rezultatele sunt adunate și livrate împreună.
Citirea textului (cin.getline)
Separarea în cuvinte după spații
Numărarea și măsurarea lungimilor
Afișarea tuturor rezultatelor
Cel mai lung cuvânt dintr-un text
Definiție: Un cuvânt dintr-un text este o secvență de litere delimitată de spații (sau de începutul/sfârșitul textului). Pentru a găsi cel mai lung cuvânt, parcurgem textul și reținem, pentru fiecare cuvânt, poziția de început și lungimea; comparăm fiecare lungime cu maximul curent și, când găsim un cuvânt mai lung, reținem și poziția lui de început, pentru a-l putea afișa.
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char s[1001];
cin.getline(s, 1001);
int n = strlen(s);
int inceput = 0;
int lungimeMax = 0;
int pozitieMax = 0;
int i = 0;
while (i <= n)
{
if (s[i] == ' ' || s[i] == '\0')
{
int lungime = i - inceput;
if (lungime > lungimeMax)
{
lungimeMax = lungime;
pozitieMax = inceput;
}
inceput = i + 1;
}
i++;
}
cout << "Cuvantul cel mai lung are " << lungimeMax
<< " litere: ";
for (int j = pozitieMax; j < pozitieMax + lungimeMax; j++)
{
cout << s[j];
}
cout << endl;
return 0;
}
Ce învățăm: testarea terminatorului '\0' (prin condiția i <= n) este obligatorie pentru a procesa ultimul cuvânt, care nu are spațiu după el. Reținerea poziției de început ne permite să afișăm cuvântul, nu doar lungimea.
Eliminarea spațiilor multiple
Definiție: Un text poate conține spații multiple între cuvinte (din cauza tastării sau a formatării). Normalizarea textului înseamnă construirea unui șir nou în care între cuvinte există exact un spațiu, fără spații la început sau la sfârșit. Construim șirul rezultat caracter cu caracter, într-un tablou separat.
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char s[1001], rezultat[1001];
cin.getline(s, 1001);
int n = strlen(s);
int k = 0;
for (int i = 0; i < n; i++)
{
if (s[i] != ' ')
{
rezultat[k] = s[i];
k++;
}
else if (k > 0 && rezultat[k - 1] != ' ')
{
rezultat[k] = ' ';
k++;
}
}
if (k > 0 && rezultat[k - 1] == ' ')
{
k--;
}
rezultat[k] = '\0';
cout << rezultat << endl;
return 0;
}
Ce învățăm: o literă se copiază întotdeauna; un spațiu se copiază doar dacă ultimul caracter deja scris nu este spațiu. La final eliminăm un eventual spațiu rămas la capăt și închidem șirul cu '\0'.
Cifrele dintr-un șir: numărare și sumă
Definiție: Un text poate amesteca litere și cifre (ex. "bac2026abc"). Prelucrarea cifrelor folosește conversia caracter-cifră: s[i] - '0' transformă caracterul '2' în valoarea numerică 2. Testul s[i] >= '0' && s[i] <= '9' verifică dacă un caracter este cifră, pentru că cifrele au coduri ASCII consecutive.
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char s[1001];
cin.getline(s, 1001);
int n = strlen(s);
int numarCifre = 0;
int suma = 0;
for (int i = 0; i < n; i++)
{
if (s[i] >= '0' && s[i] <= '9')
{
numarCifre++;
suma = suma + (s[i] - '0');
}
}
cout << "Numar de cifre: " << numarCifre << endl;
cout << "Suma cifrelor: " << suma << endl;
return 0;
}
Ce învățăm: prelucrarea cifrelor dintr-un șir combină parcurgerea (de la ora 3) cu conversia caracter-cifră (de la ora 7) — un exemplu clasic de aplicație integrată.
Exercițiu de completare
Completează enunțul despre aplicațiile integrate:
O aplicație integrată combină mai multe prelucrări: ______ textul în cuvinte după spații, aflăm ______ celui mai lung cuvânt și transformăm caracterele-cifră în valori numerice cu ______. La final, șirul rezultat se închide cu caracterul ______.
Bancă de cuvinte:
Exercițiu de completare a codului
Completează programul care calculează suma cifrelor dintr-un text:
Bancă de cuvinte:
Test de înțelegere
Test rapid - aplicații integrate:
1. Cum găsim cel mai lung cuvânt dintr-un text?
2. Cum transformăm caracterul '5' în valoarea numerică 5?
3. Ce face condiția i <= n la parcurgerea unui text?
s[i] == ' ' && s[i + 1] == ' ' iese din șir la ultima poziție; verifică mai întâi că i + 1 nu depășește lungimea, altfel citești memorie neinițializată.Aprofundare
Cazuri particulare și detalii avansate:
- Text cu spații consecutive: algoritmul cu
strtoktratează automat spațiile multiple; cel manual trebuie să evite cuvintele vide (de lungime 0), verificândlungime > 0înainte de comparație. - Spații la începutul sau la sfârșitul textului: la normalizare, primul caracter scris nu trebuie să fie spațiu (condiția
k > 0), iar spațiul final se elimină scăzândk. - Frază fără spații: dacă textul are un singur cuvânt, algoritmul îl procesează prin testul
s[i] == '\0', iar maximul devine chiar lungimea lui. - Cifrele nu sunt litere: la numărarea cuvintelor, un grup de cifre poate fi considerat cuvânt sau nu, în funcție de enunț; citește restricțiile cu atenție.
- Combinarea tuturor prelucrărilor: un singur
forpoate număra simultan cuvintele, cifrele și vocalele, actualizând mai mulți contori — eficiența unei aplicații integrate.
Aplicațiile integrate îți arată că șirurile de caractere nu se prelucrează cu o singură tehnică, ci cu un lanț de pași: fiecare pas transformă datele, iar la final programul afișează un rezultat complet, exact ca un raport de analiză a unui text.
PbInfo - Cifrele unui text
Enunț:
Cerință: Se citește un text format din litere mici și cifre, fără spații. Să se afișeze numărul de cifre din text și suma lor, fiecare pe câte o linie.
Date de intrare:
Programul citește de la tastatură textul s, pe o singură linie.
Date de ieșire:
Programul va afișa pe prima linie numărul de cifre, iar pe a doua linie suma lor.
Restricții și precizări:
Textul are cel mult 100 de caractere și conține doar litere mici și cifre.
Exemplu:
Intrare:
bac2026abc
Ieșire:
4 10
Cum gândim soluția:
- Citim textul cu
cin.getline - Parcurgem cu
forși testăm fiecare caracter cus[i] >= '0' && s[i] <= '9' - Numărăm cifrele și adunăm
s[i] - '0'pentru fiecare cifră - Afișăm cele două rezultate
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char s[101];
cin.getline(s, 101);
int numarCifre = 0;
int suma = 0;
for (int i = 0; i < strlen(s); i++)
{
if (s[i] >= '0' && s[i] <= '9')
{
numarCifre++;
suma = suma + (s[i] - '0');
}
}
cout << numarCifre << endl;
cout << suma << endl;
return 0;
}
Ce învățăm: pentru bac2026abc, cifrele sunt 2, 0, 2, 6: deci 4 cifre și suma 10. Testul de cifră și conversia s[i] - '0' lucrează împreună.
PbInfo - Spații normale
Enunț:
Cerință: Se citește un text care poate conține mai multe spații între cuvinte. Să se afișeze textul corectat, cu un singur spațiu între cuvinte și fără spații la început sau la sfârșit.
Date de intrare:
Programul citește de la tastatură textul, pe o singură linie.
Date de ieșire:
Programul va afișa textul normalizat, pe o singură linie.
Restricții și precizări:
Textul are cel mult 1000 de caractere și conține doar litere mici și spații.
Exemplu:
Intrare:
ana are mere
Ieșire:
ana are mere
Cum gândim soluția:
- Declarăm un șir
rezultatîn care construim textul corectat - Copiem literele întotdeauna; copiem un spațiu doar dacă ultimul caracter scris nu este spațiu
- Eliminăm spațiul final și adăugăm terminatorul
'\0' - Afișăm șirul rezultat
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char s[1001], rezultat[1001];
cin.getline(s, 1001);
int n = strlen(s);
int k = 0;
for (int i = 0; i < n; i++)
{
if (s[i] != ' ')
{
rezultat[k] = s[i];
k++;
}
else if (k > 0 && rezultat[k - 1] != ' ')
{
rezultat[k] = ' ';
k++;
}
}
if (k > 0 && rezultat[k - 1] == ' ')
{
k--;
}
rezultat[k] = '\0';
cout << rezultat << endl;
return 0;
}
Ce învățăm: construim un șir nou caracter cu caracter; regula „copiază un spațiu doar după un caracter diferit" elimină automat spațiile multiple.
Exercițiul Practic: aplicații integrate
Sarcini de lucru
Completează următoarele sarcini pentru a consolida prelucrarea integrată a textelor
Sarcina 1: Analiza unui text
Cerință: Scrie un program C++ complet care citește un text cu cuvinte despărțite prin câte un spațiu și afișează pe prima linie numărul de cuvinte, iar pe a doua linie cel mai lung cuvânt. Pentru intrarea ana are mere verzi se afișează 4 și verzi.
Soluție pentru Sarcina 1:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char text[1001];
cin.getline(text, 1001);
char *p = strtok(text, " ");
int cuvinte = 0;
char lung[101] = "";
while (p != NULL)
{
cuvinte++;
if (strlen(p) > strlen(lung))
{
strcpy(lung, p);
}
p = strtok(NULL, " ");
}
cout << cuvinte << endl;
cout << lung << endl;
return 0;
}
Verifică: textul are 4 cuvinte, iar cel mai lung este verzi (5 litere). Comparăm cu strlen și copiem cu strcpy.
Sarcina 2: Vocale și cifre
Cerință: Scrie un program C++ complet care citește un text fără spații și afișează pe prima linie numărul de vocale, iar pe a doua linie numărul de cifre. Pentru intrarea bac2026e se afișează 3 și 4.
Soluție pentru Sarcina 2:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char s[101];
cin.getline(s, 101);
int vocale = 0;
int cifre = 0;
for (int i = 0; i < strlen(s); i++)
{
if (s[i] == 'a' || s[i] == 'e' || s[i] == 'i' ||
s[i] == 'o' || s[i] == 'u')
{
vocale++;
}
if (s[i] >= '0' && s[i] <= '9')
{
cifre++;
}
}
cout << vocale << endl;
cout << cifre << endl;
return 0;
}
Verifică: bac2026e are vocalele a, a, e (3) și cifrele 2, 0, 2, 6 (4). Un singur for actualizează ambii contori.