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

Ora 2: Declararea și citirea șirurilor în C++

Ce vei învăța astăzi: Cum se declară un șir de caractere în C++, cum se citește de la tastatură (cu cin și cin.getline) și cum se afișează cu cout

Rezultat practic: Scrii programe C++ care declară, citesc și afișează șiruri de caractere, inclusiv texte care conțin spații (Competența 2.2).

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

Înainte de a începe

De ce contează? Orice program care prelucrează text începe cu citirea datelor: dacă un cuvânt este citit greșit, toate prelucrările următoare duc la rezultate greșite, iar testele cu spații apar frecvent la evaluare.

Ce știi deja?

La ora 1 ai văzut că un șir este un model liniar care se termină cu terminatorul ''. Dacă programul ar citi textul „ana are mere" cu cin, unde crezi că se oprește citirea?

Ideea-cheie: Declararea char s[101] rezervă 101 poziții (100 litere + terminator), cin >> s citește un singur cuvânt și se oprește la spațiu, iar cin.getline(s, 101) citește linia întreagă, spații incluse — alegerea metodei depinde de datele problemei.
SINTEZĂ TEORETICĂ ȘI EXEMPLE GHIDATE

Ce vei învăța astăzi?

După această lecție vei ști să declari un șir de caractere (adică să rezervi în memorie un spațiu pentru caractere) în C++, să-l citești de la tastatură în ambele variante (fără și cu spații) și să-l afișezi pe ecran.

Declararea cu char s[101]
Citirea cu cin
Citirea cu cin.getline
Afișarea cu cout

Declararea unui șir de caractere

Definiție: Un șir de caractere se declară ca un vector de caractere (un tablou ale cărui elemente sunt caractere, așezate unul după altul): char s[101];. Dimensiunea 101 permite stocarea a maximum 100 de caractere plus caracterul terminator '\0'.

Analogia: cutia de scrisori

Declararea char s[101] este ca și cum ai cumpăra o cutie cu 101 de sertare: în primele sertare pui literele, iar ultimul sertar (sau primul sertar gol) îți spune unde se termină cuvântul. Până nu pui nimic în cutie, ea poate conține „resturi" din cutii vechi.

C++ - cele două forme de declarare
#include <iostream>
using namespace std;

int main()
{
    char s1[101];                    // șir neinițializat (gol)
    char s2[101] = "BAC";            // șir inițializat cu text

    cout << s2 << endl;              // afișează: BAC

    return 0;
}

Ce învățăm: la declararea cu text, terminatorul '\0' este adăugat automat de compilator la sfârșitul textului.

Citirea șirurilor de la tastatură

În C++ există două metode principale de citire a unui șir:

Metodă Ce citește Când o folosim
cin >> s doar un cuvânt (până la spațiu) cuvinte, fără spații
cin.getline(s, 101) întreaga linie, inclusiv spațiile propoziții, texte

Exemplu ghidat: citirea unei linii cu spații

Algoritm citireLinie declară s ca șir de maximum 100 caractere citește întreaga linie în s (inclusiv spațiile) scrie "Textul citit este: ", s Sfârșit algoritm
C++ - citire cu cin.getline și afișare
#include <iostream>
using namespace std;

int main()
{
    char s[101];

    cin.getline(s, 101);

    cout << "Textul citit este: " << s << endl;

    return 0;
}

Observă: cu cin >> s din intrarea Ana are mere am citi doar Ana. Cu cin.getline(s, 101) citim întreaga linie.

Citirea mixtă: cuvânt + linie

Dacă citim mai întâi un număr sau un cuvânt cu cin și apoi o linie cu cin.getline, în intrare rămâne caracterul Enter. Îl eliminăm cu cin.ignore() înainte de cin.getline.

Exemplu ghidat: cuvânt și apoi o propoziție

C++ - citirea unui cuvânt și a unei linii
#include <iostream>
using namespace std;

int main()
{
    char cuvant[101];
    char text[101];

    cin >> cuvant;
    cin.ignore();
    cin.getline(text, 101);

    cout << "Cuvantul: " << cuvant << endl;
    cout << "Textul: " << text << endl;

    return 0;
}

Observă: fără cin.ignore(), cin.getline ar citi doar Enter-ul rămas în intrare și text ar rămâne gol.

Exercițiu de completare

Completează enunțul despre citirea șirurilor:

Un șir de caractere se declară cu tipul ______. Pentru a citi un cuvânt fără spații folosim operatorul ______, iar pentru a citi o linie întreagă, cu spații, folosim funcția ______. Afișarea se face cu ______.

Bancă de cuvinte:
char cin cin.getline cout

Exercițiu de completare a codului

Completează programul care citește și afișează un text:
#include <iostream>
using namespace std;
int main()
{
    ______ s[101];
    ______(s, 101);
    cout << ______ << endl;
    return 0;
}
Bancă de cuvinte:
char cin.getline s

Test de înțelegere

Test rapid - declararea și citirea șirurilor:

1. Care instrucțiune citește o întreagă linie, inclusiv spațiile?

2. Ce înseamnă char s[101]?

3. La ce folosește cin.ignore() înainte de cin.getline?

Ai grijă la: după o citire cu cin >> n, Enter-ul rămas în buffer este preluat greșit de cin.getline; la citirea mixtă număr + text, apelează cin.ignore() înainte de cin.getline, altfel linia este citită goală.

Aprofundare

