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 |
Algoritm pas cu pas: media a trei note
- Citim trei note în
a,b,c. - Calculăm suma.
- 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.
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ă.
"\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 reale la intrare/ieșire:
- Variabilă necitită: folosești
aîn calcul, dar ai uitatcin >> a;→ pornește de la gunoi. endlîn buclă mare: la sute de mii de afișări,endlte poate duce la depășirea timpului. Folosește"\n".- Confuzie
<</>>: scriicout >> xsaucin << x→ eroare de compilare. - Citire în tip greșit: citești un număr mare într-un
intși se sparge; foloseștelong longdacă poate depăși 2 miliarde.
De reținut
cin >> vcitește (sare peste spații);cout << vafișează.while (cin >> x)citește până la sfârșitul intrării, fără să știi câte valori sunt.- Preferă
"\n"luiendl; pentru intrări mari, dezactivează sincronizarea cu stdio.