Citire și afișare

Bază~12 min11 pași

De ce contează?

Orice program face trei lucruri, în ordine: primește date, le prelucrează, afișează rezultatul. Sari primul pas și programul nu știe cu ce să lucreze. Sari ultimul și rezultatul dispare în neant. cin și cout sunt cele două capete ale acestui lanț — fără ele, programul există doar pentru el însuși.

Citire de la tastatură cu cin

#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;         // citeste un intreg

    int a, b;
    cin >> a >> b;    // citeste doua intregi, separate prin spatiu sau enter

    double x;
    cin >> x;         // citeste un numar real

    char c;
    cin >> c;         // citeste un caracter (sare spatiile albe)
    return 0;
}
Observația-cheie

cin >> sare automat spațiile albe (spații, tab-uri, newline-uri) înainte de fiecare valoare. Poți scrie cin >> a >> b >> c; pe o singură linie sau cin >> a; pe linii separate — rezultatul e identic.

Afișare cu cout

#include <iostream>
using namespace std;

int main() {
    int a = 5, b = 3;
    cout << a + b << endl;        // afiseaza 8 si trece la linie noua
    cout << a << " " << b << "\n"; // afiseaza 5 3 si trece la linie noua (mai rapid)
    cout << "Suma: " << a + b;    // afiseaza text + valoare
    return 0;
}

Citire și scriere din fișiere (standard OJI/ONI)

La concursuri, datele vin dintr-un fișier .in și rezultatul se scrie într-un fișier .out. Logica programului nu se schimbă cu nimic — înlocuiești doar cin/cout cu fin/fout:

#include <fstream>
using namespace std;

int main() {
    ifstream fin("date.in");   // deschide fisierul de intrare
    ofstream fout("date.out"); // deschide fisierul de iesire

    int n;
    fin >> n;  // citeste din fisier, exact ca cin

    int suma = 0;
    for (int i = 0; i < n; i++) {
        int x;
        fin >> x;
        suma += x;
    }

    fout << suma << "\n";  // scrie in fisier, exact ca cout

    fin.close();
    fout.close();
    return 0;
}
Indiciu

Numele fișierelor (suma.in, suma.out) sunt specificate în enunț — citește-l cu atenție. Dacă greșești numele, programul nu citește nimic și obții scor 0, chiar dacă logica e perfectă.

Citire rapidă (când n > 100.000)

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

Adaugă aceste două linii imediat după { din main(), înainte de orice cin. Dezactivează sincronizarea cu stdio — programul devine de 5–10× mai rapid la citire/afișare.

Complexitate

Citirea sau afișarea unui număr costă O(1). Citirea unui șir de n numere costă O(n).

Greșeli frecvente

Greșeala 1: Uiți să înlocuiești cin/cout cu fin/fout la concurs. Programul compilează și rulează, dar nu citește nimic din fișier — scor 0 garantat.

Greșeala 2: Folosești endl într-o buclă cu sute de mii de iterații. endl face flush la fiecare apel — e de 10–100× mai lent decât "\n". Rezervă endl pentru afișări punctuale.

Greșeala 3: Vrei să citești un caracter care poate fi spațiu și folosești cin >> c. cin >> sare spațiile — nu îl vei prinde niciodată. Folosește cin.get(c) când contează și spațiile.

Întrebarea 1 / 3

La concursurile OJI/ONI, datele se citesc de obicei din: