Documente Academic
Documente Profesional
Documente Cultură
1
Mădălina Roxana. Buneci
obiectele acelei clase. Aceasta înseamnă că utilizatorii unei clase văd doar
o listă de metode împreună cu semnăturile (anteturile) lor (tipul
parametrilor de intrare și tipul rezultatului), ceea ce poartă denumire de
încapsulare. C++ se distinge de limbajele orientate spre obiect pure prin
faptul că permite controlul accesului atât la datele membre (încapsulare
selectivă), cât și la funcțiile membre ale unei clase (prin folosirea
specificatorilor de control ai accesului: public, private, protected).
• Ierarhia claselor presupune construirea unor structuri arborescente în care
arcele corespund subordonării unei subclase față de o clasă dată. Pentru
subclase se aplică proprietatea de ereditate. Ereditatea este proprietatea prin
care orice subclasă păstrează toate caracteristicile clasei căreia îi este
subordonată. În particular, un obiect A al unei subclase date poate fi utilizat
ca parametru actual în apelul unei funcții ori de câte ori a fost menționat ca
parametru formal un obiect B dintr-o clasa căreia îi este subordonată
subclasa dată. Corpul unei metode dintr-o anumită clasă poate fi redefinit
în oricare din subclasele sale, dar păstrând același nume.
• Polimorfismul constă în esență în posibilitatea asocierii mai multor
implementări aceleași metode, iar sistemul de calcul trebuie să fie în măsură
să stabilească implementarea corespunzătoare metodei apelate. Această
decizie se poate lua fie la compilare (early sau static binding), fie în
momentul execuției (late sau dynamic binding).
Pe scurt obiectul este o variabilă care conține date (atribute) și are funcții
asociate acestuia (comportament asociat). O clasă este un tip de date definit de
programator care este utilizat pentru a declara obiecte. O clasă conține descrieri ale
datelor și funcțiilor care vor fi asociate obiectelor. Declarația unui obiect arată ca o
declarație a unei variabile:
nume_clasa nume_obiect;
Dacă o este un obiect al unei clase și tip_rezultat f(tip1, tip2 ,…) este o metodă
a clasei atunci pentru aplicarea metodei f asupra obiectului o se folosește operatorul
punct
o.f(p1, p2,…)
2
Programarea calculatoarelor și limbaje de programare – notițe de curs/ Curs 5
3
Mădălina Roxana. Buneci
Se pot folosi directive using pentru a face vizibili toți identificatorii dintr-un spațiu de
nume sub forma:
using namespace nume_spatiu;
sau declarații using pentru a face vizibili anumiți identificatori:
using nume_spatiu::identificator;
Domeniul de aplicare al unei directive using este de la locul unde apare până la
sfârșitul blocului sau fișierului (dacă nu a fost plasată într-un bloc).
Se pot defini spații de nume fără nume. În acest caz membrii lor se pot utiliza
de la punctul de declarație până la sfârșitul unității.
Există un spațiu de nume predefinit, cu numele std, din care fac parte toți
identificatorii din biblioteca C++ standard.
4
Programarea calculatoarelor și limbaje de programare – notițe de curs/ Curs 5
std::cin;
fie declarații using
using std::cout;
using std::cin;
fie directiva
using namespace std;
Sintaxa generala de apel pentru cout este de forma:
std::cout << expr1[<<expr2]……[<<exprn1;
unde:
• expri (i=1..n) pot fi literali, constante, variabile, apeluri de funcții sau expresii
valide în limbajul C++, inclusiv manipulatori de format (setw, setiosflags,
setprecision, resetiosflags, setbase, etc);
• << este un simbol atașat fluxului cout, numit și operator de ieșire
Fluxul cout se poate utiliza pentru afișarea unei singure expresii sau mai multor
expresii.
Fluxul de intrare cin, redirectează intrările, citirile, către fișierul standard de
intrare, stdin, asociat, de cele mai multe ori, tastaturii.
Sintaxa generală de apel este de forma:
cin >> v1[>>v2]……[>>vn];
unde:
• vi (i=1..n) sunt variabile de tipuri valide în limbajului C++ sau manipulatori;
• >> un simbol atașat fluxului cin, numit si operator de intrare
Variabilele vi pot fi de tip int, float, double, char sau tipuri derivate ale acestora.
Fluxul cin se poate utiliza pentru citirea mai multor variabile, de pe aceeași linie.
Fluxul cin utilizează caracterele albe (spațiu, tab sau linie nouă) pentru a delimita
valorile variabilelor care urmează să fie citite.
În C++ formatarea ieșirilor și a intrărilor se poate face utilizând
- manipulatori de format
- funcții membre
- flag-uri
5
Mădălina Roxana. Buneci
Manipulatori
Manipulatori sunt funcții speciale proiectate să funcționeze cu operatorii de ieșire
(<<) și intrare (>>) împreună cu unul dintre obiectele asociate fluxurilor de
intrare/ieșire.
Este suficient să utilizăm #include <iostream> pentru folosirea unui manipulator
fără parametri. Pentru folosirea unui manipulator cu parametri trebuie să adăugăm în
secțiunea directivelor preprocesor #include <iomanip>.
Manipulatori definiți în <ios>:
boolalpha
noboolalpha
comută între reprezentarea textuală și numerică a constantelor booleene (false/0, true/1)
showbase
noshowbase
controlează dacă se afișează sau nu un prefix care să indice baza pentru numere
showpoint
noshowpoint
controlează dacă punctul zecimal este afișat întotdeauna pentru un număr în virgulă
mobilă
showpos
noshowpos
controlează dacă semnul + este utilizat cu un număr nenegativ
skipws
noskipws
controlează dacă caracterele albe (whitespaces) sunt ignorate la intrare
uppercase
nouppercase
controlează dacă majusculele sunt utilizate la ieșire în anumite formate
6
Programarea calculatoarelor și limbaje de programare – notițe de curs/ Curs 5
unitbuf
nounitbuf
controlează dacă buferul de ieșire este golit după fiecare operațiune.
Din motive de eficiență, cea mai mare parte a ieșirii nu este trimisă direct la dispozitivul
de ieșire în momentul în care un program folosește o instrucțiune de ieșire (prin
intermediul cout). Mai degrabă este colectat într-un buffer de ieșire din memoria
sistemului. Periodic, conținutul colectat al buferului este golit către dispozitivul de
ieșire într-un bloc mare. Acest lucru este mult mai rapid decât trimiterea ieșirii câte un
caracter odată. Această golire are loc automat atunci când conținutul buferului devine
prea mare. Buferul de ieșire este, de asemenea, golit înainte de executarea unei
instrucțiuni de intrare. Acest lucru se datorează faptului că rezultatul poate fi un prompt
și un mesaj ar trebui să apară pe ecran în întregime înainte ca orice intrare să fie
acceptată. Buferul de ieșire este golit și atunci când fluxul este închis la sfârșitul
programului.
internal
left
right
setează plasarea caracterelor de umplere
dec
hex
oct
modifică baza utilizată pentru operațiile de intrare/ieșire cu întregi/
fixed
scientific
hexfloat (începând cu C++11)
defaultfloat (începând cu C++11)
modifică formatul pentru operațiile de intrare/ieșire cu numere în virgulă mobilă
Dacă nu utilizăm manipulatori (sau echivalentul lor) sau dacă folosim defaultfloat,
formatul implicit pentru fiecare număr în virgulă mobilă depinde de valoarea acestuia.
7
Mădălina Roxana. Buneci
8
Programarea calculatoarelor și limbaje de programare – notițe de curs/ Curs 5
Funcții membre
• setf() – funcția setează flags-urile care trebuie activate
• unsetf() -- funcția resetează flags-urile
• precision() -- setează precizia pentru valorile în virgulă mobilă la un anumit număr
de cifre semnificative după virgulă zecimală
• width() - precizează numărul minim de caractere (coloane) folosite pentru afișarea
datelor specificate în următoare ieșire.
Indicatoarele de aliniere stânga și dreapta se vor aplica atunci când această funcție este
utilizată pentru a specifica lățimile câmpurilor. Spațiul suplimentar din câmp va fi
completat cu un caracter de umplere, care este setat implicit la un spațiu.
Ex.
std::cin.unsetf(std::ios::dec);
std:: cout.width(3)
Manipulatori vs flags-uri
fixed ios::fixed
scientific ios::scientific
ios::showpoint
showpoint
showpos ios::showpos
Right ios::right
Left ios::left
9
Mădălina Roxana. Buneci
#include <fstream>
Operatiile specifice lucrului cu fișiere text sunt:
1) Declararea fluxului asociat unui fișier și deschiderea acestuia:
a. pentru scriere
b. pentru citire
c. pentru citire/scriere
2) Scrierea sau citirea;
3) Închiderea fișierului
Deschiderea unui fişier pentru citire se realizează cu:
ifstream fin(“nume fisier de intrare”);
iar citirea datelor din fişier prin
fin >> variabila;
Deschiderea unui fișier pentru scriere se realizează cu:
ofstream fout(“nume fisier de iesire”);
iar scrierea în fișier prin
fout << expresie;
Închiderea fişierelor se face cu
fin.close();
respectiv,
fout.close();
Exemplu
#include <iostream>
#include <fstream>
using namespace std;
int main () {
ifstream fin("input.txt");
ofstream fout("output.txt");
int a, b;
fin >> hex >> a >> b;
fout << dec << a << " + " << b << " = " << a + b << endl;
10
Programarea calculatoarelor și limbaje de programare – notițe de curs/ Curs 5
fout << showbase << hex << a << " + " << b << " = " << a + b << endl;
fout << oct << a << " + " << b << " = " << a + b << endl;
return 0;
}
Dacă fișierul input.txt conține
b1 a1
După execuția programul fișierul output.txt va conține
177 + 161 = 338
0xb1 + 0xa1 = 0x152
0261 + 0241 = 0522
Dacă nu se folosește directiva using namespace std, trebuie folosit operatorul
de rezoluție pentru a face vizibili identificatorii din spașiul de nume std:
#include <iostream>
#include <fstream>
int main () {
std::ifstream fin("input.txt");
std::ofstream fout("output.txt");
int a, b;
fin >> std::hex >> a >> b;
fout << std::dec << a << " + " << b << " = " << a + b << std::endl;
fout << std::showbase << std::hex << a << " + " << b << " = "
<< a + b << std::endl;
fout << std::oct << a << " + " << b << " = " << a + b << std::endl;
return 0;
}
11