Teorie
Șiruri de caractere la atestatul de informatică
Citirea unui text cu getline, parcurgerea până la terminator, numărarea cuvintelor cu flag, filtrarea caracterelor și compararea cu strcmp — cu problemele de atestat în care apar.
4
minute de citit
8
secțiuni
38
probleme rezolvate legate
Actualizat pe .
Pe această pagină
Subiectele cu text par variate, dar se reduc la patru tehnici. Cele mai multe puncte se pierd nu pe logică, ci pe două detalii tehnice: cum citești textul și cât de mare declari șirul.
Citirea unui text
char s[201];
cin.getline(s, 201); // de la tastatura
f.getline(s, 201); // dintr-un fisiergetline, nu >>. Operatorul >> se oprește la primul spațiu, deci ai prelua doar primul
cuvânt — iar la problemele care numără cuvinte ai obține mereu 1. getline ia tot rândul, cu
spații și semne de punctuație.
Dimensiunea e cu unu mai mare decât maximul din enunț. „Cel mult 200 de caractere" înseamnă
char s[201]: mai trebuie un loc pentru terminatorul '\0', pe care C++ îl adaugă automat la
final. Cu char s[200] scrii în afara șirului la un text de exact 200 de caractere.
Parcurgerea merge până la terminator, deci nu ai nevoie de lungime:
for (int i = 0; s[i] != '\0'; i++) { /* ... */ }Tehnica 1
Numărarea cuvintelor cu flag
Ideea tentantă „numărul de cuvinte = numărul de spații + 1" e greșită imediat ce textul începe sau se termină cu spațiu — exact ce testează enunțurile.
Metoda corectă numără tranzițiile de la separator la literă:
int nr = 0;
bool inCuvant = false;
for (int i = 0; s[i] != '\0'; i++)
if (s[i] != ' ') {
if (!inCuvant) nr++; // tocmai am intrat intr-un cuvant nou
inCuvant = true;
} else {
inCuvant = false;
}Flagul reține unde te afli. Incrementarea se face doar la intrarea într-un cuvânt; literele
următoare nu mai numără nimic, pentru că flagul e deja true.
Metoda tratează automat toate cazurile-limită: spații la început, spații la final, spații multiple, text gol.
Exersează pe subiecte reale
Tehnica 2
Filtrarea caracterelor
Pentru „elimină X din șir", nu ștergi caractere — construiești un șir nou cu ce păstrezi, folosind doi indici care avansează independent:
int k = 0;
for (int i = 0; s[i] != '\0'; i++)
if (!deSters(s[i])) rezultat[k++] = s[i];
rezultat[k] = '\0'; // OBLIGATORIUi parcurge tot, k avansează doar când chiar scrii. E aceeași tehnică ca la
filtrarea vectorilor, aplicată caracterelor.
Terminatorul de la final e obligatoriu. Fără rezultat[k] = '\0', afișarea continuă în memorie
dincolo de șir și apar caractere aleatorii.
Exersează pe subiecte reale
Tehnica 3
Teste pe caractere
Caracterele sunt numere. În tabela ASCII, grupurile sunt consecutive, deci testele devin comparații de interval:
if (c >= '0' && c <= '9') // cifra
if (c >= 'a' && c <= 'z') // litera mica
if (c >= 'A' && c <= 'Z') // litera mareGhilimelele simple contează: '0' e caracterul zero (cod 48), nu numărul 0.
Conversia majusculă → minusculă se face adunând 32, pentru că literele mici sunt cu exact atât
mai departe ('A' = 65, 'a' = 97):
if (c >= 'A' && c <= 'Z') c = c + 32;Verificarea intervalului e necesară — altfel strici cifrele și semnele de punctuație. Tehnica e utilă oriunde enunțul cere și majuscule, și minuscule: în loc de zece comparații pentru vocale, converteşti și compari cu cinci.
Exersează pe subiecte reale
Tehnica 4
Compararea cuvintelor
#include <cstring>
if (strcmp(cuvant, cautat) == 0) nr++;Două capcane, ambele frecvente:
==nu merge pe șiruri de caractere. Compară adresele din memorie, nu conținutul, iar rezultatul e aproape întotdeauna fals.strcmpreturnează0la egalitate, nu1. Valoarea returnată e diferența în ordine alfabetică: negativă, zero sau pozitivă.
Exersează pe subiecte reale
Greșeli care se repetă
cin >> sîn loc degetline— se citește doar primul cuvântchar s[200]pentru „cel mult 200 de caractere" — lipsește locul terminatorului- Numărarea spațiilor + 1 — greșit la spații de la început sau final
- Terminatorul
'\0'uitat după construirea unui șir nou cuvant == cautatîn loc destrcmpstrcmp(...) == 1— funcția returnează0la egalitate- Conversia
c + 32fără verificarea intervalului — strică cifrele - Rânduri goale la separatori multipli, din lipsa testului
if (inCuvant)
Mai departe
Unde exersezi mai departe
Lucrul cu șiruri are multe capcane mici (delimitatori, indici, funcții de bibliotecă), iar un evaluator automat le prinde imediat.
Pentru asta, pbinfo.ro e cea mai bună resursă românească: peste 2500 de probleme de informatică cu evaluator automat, și o trimiți la testat direct din browser. E construită pentru olimpiadă și bacalaureat, deci se completează cu ce găsești aici — noi acoperim subiectele de atestat, cu rezolvări scrise.
Toate problemele din această categorie
Fiecare are rezolvare completă în C++, explicată pas cu pas.
38Arată toate problemele rezolvateAscunde lista38 programare
- Cea mai lungă secvență de litere ordonate alfabetic
- Cel mai lung cuvânt din fiecare propoziție și numărul de vocale (vocale și cuvant)
- Cuvinte cu cel puțin trei vocale și două consoane alăturate (verif și nrvoc)
- Cuvinte cu prima literă mare și numărul total de litere mari (nrlit și trans)
- Cuvinte formate numai din vocale și cuvinte care conțin „str” (subprogramul vocale)
- Cuvintele de lungime impară, afișate în ordinea inversă citirii
- Cuvintele palindrom dintr-un fișier
- Cuvântul cu cele mai multe majuscule dintr-un text
- Câte consoane sunt cuprinse între două vocale
- Decodificarea unui text comprimat cu caracter și număr de repetări
- Decodificarea unui text: vocale ca cifre, consoane deplasate (construieste și decodifica)
- Duplicarea cuvintelor formate numai din vocale
- Eliminarea consoanelor dintr-un șir
- Eliminarea dintr-un șir a caracterelor comune altor două
- Entitățile lexicale care conțin cifre și inițialele transformate în majuscule (subprogramul cifre)
- Fiecare cuvânt urmat de atâtea puncte câte litere are; cuvintele cu cratimă (subprogramul puncte)
- Literele comune tuturor cuvintelor (citire și stergere)
- Numărul de cuvinte care conțin litera a
- Numărul de cuvinte și de cifre, apoi eliminarea literelor mici
- Numărul de cuvinte și de vocale, apoi eliminarea spațiilor
- Numărul din cifrele unui text: întâi impare crescător, apoi pare descrescător (cifra și numar)
- Numărul maxim de consoane dintr-un cuvânt; cuvintele de lungime pară cu inițială mare (subprogramul consoane)
- Perechile de vocale simetrice față de mijlocul șirului
- Pozițiile vocalelor urmate de o consoană
- Prefixele și sufixele cuvintelor de lungime minimă și maximă (prefixe și sufixe)
- Prima literă a fiecărui cuvânt înlocuită cu 0, ultima cu 9
- Suma cuvintelor care pot fi convertite în numere
- Să se afişeze cuvintele, pe linii distincte ale ecranului
- Să se determine numărul de vocale din şir
- Să se elimine cifrele din şir
- Să se numere apariţiile unui cuvânt dat, citit de la tastatură, în text
- Să se numere cuvintele din text
- Titluri de cărți: câte au exact două majuscule și care conțin litera M (subprogramul majuscule)
- Verifică dacă un șir reprezintă un număr natural
- Vocale și consoane înlocuite cu litera mare vecină din alfabet
- Vocalele distincte dintr-un text din fișier, în ordine alfabetică
- Șir format din primele 3 caractere a două șiruri
- Ștergerea semnelor de punctuație și înlocuirea spațiilor cu asterisc
Alte pagini de teorie