Șiruri de caractere

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
Ilustrație: Prelucrarea unui text: III.2 (doar matematică-informatică)
Ilustrație generată pentru ZECE (artistică, nu o planșă științifică: pentru detalii exacte vezi schemele din lecție).

ții minte doar fișa asta și ești acoperit

Fișa de aur

  1. 01

    Doar la matematică-informatică. III.2 a fost text în 9 din 15 lucrări MI numărate, 2024–2027.

  2. 02

    III.2 = 10 p: variabilă pentru șir 1, citire 1, prelucrare 6, afișare 1, variabile simple și corectitudine globală 1.

  3. 03

    Pe caractere: for(i=0;s[i]!=nul;i++). Pe cuvinte: p=strtok(s," "); while(p!=NULL) { ...; p=strtok(NULL," "); }

  4. 04

    Două poziții vecine: condiția de oprire e s[i+1], nu s[i].

  5. 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.

1 din 9

Pe scurt

1 minesențialul, de recitit oricând

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 strtok sau se parcurg cu indici.
  • Baremul dă 6 din 10 puncte pe prelucrare, împărțite pe aspecte.

Două moduri de a parcurge

2 min

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

5 min o întrebare la final

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

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

3 min

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

6 min

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):

a(b5)
Litere
2
Paranteze
2
Se numără?
da
xyz
Litere
3
Paranteze
0
Se numără?
nu
[x1]y2
Litere
2
Paranteze
2
Se numără?
da
(x)
Litere
1
Paranteze
2
Se numără?
nu
{a6bc}
Litere
3
Paranteze
2
Se numără?
nu
27
Litere
0
Paranteze
0
Se numără?
nu, nu are nici litere, nici paranteze
pq
Litere
2
Paranteze
0
Se numără?
nu
{ba}a)
Litere
3
Paranteze
3
Se numără?
da
1 / 8

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

5 min 2 întrebări la final

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

4 min

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

2 mincum apare la examen

Cum arată III.2 cu text, în lucrările citate:

TipLucră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

2 mincapcanele de evitat

  • Citești cu cin>>s un text cu spații.
  • Nu tratezi cazul fără soluție, de exemplu nu exista.
  • Folosești strtok când ai nevoie de textul întreg la final.
  • Condiția de vecini s[i]!='\0', cu s[i+1] în corp: lasă la sfârșit o comparație cu caracterul nul.
  • Fără strcpy pentru cel mai bun cuvânt: best=p nu 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.

Notițele mele

Salvat local

Surse