Școala Româno-Britanică
Modulul 2 Clasa a X-a | C++

Ora 3: Parcurgerea șirurilor și lungimea

Ce vei învăța astăzi: Cum determinăm lungimea unui șir cu strlen (funcție care întoarce numărul de caractere reale, fără terminator), cum parcurgem caracterele (adică le vizităm unul după altul, de la prima la ultima poziție) cu for și cum numărăm vocalele

Rezultat practic: Scrii programe C++ care prelucrează caracterele unui șir prin parcurgere cu for, folosind lungimea calculată cu strlen (Competența 2.2).

Competența 2.2 Săptămâna 6

Înainte de a începe

De ce contează? Lungimea și parcurgerea sunt primele unelte ale oricărei prelucrări de text: numărat, căutat sau modificat — toate încep cu o buclă care trece o singură dată prin șir, iar strlen apare în aproape fiecare problemă de șiruri.

Ce știi deja?

La ora 2 ai citit texte cu cin.getline. Dacă un text are 5 litere, câte caractere reale conține? Iar o funcție de „lungime" numără terminatorul '' sau nu?

Ideea-cheie: strlen(s) întoarce numărul de caractere reale, fără terminator; o parcurgere cu for (int i = 0; i < n; i++) ajunge la fiecare caracter exact o dată, iar n - 1 este poziția ultimului caracter real.
SINTEZĂ TEORETICĂ ȘI EXEMPLE GHIDATE

Ce vei învăța astăzi?

După această lecție vei ști să determini lungimea unui șir de caractere, să parcurgi șirul cu o structură for și să numări aparițiile unor caractere, precum vocalele.

Lungimea cu strlen
Parcurgerea cu for
Numărarea vocalelor
Aplicarea în probleme

Lungimea unui șir cu strlen

Definiție: Funcția strlen(s) returnează numărul de caractere din șirul s, fără a număra caracterul terminator '\0'. Se găsește în biblioteca <cstring>.

Analogia: numărarea mărgelelor

Determinarea lungimii este ca numărarea mărgelelor dintr-un șirag: numeri fiecare mărgea până ajungi la capăt, dar nu numeri nodul care leagă capetele (terminatorul).

C++ - lungimea unui șir
#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    char s[101];
    cin.getline(s, 101);

    int n = strlen(s);

    cout << "Sirul are " << n << " caractere" << endl;

    return 0;
}

Ce învățăm: pentru intrarea bac, strlen(s) returnează 3, deși șirul ocupă 4 poziții în memorie (3 litere + '\0').

Parcurgerea unui șir cu for

Parcurgerea înseamnă vizitarea fiecărui caracter al șirului, de la poziția 0 până la poziția n - 1. Este operația de bază pentru orice prelucrare: numărare, căutare, transformare.

C++ - parcurgerea și afișarea caracterelor
#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    char s[101];
    cin.getline(s, 101);

    int n = strlen(s);

    for (int i = 0; i < n; i++)
    {
        cout << s[i] << " ";
    }

    return 0;
}
Parcurgerea șirului BAC
n = 3
i = 0 afișăm s[0] = B
i = 1 afișăm s[1] = A
i = 2 afișăm s[2] = C
i = 3 3 < 3 este fals, bucla se oprește

Numărarea vocalelor

O aplicație tipică a parcurgerii: numărăm câte vocale conține un șir de litere mici. Folosim un contor (o variabilă care numără, adică își crește valoarea cu 1 la fiecare potrivire) pe care îl incrementăm de fiecare dată când caracterul curent este vocală.

Exemplu ghidat: câte vocale are un cuvânt?

Algoritm numărareVocale citește s n = lungimea șirului s (strlen) contor = 0 pentru i = 0, n - 1 execută dacă s[i] este vocală (a, e, i, o, u) atunci contor = contor + 1 sfârșit dacă sfârșit pentru scrie contor Sfârșit algoritm
C++ - numărarea vocalelor
#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    char s[101];
    cin.getline(s, 101);

    int vocale = 0;

    for (int i = 0; i < strlen(s); i++)
    {
        if (s[i] == 'a' || s[i] == 'e' || s[i] == 'i' ||
            s[i] == 'o' || s[i] == 'u')
        {
            vocale++;
        }
    }

    cout << "Numarul de vocale: " << vocale << endl;

    return 0;
}