Cazuri particulare și detalii avansate:

  • De ce exact 101 poziții? char s[101] reține maximum 100 de litere plus terminatorul '\0'. Dacă ai nevoie de 1000 de caractere, declari char s[1001].
  • cin >> s oprește citirea la primul spațiu, tab sau Enter. Din intrarea Ana are mere citește doar Ana. De aceea, pentru texte folosim cin.getline(s, 101).
  • cin.ignore() după citirea cu cin: dacă citești întâi un număr sau un cuvânt și apoi o linie, în buffer rămâne Enter-ul; cin.ignore() îl elimină înainte de cin.getline.
  • Șirul neinițializat conține valori oarecare. Un char s[101] fără inițializare poate avea resturi din memorie; de aceea șirurile declarate și apoi citite primesc terminatorul automat din funcțiile de citire.
  • Caracterul Enter nu ajunge în șir: funcția cin.getline citește caracterele și adaugă singură terminatorul '\0' la final.

La BAC, pentru problemele în care textul poate conține spații, regula de aur este: cin.getline pentru întreaga linie și cin pentru un singur cuvânt. Alegerea metodei de citire influențează direct corectitudinea programului.

APLICARE ȘI REZOLVARE DE PROBLEME

PbInfo - Cuvântul

Enunț:

Cerință: Se citește un cuvânt s. Să se afișeze cuvântul de două ori pe aceeași linie, separate printr-un spațiu.

Date de intrare:

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

Date de ieșire:

Programul va afișa cuvântul, un spațiu și cuvântul din nou.

Restricții și precizări:

Cuvântul are cel mult 100 de caractere și nu conține spații.

Exemplu:

Intrare:

bac

Ieșire:

bac bac
Cum gândim soluția:
  1. Declarăm char s[101] și citim cuvântul cu cin >> s
  2. Afișăm cu cout: s, un spațiu și din nou s
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
using namespace std;

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

    cout << s << " " << s;

    return 0;
}

Ce învățăm: cout << s afișează tot șirul dintr-o dată; putem afișa același șir de mai multe ori.

PbInfo - Textul cu spații

Enunț:

Cerință: Se citește un text care poate conține spații. Să se afișeze textul între paranteze drepte: [text].

Date de intrare:

Programul citește de la tastatură textul, pe o singură linie.

Date de ieșire:

Programul va afișa textul între paranteze drepte.

Restricții și precizări:

Textul are cel mult 100 de caractere și poate conține spații.

Exemplu:

Intrare:

Informatica e usoara

Ieșire:

[Informatica e usoara]
Cum gândim soluția:
  1. Citim întreaga linie cu cin.getline(s, 101)
  2. Afișăm [, șirul s și ]
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
using namespace std;

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

    cout << "[" << s << "]";

    return 0;
}

Ce învățăm: doar cin.getline reține și spațiile; cin >> s s-ar opri la primul spațiu.

EXERCIȚII PRACTICE

Exercițiul Practic: citirea și afișarea textului

Sarcini de lucru

Completează următoarele sarcini pentru a exersa declararea, citirea și afișarea șirurilor

Sarcina 1: Salutarea

Cerință: Scrie un program C++ complet care citește numele unui elev (un singur cuvânt) și afișează mesajul Salut, <nume>!. Pentru intrarea Maria se afișează Salut, Maria!

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

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

    cout << "Salut, " << nume << "!";

    return 0;
}

Verifică: pentru intrarea Maria, programul afișează Salut, Maria!

Sarcina 2: Cuvânt și text

Cerință: Scrie un program C++ complet care citește mai întâi un cuvânt, apoi o propoziție (cu spații) și le afișează pe linii separate. Folosește cin.ignore() între cele două citiri.

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

int main()
{
    char cuvant[101];
    char text[101];

    cin >> cuvant;
    cin.ignore();
    cin.getline(text, 101);

    cout << cuvant << endl;
    cout << text << endl;

    return 0;
}

Verifică: pentru intrarea bac și examenele incep luni, se afișează ambele linii corect.

Scrie pe caiet - De reținut

Titlul lecției

Ora 2: Declararea și citirea șirurilor în C++

Definiția lecției

Declararea unui șir în C++ înseamnă rezervarea unui spațiu în memorie pentru caractere, de exemplu char s[101] pentru maximum 100 de caractere. Citirea se face în două moduri: cu cin >> s, care citește doar un cuvânt, până la spațiu, și cu cin.getline(s, 101), care citește întreaga linie, inclusiv spațiile. La citirea cu cin.getline, terminatorul este adăugat automat la sfârșitul textului citit. Dacă citim mai întâi un cuvânt și apoi o linie, în intrare rămâne caracterul Enter, pe care îl eliminăm cu cin.ignore(). Afișarea se face cu cout. Alegerea metodei de citire depinde de datele problemei: cuvânt fără spații sau propoziție întreagă.

Definiții esențiale

Algoritmul cheie - pseudocod

Algoritm citireLinie declară s ca șir de maximum 100 caractere citește întreaga linie în s (inclusiv spațiile) scrie "Textul citit este: ", s Sfârșit algoritm

Algoritmul cheie - cod C++

#include <iostream>
using namespace std;

int main()
{
    char s[101];

    cin.getline(s, 101);

    cout << "Textul citit este: " << s << endl;

    return 0;
}

Greșeli comune de evitat

Sfaturi practice și trucuri

Exemplu practic

Scrie un program care citește numele complet al unui elev (prenume și nume, cu spațiu între ele) și îl afișează cu un salut. Pentru intrarea Ana Maria Popescu, programul afișează: Bună, Ana Maria Popescu!

#include <iostream>
using namespace std;

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

    cout << "Buna, " << nume << "!" << endl;

    return 0;
}