Pe scurt
Parcurgerea unui șir permite testarea fiecărui caracter. În „Ana”, apar două litere „a” dacă ignorăm diferența dintre majuscule și minuscule, dar numai una dacă testăm exact caracterul mic 'a'. Regula de comparație trebuie precizată înainte de calcul.
În detaliu
Parcurgerea unui șir C merge de la indicele 0 până la ultimul caracter, adică până la strlen(s) - 1; s[strlen(s)] este terminatorul '\0', nu un caracter vizibil. La fiecare poziție se poate clasifica caracterul (literă mică, literă mare, cifră, alt semn), număra caracterele cu o anumită proprietate sau transforma caracterul. Clasificarea folosește comparații pe coduri: c >= 'a' && c <= 'z' pentru litere mici, c >= 'A' && c <= 'Z' pentru litere mari, c >= '0' && c <= '9' pentru cifre. Transformarea unei litere mici în majusculă se face prin diferența codurilor: c - 'a' + 'A'; valoarea numerică a unei cifre este c - '0'. Funcțiile isalpha, isdigit, toupper și tolower din <cctype> fac aceleași verificări și transformări pentru caractere ASCII. Regula de comparație se precizează înainte de numărare: în „Ana”, litera a apare o dată dacă se compară exact cu 'a', dar de două ori dacă se ignoră diferența dintre majuscule și minuscule.
Exemplul 1 — transformare și numărare. Programul transformă literele mici în majuscule și numără cifrele din șirul a2b7.
#include <iostream>
#include <cstring>
using namespace std;
int main() {
char s[] = "a2b7";
int cifre = 0;
for (int i = 0; i < strlen(s); ++i) {
if (s[i] >= 'a' && s[i] <= 'z')
s[i] = s[i] - 'a' + 'A';
if (s[i] >= '0' && s[i] <= '9')
++cifre;
}
cout << s << " " << cifre;
return 0;
}
Programul afișează A2B7 2. Literele a și b devin A și B; cifrele 2 și 7 rămân neschimbate și sunt numărate. Cele două teste sunt independente: un caracter care a devenit majusculă nu mai este cifră.
Exemplul 2 — vocalele din „Informatica”. Se numără vocalele ignorând diferența dintre majuscule și minuscule: fiecare literă se transformă în literă mică (tolower) și se caută în șirul "aeiou". Literele vocale din „Informatica” sunt I, o, a, i, a, deci 5. Dacă se testează litera exact, fără tolower, I nu este numărată și rezultatul este 4.
Exemplul 3 — frecvența literelor. Pentru fiecare literă mică se mărește contorul de la indicele c - 'a', între 0 pentru a și 25 pentru z. În textul informatica litera i apare de două ori, iar litera a de două ori; vectorul de contoare are 26 de poziții. Aceeași idee numără cifrele cu indicele c - '0'.
Exemplul 4 — textul este palindrom? Un text este palindrom dacă se citește la fel în ambele sensuri. Se compară caracterul de pe poziția cu cel simetric, de pe poziția , pentru de la 0 la . Pentru capac (lungime 5) se compară perechile și ; litera din mijloc nu are pereche, deci textul este palindrom. Pentru casa perechea diferă, iar căutarea se oprește la prima nepotrivire. Ciclul face cel mult comparații.
Exemplul 5 — suma cifrelor și cifra maximă. Din șirul a2b7c4 se prelucrează doar cifrele, iar valoarea fiecăreia se obține cu s[i] - '0':
char s[] = "a2b7c4";
int n = strlen(s), suma = 0, mx = -1;
for (int i = 0; i < n; ++i)
if (s[i] >= '0' && s[i] <= '9') {
int v = s[i] - '0';
suma += v;
if (v > mx) mx = v;
}
cout << suma << " " << mx;
Urmărirea: pentru cifra 2, suma este 2 și mx este 2; pentru 7, suma este 9 și mx este 7; pentru 4, suma este 13, iar mx rămâne 7. Se afișează 13 7. Valoarea inițială -1 a lui mx arată că nu s-a găsit nicio cifră: pentru șirul abc se afișează 0 -1. Lungimea se calculează o singură dată, în n. Dacă strlen(s) ar sta în condiția ciclului, ea poate fi recalculată la fiecare iterație, iar timpul ar crește de la proporțional cu la proporțional cu .
Pentru admitere
Ultimul indice al unui text de lungime n este n - 1. În tabloul C, s[n] este terminatorul '\0', nu ultimul caracter vizibil. La „a2b7”, bucla de la 0 la 3 întâlnește două cifre și obține „A2B7”. Condiția i <= strlen(s) ar prelucra și terminatorul, iar i < strlen(s) este cea corectă. Dacă ciclul modifică s[i] și apoi îl testează în aceeași iterație, al doilea test vede deja valoarea modificată; în exemplul de mai sus, o literă transformată în majusculă nu mai satisface testul pentru litere mici. Verifică și intervalele din teste: c >= 'a' && c <= 'm' selectează primele 13 litere mici, iar litera n nu aparține intervalului.
Exemplu în formatul examenului. Ce se afișează în urma executării secvenței de mai jos?
char s[] = "informatica";
int k = 0;
for (int i = 0; s[i] != '\0'; i++)
if (s[i] >= 'a' && s[i] <= 'm')
k++;
cout << k;
- a) 5
- b) 6
- c) 7
- d) 11
Răspunsul corect este c). Literele cuvântului sunt i n f o r m a t i c a. Se numără cele cuprinse între a și m: i, f, m, a, i, c, a, adică 7 litere. Literele n, o, r și t au coduri mai mari decât cel al lui m, deci nu se numără. Varianta d) este lungimea cuvântului, adică numără toate literele, iar varianta a) numără doar vocalele.
Al doilea exemplu în formatul examenului. Ce se afișează în urma executării secvenței de mai jos?
char s[] = "Ab3xY9";
int k = 0;
for (int i = 0; s[i] != '\0'; i++)
if (s[i] >= 'A' && s[i] <= 'Z')
s[i] = s[i] - 'A' + 'a';
else if (s[i] >= '0' && s[i] <= '9')
k = k + s[i] - '0';
cout << s << " " << k;
- a)
ab3xy9 12 - b)
ab3xy9 9 - c)
Ab3xY9 12 - d)
ab3xy9 39
Răspunsul corect este a). Majusculele A și Y devin a și y, iar b și x rămân la fel. Cifrele 3 și 9 nu sunt litere, deci intră în a doua ramură: , apoi . Varianta b) ar rezulta din k = s[i] - '0', care păstrează doar ultima cifră. Varianta d) alătură cifrele în loc să le adune.
Greșeli frecvente
- Greșit: ultimul caracter vizibil al unui șir de lungime
nestes[n].Corect: estes[n - 1];s[n]este terminatorul. - Greșit:
c - '0'este corect pentru orice caracter.Corect: dă valoarea numerică numai pentru cifre; pentru alte caractere rezultatul nu are sens. - Greșit: într-un text,
așiAsunt același caracter.Corect: sunt caractere diferite, cu coduri diferite, dacă nu se aplicătolowersautoupper.
Testează-te pe această lecție
Lecția o citești aici, fără cont. Testele pe lecții și capitole sunt în cont, cu grile originale Didaxis și explicația fiecăreia: gratuit 10 grile pe zi, fără limită cu Premium, 49 de lei pe lună pentru fiecare copil.
Înainte și după
Surse și referințe
Redactare proprie, conform programei:
- OMECI 5099/2009, anexa 5, Informatică, p. 4–5, clasa X intensiv; rocnee.eu
- OMECI 5099/2009, anexa 5, Informatică, p. 4–5, clasa XI; plan de încadrare: OMEC 7723/2024, anexa 2, tabelele 1–25, legislatie.just.ro; filiera tehnologică: OMEC 7724/2024, anexa 4, tabelul calificării, legislatie.just.ro
- UNSTPB, Regulament admitere licență 2026, Anexa II-1.2 p. Anx II-14 și Anexa XI-3 p. Anx XI-6–7 (PDF p. 64, 120–121); admitere.pub.ro
- OMECTS 4800/2010, anexa 2, Informatică, p. 3–4; edu.ro
Documente consultate
- UNSTPB, admitere 2026, anexa XI-3, p. Anx XI-6–7
- Programa școlară de informatică, clasa a XI-a (OMECI 5099/2009, anexa 5), CNCE; rocnee.eu
- Programa de bacalaureat la informatică, matematică-informatică (anexa 2 la OMECTS 4800/2010), Ministerul Educației, p. 3–4; edu.ro
- Subiectele și baremele Bacalaureatului 2026; subiecte2026.edu.ro
Desene: Redactare proprie (desen original), conform Programa școlară de informatică, clasa a XI-a (OMECI 5099/2009, anexa 5), CNCE; rocnee.eu
