Ce vei învăța astăzi?
După această lecție vei avea harta completă a modulului: de la modelul conceptual liniar la dicționar, cu toate funcțiile și operațiile manuale, și vei rezolva probleme recapitulative în stil BAC.
Harta conceptuală a modulului
Definiție: Modulul 2 a construit, pas cu pas, următorul traseu: (1) șirul de caractere este un model liniar — caractere ordonate, cu poziții de la 0 și terminator '\0'; (2) declarare și citire (cin, cin.getline); (3) parcurgere și lungime (strlen); (4) copiere și concatenare (strcpy, strcat); (5) căutare (strchr, strstr); (6) comparare (strcmp); (7) conversii șir-cifră; (8) palindrom și separarea cuvintelor; (9) dicționarul — model asociativ cheie-valoare cu tablouri paralele.
Fiecare tehnică rămâne disponibilă și poate fi combinată cu celelalte: o singură problemă poate cere separarea cuvintelor, măsurarea lungimii și numărarea frecvențelor în același program.
Analogia: harta unui oraș
Tehnicile modulului sunt ca străzile unui oraș: fiecare duce la un rezultat precis (lungime, copiere, căutare, comparare). Harta întreagă îți arată că orice punct al prelucrării textului este accesibil, iar problemele complexe sunt doar drumuri care leagă mai multe străzi între ele.
strlen - cât de lung este șirul
strcpy, strcat - copiere, lipire
strchr, strstr - caracter, subșir
strcmp - ordinea lexicografică
Tabelul rezumativ al funcțiilor și operațiilor
Toate funcțiile din tabel fac parte din biblioteca <cstring>. Alături de ele, o serie de operații se implementează manual, prin parcurgerea cu for: palindromul, conversiile șir-număr, separarea cuvintelor și normalizarea textului.
| Operație | Funcție / tehnică | Exemplu | Lecția |
|---|---|---|---|
| Lungimea șirului | strlen(s) |
strlen("bac") = 3 |
Ora 3 |
| Copierea | strcpy(a, b) |
strcpy(d, s) |
Ora 4 |
| Concatenarea | strcat(a, b) |
strcat(d, s) |
Ora 4 |
| Căutarea unui caracter | strchr(s, c) |
strchr(s, 'a') |
Ora 5 |
| Căutarea unui subșir | strstr(s, sub) |
strstr(s, "bac") |
Ora 5 |
| Compararea | strcmp(a, b) |
strcmp(a, b) < 0 |
Ora 6 |
| Caracter-cifră în valoare | manual: s[i] - '0' |
'5' - '0' = 5 |
Ora 7 |
| Verificarea palindromului | manual: perechi s[i], s[n-1-i] |
capac → palindrom |
Ora 8 |
| Separarea cuvintelor | manual sau strtok |
strtok(text, " ") |
Ora 8 |
| Frecvența cuvintelor | dicționar cu tablouri paralele | cuvinte[i] + frecventa[i] |
Ora 9 |
Reține: funcțiile acoperă operațiile „de bibliotecă"; palindromul, conversiile și dicționarul se construiesc manual, iar această distincție apare frecvent la BAC.
Problemă recapitulativă: raportul cuvintelor
Combinăm totul într-o singură problemă: citim un text, separăm cuvintele, construim dicționarul de frecvențe, găsim cuvântul cel mai frecvent și afișăm raportul lui (frecvența împărțită la numărul total de cuvinte). Este modelul complet al unei analize statistice de text.
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char text[1001];
cin.getline(text, 1001);
char cuvinte[501][101];
int frecventa[501] = {0};
int n = 0;
int totalCuvinte = 0;
char *p = strtok(text, " ");
while (p != NULL)
{
totalCuvinte++;
int i;
for (i = 0; i < n; i++)
{
if (strcmp(cuvinte[i], p) == 0)
{
frecventa[i]++;
break;
}
}
if (i == n)
{
strcpy(cuvinte[n], p);
frecventa[n] = 1;
n++;
}
p = strtok(NULL, " ");
}
int pozMax = 0;
for (int i = 1; i < n; i++)
{
if (frecventa[i] > frecventa[pozMax])
{
pozMax = i;
}
}
double raport = (double)frecventa[pozMax] / totalCuvinte;
cout << cuvinte[pozMax] << " apare de "
<< frecventa[pozMax] << " ori din "
<< totalCuvinte << " cuvinte" << endl;
cout << "Raport de aparitie: " << raport << endl;
return 0;
}
Ce învățăm: conversia (double)frecventa[pozMax] înainte de împărțire produce un raport cu zecimale; altfel, împărțirea a două numere întregi ar da doar câtul.
Exercițiu de completare
Completează enunțul recapitulativ:
Lungimea unui șir se află cu ______, copierea cu ______, iar compararea cu ______. Palindromul se verifică comparând perechile ______, iar frecvența cuvintelor se reține în ______.
Bancă de cuvinte:
Exercițiu de completare a codului
Completează programul care verifică dacă un cuvânt este palindrom:
Bancă de cuvinte:
Test de înțelegere
Test recapitulativ - modulul 2:
1. Care pereche (funcție, operație) este corectă?
2. Cum se verifică palindromul?
3. Care este cheia dicționarului la frecvența literelor?
numar * 10 + cifra pentru conversie, cheie-valoare pentru frecvențe. Codul se reconstruiește din idei, iar la testul scris greșelile de „memorare" nu se iartă.Aprofundare
Cazuri particulare și detalii avansate:
- Funcție sau manual? Regula de aur: funcțiile
strlen,strcpy,strcat,strcmp,strchr,strstracoperă operațiile de bibliotecă; palindromul, conversiile și dicționarul se implementează manual. - Combinarea clasică la BAC: separare + lungime + maxim (cel mai lung cuvânt), palindrom + numărare (vocale), dicționar + raport (frecvențe), conversie + sumă (cifre).
- Eficiența parcurgerii: calculează
n = strlen(s)o singură dată, înaintea buclei; apelul funcției în condițiafordublează parcurgerea. - Textul cu diacritice: caracterele
ă,â,î,ș,țau coduri diferite de literele simple; restricțiile BAC folosesc de regulă alfabetul englez. - Verificarea pe cazuri-limită: text gol, un singur cuvânt, cuvânt de o literă, toate cuvintele identice — fiecare caz poate dezvălui o eroare de logică.
Recapitularea generală îți oferă panorama completă a modulului: orice problemă de text, oricât de complexă, se descompune în tehnicile învățate, iar ordinea pașilor (citește, separă, prelucrează, afișează) rămâne aceeași.
PbInfo - Cuvintele în ordine inversă
Enunț:
Cerință: Se citește un text format din cuvinte despărțite prin câte un spațiu. Să se afișeze cuvintele textului în ordine inversă, pe câte o linie.
Date de intrare:
Programul citește de la tastatură textul, pe o singură linie.
Date de ieșire:
Programul va afișa fiecare cuvânt în ordine inversă, pe câte o linie.
Restricții și precizări:
Textul are cel mult 1000 de caractere; cuvintele au cel mult 100 de litere.
Exemplu:
Intrare:
ana are mere
Ieșire:
mere are ana
Cum gândim soluția:
- Separăm cuvintele cu
strtokși le copiem într-un tablou bidimensional - Numărăm cuvintele pe măsură ce le citim
- Afișăm tabloul de la ultimul cuvânt către primul
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char text[1001];
cin.getline(text, 1001);
char cuvinte[501][101];
int n = 0;
char *p = strtok(text, " ");
while (p != NULL)
{
strcpy(cuvinte[n], p);
n++;
p = strtok(NULL, " ");
}
for (int i = n - 1; i >= 0; i--)
{
cout << cuvinte[i] << endl;
}
return 0;
}
Ce învățăm: reținem cuvintele într-un tablou bidimensional, apoi le afișăm parcurgând pozițiile de la n - 1 la 0.
PbInfo - Cuvântul cu aceeași literă la capete
Enunț:
Cerință: Se citește un text format din cuvinte despărțite prin câte un spațiu. Să se afișeze numărul de cuvinte care încep și se termină cu aceeași literă.
Date de intrare:
Programul citește de la tastatură textul, pe o singură linie.
Date de ieșire:
Programul va afișa numărul cerut.
Restricții și precizări:
Textul are cel mult 1000 de caractere; cuvintele au cel mult 100 de litere mici.
Exemplu:
Intrare:
ana are mere alune
Ieșire:
2
Cum gândim soluția:
- Separăm cuvintele cu
strtok - Pentru fiecare cuvânt, comparăm
p[0]cup[strlen(p) - 1] - Numărăm potrivirile și le afișăm
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char text[1001];
cin.getline(text, 1001);
int contor = 0;
char *p = strtok(text, " ");
while (p != NULL)
{
int n = strlen(p);
if (p[0] == p[n - 1])
{
contor++;
}
p = strtok(NULL, " ");
}
cout << contor << endl;
return 0;
}
Ce învățăm: pentru ana și alune capetele coincid (2 cuvinte); are și mere nu respectă condiția.
Exercițiul Practic: recapitularea modulului
Sarcini de lucru
Completează următoarele sarcini pentru a verifica întregul modul
Sarcina 1: Numărul de palindromuri
Cerință: Scrie un program C++ complet care citește un text de cuvinte și afișează numărul de cuvinte palindrom. Pentru intrarea capac ana mere se afișează 2.
Soluție pentru Sarcina 1:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char text[1001];
cin.getline(text, 1001);
int contor = 0;
char *p = strtok(text, " ");
while (p != NULL)
{
int n = strlen(p);
bool palindrom = true;
for (int i = 0; i < n / 2; i++)
{
if (p[i] != p[n - 1 - i])
{
palindrom = false;
}
}
if (palindrom)
{
contor++;
}
p = strtok(NULL, " ");
}
cout << contor << endl;
return 0;
}
Verifică: capac și ana sunt palindromuri; mere nu este, deci răspunsul este 2.
Sarcina 2: Cel mai lung palindrom
Cerință: Scrie un program C++ complet care citește un text de cuvinte și afișează cel mai lung cuvânt palindrom (la egalitate, primul întâlnit). Pentru intrarea ana capac ele se afișează capac.
Soluție pentru Sarcina 2:
#include <iostream>
#include <cstring>
using namespace std;
bool estePalindrom(char s[101])
{
int n = strlen(s);
for (int i = 0; i < n / 2; i++)
{
if (s[i] != s[n - 1 - i])
{
return false;
}
}
return true;
}
int main()
{
char text[1001];
cin.getline(text, 1001);
char celMaiLung[101] = "";
char *p = strtok(text, " ");
while (p != NULL)
{
if (estePalindrom(p) && strlen(p) > strlen(celMaiLung))
{
strcpy(celMaiLung, p);
}
p = strtok(NULL, " ");
}
cout << celMaiLung << endl;
return 0;
}
Verifică: palindromurile sunt ana (3), capac (5), ele (3); cel mai lung este capac. Funcția estePalindrom modularizează verificarea.