Citire și afișare

Bază~13 min10 pași

De ce contează?

La un ghișeu, dai documentele (intrarea) și primești o adeverință (ieșirea). Programul face la fel: ia datele de la tine prin cin, le prelucrează și îți dă rezultatul prin cout. Fără intrare și ieșire, programul ar fi o cutie închisă.

Cele două fluxuri

C++ folosește două „fluxuri" (streams) standard:

  • cin (citire) cu operatorul >> — ia valori de la tastatură/fișierul de intrare.
  • cout (afișare) cu operatorul << — trimite valori pe ecran/fișierul de ieșire.

Ține minte direcția săgeților: >> trage spre variabilă, << împinge dinspre valoare.

#include <iostream>
using namespace std;

int main() {
    int a, b;
    cin >> a >> b;            // citeste doua numere
    cout << a + b << "\n";    // afiseaza suma si trece la rand nou
    return 0;
}

Cum sare cin peste spații

>> ignoră automat spațiile și trecerile la linie nouă dinainte de valoare. De aceea, pentru program, aceste două intrări sunt identice:

4
7
Intrarea „4 7” pe o linie sau „4” și „7” pe linii separate se citesc la fel: cin sare peste spațiul alb dintre ele.

Algoritm pas cu pas: media a trei note

  1. Citim trei note în a, b, c.
  2. Calculăm suma.
  3. Afișăm media reală (atenție la împărțirea întreagă!).
#include <iostream>
using namespace std;

int main() {
    int a, b, c;
    cin >> a >> b >> c;
    double medie = (a + b + c) / 3.0;   // 3.0 ca sa pastram zecimalele
    cout << "Media este " << medie << "\n";
    return 0;
}

Pentru intrarea 9 8 10, suma e 27, iar media 27 / 3.0 = 9.0.

Observația-cheie

Dacă scriai (a + b + c) / 3 (cu 3 întreg), media lui 9 8 8 ar fi 25 / 3 = 8, nu 8.33. Un singur operand real (3.0) păstrează zecimalele.

Citire repetată: cât timp mai vin date

Când nu știi câte numere primești, citește în buclă cât timp citirea reușește:

#include <iostream>
using namespace std;

int main() {
    int x;
    long long suma = 0;
    while (cin >> x) {        // se opreste la sfarsitul intrarii
        suma += x;
    }
    cout << suma << "\n";
    return 0;
}

cin >> x returnează „adevărat" cât timp a citit cu succes un număr și „fals" la sfârșitul intrării sau la o valoare invalidă. Bucla se oprește singură.

Observația-cheie

"\n" și endl trec amândouă la linie nouă. Diferența: endl golește bufferul de fiecare dată (mai lent). La afișări multe într-o buclă, preferă "\n".

Complexitate

Citirea/afișarea unei valori e O(1). Pentru n valori, costul e O(n) — proporțional cu volumul de date. La intrări foarte mari (sute de mii de numere), adaugă în prima linie din main:

ios_base::sync_with_stdio(false);
cin.tie(nullptr);

Asta accelerează cin/cout considerabil, fără să schimbe logica.

Greșeli frecvente

Greșeli reale la intrare/ieșire:

  • Variabilă necitită: folosești a în calcul, dar ai uitat cin >> a; → pornește de la gunoi.
  • endl în buclă mare: la sute de mii de afișări, endl te poate duce la depășirea timpului. Folosește "\n".
  • Confuzie << / >>: scrii cout >> x sau cin << x → eroare de compilare.
  • Citire în tip greșit: citești un număr mare într-un int și se sparge; folosește long long dacă poate depăși 2 miliarde.

De reținut

  • cin >> v citește (sare peste spații); cout << v afișează.
  • while (cin >> x) citește până la sfârșitul intrării, fără să știi câte valori sunt.
  • Preferă "\n" lui endl; pentru intrări mari, dezactivează sincronizarea cu stdio.

Întrebarea 1 / 3

Ce face `cin >> a >> b;` când la intrare ai `4 7` pe aceeași linie?