a(b5)Prelucrarea unui text: III.2 (doar matematică-informatică)
Doar la matematică-informatică. Cum parcurgi un text pe caractere și pe cuvinte și cum alegi între un for și strtok. Cinci III.2 oficiale rezolvate, cu tot codul rulat și cu punctele din barem.
- 30 min
- La BAC: Subiectul al III-lea, 2 (10p)
- De revizuit

ții minte doar fișa asta și ești acoperit
Fișa de aur
- 01
Doar la matematică-informatică. III.2 a fost text în 9 din 15 lucrări MI numărate, 2024–2027.
- 02
III.2 = 10 p: variabilă pentru șir 1, citire 1, prelucrare 6, afișare 1, variabile simple și corectitudine globală 1.
- 03
Pe caractere: for(i=0;s[i]!=nul;i++). Pe cuvinte: p=strtok(s," "); while(p!=NULL) { ...; p=strtok(NULL," "); }
- 04
Două poziții vecine: condiția de oprire e s[i+1], nu s[i].
- 05
Dacă trebuie să modifici cuvintele în text, nu folosi strtok: el strică textul, pune caractere nule în locul spațiilor.
Truc: Modificare în memorie: mergi cu indici. Doar citești cuvintele: strtok.
Pe scurt
Culorile din lecție:cifră, datăidee-cheie
- Lecția e doar pentru matematică-informatică. La științele naturii, III.2 e cu tablou unidimensional.
- Textul se citește cu
cin.getline. - Cuvintele se separă cu
strtoksau se parcurg cu indici. - Baremul dă 6 din 10 puncte pe prelucrare, împărțite pe aspecte.
Două moduri de a parcurge
Gândește-te cum citești un text cu creionul în mână. Poți merge literă cu literă, dacă numeri sau compari vecini. Sau cuvânt cu cuvânt, dacă te interesează cuvintele.
Pe caractere:
for(i=0;s[i]!='\0';i++)
if(s[i]>='a' && s[i]<='z') nr++;
Pe cuvinte, cu strtok:
p=strtok(s," ");
while(p!=NULL)
{ cout<<strlen(p)<<" ";
p=strtok(NULL," ");
}
Oficial: strtok(s," ") returnează adresa primului cuvânt și pune caracterul nul după el. Apelat cu NULL, continuă de unde a rămas. Când nu mai sunt cuvinte, returnează NULL. Funcția modifică șirul.
Oficial: iunie 2026, varianta 3, III.2
Un cuvânt cu cel puțin două și cel mult 100 de litere mici. Se afișează alterneaza dacă nu există două vocale sau două consoane pe poziții consecutive, altfel nu alterneaza.
Idee: două litere vecine sunt „la fel” dacă sunt amândouă vocale sau amândouă consoane. Lucrezi cu două valori, 0 sau 1.
#include <iostream>
#include <cstring>
using namespace std;
int main()
{ char s[101];
int i,ok=1,v1,v2;
cin>>s;
for(i=0;s[i+1]!='\0';i++)
{ v1=strchr("aeiou",s[i])!=NULL;
v2=strchr("aeiou",s[i+1])!=NULL;
if(v1==v2) ok=0;
}
if(ok==1) cout<<"alterneaza";
else cout<<"nu alterneaza";
return 0;
}
imunopolizaharide și pas dau alterneaza, iar aer dă nu alterneaza.
Barem (10 p)Puncte
| Barem (10 p) | Puncte |
|---|---|
| variabilă pentru șir | 1 |
| date citite | 1 |
| proprietate verificată: câte 1 p pentru algoritmul de verificare, identificarea unei vocale sau consoane, accesul la caractere consecutive, pereche de vocale, pereche de consoane, caractere suport | 6 |
| mesaj afișat | 1 |
| variabile simple, corectitudine globală | 1 |
Cum verifici dacă un caracter c e vocală?
Oficial: iulie 2024, varianta 3, III.2
Un text de cel mult 100 de caractere, cu cel puțin două cuvinte, separate prin câte un spațiu. Se afișează DA n dacă toate cuvintele au câte n litere, altfel NU.
#include <iostream>
#include <cstring>
using namespace std;
int main()
{ char s[101],*p;
int n,ok=1;
cin.getline(s,101);
p=strtok(s," ");
n=strlen(p);
while(p!=NULL)
{ if((int)strlen(p)!=n) ok=0;
p=strtok(NULL," ");
}
if(ok==1) cout<<"DA "<<n;
else cout<<"NU";
return 0;
}
Ana are cel mai bun mar dă DA 3, iar Ana are cel mai dulce mar dă NU.
Barem: cele 6 p de la verificare sunt câte 2 p pentru algoritmul principial corect de verificare, determinarea lungimii unui cuvânt și cuvintele suport verificate.
Oficial: model 2027, III.2
Un text de cel mult 200 de caractere: cuvinte separate prin câte un spațiu, cu litere mici, cifre și paranteze dintre (, ), [, ], {, }. Se afișează câte cuvinte conțin și paranteze, și litere, în număr egal.
#include <iostream>
#include <cstring>
using namespace std;
int main()
{ char s[201],*p;
int i,lit,par,nr=0;
cin.getline(s,201);
p=strtok(s," ");
while(p!=NULL)
{ lit=0; par=0;
for(i=0;p[i]!='\0';i++)
if(p[i]>='a' && p[i]<='z') lit++;
else if(strchr("()[]{}",p[i])!=NULL) par++;
if(lit==par && lit>0) nr++;
p=strtok(NULL," ");
}
cout<<nr;
return 0;
}
Pentru a(b5) xyz [x1]y2 (x) {a6bc} 27 pq {ba}a):
xyz[x1]y2(x){a6bc}27pq{ba}a)| Cuvânt | Litere | Paranteze | Se numără? |
|---|---|---|---|
a(b5) | 2 | 2 | da |
xyz | 3 | 0 | nu |
[x1]y2 | 2 | 2 | da |
(x) | 1 | 2 | nu |
{a6bc} | 3 | 2 | nu |
27 | 0 | 0 | nu, nu are nici litere, nici paranteze |
pq | 2 | 0 | nu |
{ba}a) | 3 | 3 | da |
Se afișează 3. Condiția lit>0 e importantă: fără ea, 27 s-ar număra.
Barem: declarare 1 p, citire 1 p, determinare 6 p, afișare 1 p, variabile simple și corectitudine globală 1 p. La o rezolvare parțială: câte 1 p pentru numărare cu inițializare și actualizare, identificarea unei litere sau a unui tip de paranteze, literele sau parantezele numărate într-un cuvânt, cuvintele suport numărate.
Oficial: iunie 2025, varianta 1, III.2
Un text de cel mult 200 de caractere: litere mici, cuvinte separate prin câte un spațiu. Fiecare cuvânt cu număr par de litere se înlocuiește: primele k litere își schimbă locul cu ultimele k. Se afișează textul, sau nu exista, dacă toate cuvintele au număr impar de litere.
Aici nu folosesc strtok, pentru că la final afișez tot textul, cu spațiile lui. Lucrez cu indici: i e începutul cuvântului, j e capătul lui.
#include <iostream>
#include <cstring>
using namespace std;
int main()
{ char s[201],aux;
int i,j,k,n,gasit=0;
cin.getline(s,201);
i=0;
while(s[i]!='\0')
{ j=i;
while(s[j]!=' ' && s[j]!='\0') j++;
n=j-i;
if(n%2==0)
{ gasit=1;
for(k=0;k<n/2;k++)
{ aux=s[i+k];
s[i+k]=s[i+k+n/2];
s[i+k+n/2]=aux;
}
}
if(s[j]==' ') i=j+1;
else i=j;
}
if(gasit==1) cout<<s;
else cout<<"nu exista";
return 0;
}
am facut fotografii unei flori mari devine ma facut rafiifotog eiun flori rima.
Barem: câte 1 p pentru identificarea unui cuvânt cu număr par sau impar de litere, caracterele din prima jumătate, caracterele din a doua jumătate, cuvintele înlocuite sau păstrate, transformarea în memorie, cazul nu exista.
De ce nu merge strtok la cuvântul semioglindit?
Câte locuri declari pentru un text de cel mult 200 de caractere?
Oficial: august 2026, varianta 1, III.2
Text de cel mult 200 de caractere: perechi denumire de floare (litere mici) și număr de ore din [1,9], fiecare urmată de un spațiu. Se afișează floarea cu cel mai mic necesar; la egalitate, prima în ordine alfabetică.
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
int main()
{ char s[201],*p,nume[21],best[21];
int ore,minim=10;
cin.getline(s,201);
p=strtok(s," ");
while(p!=NULL)
{ strcpy(nume,p);
p=strtok(NULL," ");
ore=atoi(p);
if(ore<minim || (ore==minim && strcmp(nume,best)<0))
{ minim=ore;
strcpy(best,nume);
}
p=strtok(NULL," ");
}
cout<<best;
return 0;
}
Pentru lavanda 7 impatiens 3 iris 5 dalie 6 begonie 3 petunie 7 se afișează begonie: impatiens și begonie au câte 3 ore, iar begonie e prima în ordine alfabetică. minim=10 e o valoare mai mare decât orice număr posibil, deci prima floare intră sigur.
Barem: câte 1 p pentru identificarea denumirii, a numărului de ore, algoritmul de minim, termenii comparați, corelarea între denumire și minim, tratarea cazului cu mai multe flori.
Ce se cere la BAC
Cum arată III.2 cu text, în lucrările citate:
TipLucrări
| Tip | Lucrări |
|---|---|
| verifică o proprietate pe tot textul | iunie 2026, iulie 2024 |
| numără cuvinte cu o proprietate | model 2027 |
| transformă textul în memorie | iunie 2025 |
| alege un cuvânt după un criteriu | august 2026 |
Greșeli care costă puncte
- Citești cu
cin>>sun text cu spații. - Nu tratezi cazul fără soluție, de exemplu
nu exista. - Folosești
strtokcând ai nevoie de textul întreg la final. - Condiția de vecini
s[i]!='\0', cus[i+1]în corp: lasă la sfârșit o comparație cu caracterul nul. - Fără
strcpypentru cel mai bun cuvânt:best=pnu copiază conținutul. - Uiți
<cstring>în lista de biblioteci.
Termeni-cheie
- Text
- Șir de caractere cu spații, citit cu cin.getline. Cuvintele sunt separate prin spații.
- strtok
- Împarte un șir în bucăți după separatori. Prima oară primește șirul, apoi NULL. Modifică șirul.
- Literă mică
- Caracter c cu c>='a' && c<='z'.
- Vocală
- În lucrări: a, e, i, o, u, dacă enunțul nu spune altfel. Test: strchr("aeiou",c)!=NULL.
- Ordine alfabetică (lexicografică)
- Ordinea dată de strcmp: strcmp(a,b)<0 înseamnă că a e înaintea lui b.