Observă: strlen(s) este apelat la fiecare iterație în condiția buclei. E corect, dar la BAC preferăm să reținem lungimea într-o variabilă: int n = strlen(s).

Exercițiu de completare

Completează enunțul despre parcurgerea șirurilor:

Lungimea unui șir se determină cu funcția ______ din biblioteca ______. Parcurgem șirul cu o structură ______, iar variabila care reține poziția curentă se numește ______.

Bancă de cuvinte:
strlen cstring for contor

Exercițiu de completare a codului

Completează programul care afișează caracterele unui șir:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
    char s[101];
    cin.getline(s, 101);
    int n = ______(s);
    for (int i = 0; i < ______; i++)
    {
        cout << s[______] << " ";
    }
    return 0;
}
Bancă de cuvinte:
strlen n i

Test de înțelegere

Test rapid - parcurgerea șirurilor:

1. Ce returnează strlen(s)?

2. La ce folosește variabila i în bucla for?

3. Câte iterații face bucla for (int i = 0; i < n; i++) pentru n = 4?

Ai grijă la: nu apela strlen(s) în condiția buclei, gen for (i = 0; i < strlen(s); i++): funcția s-ar executa la fiecare pas și programul ar fi inutil de lent. Salvează rezultatul o singură dată, într-o variabilă, înainte de buclă.

Aprofundare

Cazuri particulare și detalii avansate:

  • Cele două forme de parcurgere sunt echivalente. Fie condiția s[i] != '\0', fie i < strlen(s), ambele parcurg exact caracterele reale ale șirului. Alegerea depinde de problemă.
  • Nu apela strlen(s) în fiecare iterație (în condiția unui for): funcția parcurge din nou întregul șir de fiecare dată. Mai bine salvezi lungimea într-o variabilă n = strlen(s) înainte de buclă.
  • Vocalele pot include și literele cu diacritice sau majusculele; în problemele BAC șirurile conțin de regulă litere mici, fără diacritice, iar vocalele sunt a, e, i, o, u.
  • Caracterul de spațiu nu este vocală și nu este literă: când parcurgi un text, un test s[i] == ' ' separat te ajută să despărți cuvintele.
  • strlen returnează size_t (un tip întreg fără semn); la comparații cu int nu apar probleme practice la dimensiunile din BAC.

Parcurgerea este fundația tuturor prelucrărilor de șiruri: orice problemă (numărare, căutare, transformare) înseamnă, la bază, „mergi caracter cu caracter și aplică o regulă".

APLICARE ȘI REZOLVARE DE PROBLEME

PbInfo - Numărul de vocale

Enunț:

Cerință: Se citește un cuvânt s, format doar din litere mici. Să se afișeze numărul de vocale din cuvânt.

Date de intrare:

Programul citește de la tastatură cuvântul s.

Date de ieșire:

Programul va afișa un număr natural reprezentând numărul de vocale.

Restricții și precizări:

Cuvântul are cel mult 100 de caractere. Vocalele sunt: a, e, i, o, u.

Exemplu:

Intrare:

bacalaureat

Ieșire:

6
Cum gândim soluția:
  1. Citim cuvântul cu cin.getline sau cin
  2. Parcurgem șirul cu for, până la strlen(s)
  3. Dacă s[i] este a, e, i, o sau u, incrementăm contorul
  4. Afișăm contorul
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    char s[101];
    cin.getline(s, 101);

    int vocale = 0;

    for (int i = 0; i < strlen(s); i++)
    {
        if (s[i] == 'a' || s[i] == 'e' || s[i] == 'i' ||
            s[i] == 'o' || s[i] == 'u')
        {
            vocale++;
        }
    }

    cout << vocale;

    return 0;
}

Ce învățăm: parcurgerea completă a șirului plus un contor rezolvă orice problemă de numărare: vocale, consoane, litere.

PbInfo - Câte consoane

Enunț:

Cerință: Se citește un cuvânt s, format doar din litere mici. Să se afișeze numărul de consoane din cuvânt.

Date de intrare:

Programul citește de la tastatură cuvântul s.

Date de ieșire:

Programul va afișa numărul de consoane.

Restricții și precizări:

Cuvântul are cel mult 100 de caractere. O consoană este o literă mică care nu este vocală.

Exemplu:

Intrare:

bacalaureat

Ieșire:

5
Cum gândim soluția:
  1. Citim cuvântul și parcurgem fiecare caracter
  2. Dacă este literă mică (s[i] >= 'a' și s[i] <= 'z') și nu este vocală, atunci este consoană
  3. Incrementăm contorul și îl afișăm
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    char s[101];
    cin.getline(s, 101);

    int consoane = 0;

    for (int i = 0; i < strlen(s); i++)
    {
        if (s[i] >= 'a' && s[i] <= 'z')
        {
            if (s[i] != 'a' && s[i] != 'e' && s[i] != 'i' &&
                s[i] != 'o' && s[i] != 'u')
            {
                consoane++;
            }
        }
    }

    cout << consoane;

    return 0;
}

Ce învățăm: condițiile >= 'a' și <= 'z' verifică dacă un caracter este literă mică, folosind ordinea caracterelor din codul ASCII.

EXERCIȚII PRACTICE

Exercițiul Practic: parcurgerea și numărarea

Sarcini de lucru

Completează următoarele sarcini pentru a exersa parcurgerea șirurilor

Sarcina 1: Câte litere a?

Cerință: Scrie un program C++ complet care citește un cuvânt de litere mici și afișează de câte ori apare litera a în el. Pentru intrarea banana se afișează 3.

Soluție pentru Sarcina 1:
#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    char s[101];
    cin.getline(s, 101);

    int contor = 0;

    for (int i = 0; i < strlen(s); i++)
    {
        if (s[i] == 'a')
        {
            contor++;
        }
    }

    cout << contor;

    return 0;
}

Verifică: în banana literele sunt b-a-n-a-n-a: litera a apare de 3 ori.

Sarcina 2: Lungimea și caracterele

Cerință: Scrie un program C++ complet care citește un cuvânt, afișează mai întâi lungimea lui, apoi fiecare caracter pe câte o linie. Pentru intrarea bac afișează: 3, apoi b, a, c pe linii separate.

Soluție pentru Sarcina 2:
#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    char s[101];
    cin.getline(s, 101);

    int n = strlen(s);
    cout << n << endl;

    for (int i = 0; i < n; i++)
    {
        cout << s[i] << endl;
    }

    return 0;
}

Verifică: reținem lungimea într-o variabilă (n) și o folosim în bucla for.

Scrie pe caiet - De reținut

Titlul lecției

Ora 3: Parcurgerea șirurilor și lungimea

Definiția lecției

Lungimea unui șir este numărul de caractere reale, fără terminator, și se află cu funcția strlen din biblioteca <cstring>. Parcurgerea unui șir înseamnă vizitarea fiecărui caracter, de la poziția 0 până la poziția n - 1, de obicei cu o structură for. La parcurgere, variabila i ia pe rând valorile pozițiilor, iar caracterul curent este s[i]. Pentru fiecare caracter verificăm o condiție, de exemplu dacă este vocală, și incrementăm un contor atunci când condiția este adevărată. Ultimul caracter real al șirului se află pe poziția n - 1. Parcurgerea stă la baza oricărei prelucrări de text: numărare, căutare sau transformare.

Definiții esențiale

Algoritmul cheie - pseudocod

Algoritm numărareVocale citește s n = strlen(s) contor = 0 pentru i = 0, n - 1 execută dacă s[i] este vocală atunci contor = contor + 1 sfârșit dacă sfârșit pentru scrie contor Sfârșit algoritm

Algoritmul cheie - cod C++

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    char s[101];
    cin.getline(s, 101);

    int n = strlen(s);
    int contor = 0;

    for (int i = 0; i < n; i++)
    {
        if (s[i] == 'a' || s[i] == 'e' || s[i] == 'i' ||
            s[i] == 'o' || s[i] == 'u')
        {
            contor++;
        }
    }

    cout << contor << endl;

    return 0;
}

Greșeli comune de evitat

Sfaturi practice și trucuri

Exemplu practic

Scrie un program care citește un cuvânt și afișează câte vocale conține. Pentru cuvântul informatica, programul afișează: 5 vocale.

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    char s[101];
    cin >> s;

    int n = strlen(s);
    int contor = 0;

    for (int i = 0; i < n; i++)
    {
        if (s[i] == 'a' || s[i] == 'e' || s[i] == 'i' ||
            s[i] == 'o' || s[i] == 'u')
        {
            contor++;
        }
    }

    cout << contor << " vocale" << endl;

    return 0;
}