Citirea și afișarea datelor în C++
Citește numere cu cin și afișează rezultate cu cout în C++. Exersează separatorii, formatul cerut de probleme și afișarea mediilor cu două zecimale.
În acest material
Un program devine util când poate primi date diferite la fiecare rulare. În C++, std::cin citește din intrarea standard, iar std::cout afișează la ieșirea standard. Într-un terminal, datele sunt de obicei introduse de la tastatură; un evaluator poate furniza aceleași date automat.
Înainte de lecție, asigură-te că poți declara variabile și calcula expresii.
Citirea a două numere
#include <iostream>
int main() {
long long a = 0, b = 0;
std::cin >> a >> b;
std::cout << a + b << '\n';
return 0;
}
Pentru datele de intrare:
12 7
rezultatul este 19. Presupunem că intrarea conține două numere întregi între -1000000 și 1000000, astfel încât suma încape în tipul folosit. Limitele fac parte din problemă și trebuie verificate înainte de alegerea tipurilor.
Operatorul >> extrage pe rând valorile și le memorează în a și b. Pentru aceste citiri de numere, spațiile și trecerile la linie nouă separă valorile. Datele 12 pe prima linie și 7 pe a doua produc același rezultat.
Nu introduce text precum a=12 dacă programul așteaptă direct un număr. Exemplele din această lecție presupun o intrare validă, conform enunțului. Inițializarea variabilelor nu înlocuiește validarea datelor introduse de utilizator într-o aplicație reală.
Datele trec prin citire, calcul și afișare.
Ieșirea trebuie să respecte enunțul
Dacă problema cere doar suma, afișează 19, nu Suma este 19. Mesajele suplimentare pot face ca răspunsul să nu corespundă formatului cerut de evaluator.
Pentru două rezultate pe aceeași linie, pune un separator explicit: std::cout << a << ' ' << b << '\n';. Fără spațiul dintre ele, valorile 12 și 7 ar apărea lipite ca 127.
Caracterul '\n' încheie linia. Nu reprezintă două caractere afișate, bară și literă, ci secvența de escape pentru o linie nouă în literalul C++.
Numere cu zecimale
#include <iostream>
#include <iomanip>
int main() {
double a = 0, b = 0;
std::cin >> a >> b;
double medie = (a + b) / 2.0;
std::cout << std::fixed << std::setprecision(2) << medie << '\n';
return 0;
}
Pentru intrarea 7 8, se afișează 7.50. Cu std::fixed, std::setprecision(2) cere două cifre după separatorul zecimal. Antetul <iomanip> declară manipulatorul std::setprecision.
Formatarea schimbă felul în care este afișat rezultatul, nu valoarea păstrată în variabilă. Reprezentarea în virgulă mobilă poate fi aproximativă; nu folosi această afișare ca dovadă că orice calcul cu zecimale este exact. În mediul obișnuit de concurs, scrie în intrare 7.5, cu punct, nu 7,5.
Citirea textului are o regulă în plus
Citirea într-un std::string cu std::cin >> nume extrage un cuvânt delimitat de spații. Pentru o linie întreagă se folosește std::getline. Dacă amesteci citiri de numere cu getline, trebuie să tratezi și separatorul de linie rămas după număr. Vei exersa acest caz în capitolul despre șiruri de caractere; nu presupune că o citire de cuvânt preia automat numele complet al unei persoane.
O rutină simplă de verificare
Înainte de rulare, scrie pe hârtie rezultatul așteptat. Testează apoi date obișnuite, valori zero când sunt permise și capetele intervalului din enunț. Pentru suma a două numere, 0 0, -5 5 și 1000000 1000000 sunt teste utile, cu rezultatele 0, 0 și 2000000.
Dacă programul pare blocat după ce ai introdus un singur număr, verifică dacă nu așteaptă încă al doilea. Dacă rezultatele sunt lipite, verifică separatorii de la afișare.
Exersează
- Citește două numere între
-1000și1000și afișează produsul. - Pentru primul program, ce rezultat obții la intrarea
-12 7? - Pentru al doilea program, ce se afișează la intrarea
2 3? - Afișează două valori pe linii diferite, apoi pe aceeași linie separate printr-un spațiu.
Răspunsuri: înlocuiești suma cu a * b; rezultatul este -5; media formatată este 2.50. Pentru ultima cerință folosești '\n', respectiv ' ' între afișări.
Continuă cu structura de decizie, unde rezultatul depinde de datele citite.
Un pas mai departe
Se încarcă progresul…