-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
1/80
See discussions, stats, and author profiles for this publication at: http://www.researchgate.net/publication/256780425
Bazele programãrii în limbajul C++
BOOK · JANUARY 2010
CITATION
1
READS
873
1 AUTHOR:
Nicoleta Liviana Tudor
Petroleum - Gas University of Ploiesti
27 PUBLICATIONS 17 CITATIONS
SEE PROFILE
Available from: Nicoleta Liviana Tudor
Retrieved on: 07 December 2015
http://www.researchgate.net/profile/Nicoleta_Tudor2?enrichId=rgreq-0f8a6876-b1a2-4642-90cb-16ec681454d1&enrichSource=Y292ZXJQYWdlOzI1Njc4MDQyNTtBUzoxMDEzMTQwODAwMTg0NTJAMTQwMTE2NjU2NzgzNw%3D%3D&el=1_x_7http://www.researchgate.net/institution/Petroleum-Gas_University_of_Ploiesti?enrichId=rgreq-0f8a6876-b1a2-4642-90cb-16ec681454d1&enrichSource=Y292ZXJQYWdlOzI1Njc4MDQyNTtBUzoxMDEzMTQwODAwMTg0NTJAMTQwMTE2NjU2NzgzNw%3D%3D&el=1_x_6http://www.researchgate.net/institution/Petroleum-Gas_University_of_Ploiesti?enrichId=rgreq-0f8a6876-b1a2-4642-90cb-16ec681454d1&enrichSource=Y292ZXJQYWdlOzI1Njc4MDQyNTtBUzoxMDEzMTQwODAwMTg0NTJAMTQwMTE2NjU2NzgzNw%3D%3D&el=1_x_6http://www.researchgate.net/institution/Petroleum-Gas_University_of_Ploiesti?enrichId=rgreq-0f8a6876-b1a2-4642-90cb-16ec681454d1&enrichSource=Y292ZXJQYWdlOzI1Njc4MDQyNTtBUzoxMDEzMTQwODAwMTg0NTJAMTQwMTE2NjU2NzgzNw%3D%3D&el=1_x_6http://www.researchgate.net/institution/Petroleum-Gas_University_of_Ploiesti?enrichId=rgreq-0f8a6876-b1a2-4642-90cb-16ec681454d1&enrichSource=Y292ZXJQYWdlOzI1Njc4MDQyNTtBUzoxMDEzMTQwODAwMTg0NTJAMTQwMTE2NjU2NzgzNw%3D%3D&el=1_x_6http://www.researchgate.net/institution/Petroleum-Gas_University_of_Ploiesti?enrichId=rgreq-0f8a6876-b1a2-4642-90cb-16ec681454d1&enrichSource=Y292ZXJQYWdlOzI1Njc4MDQyNTtBUzoxMDEzMTQwODAwMTg0NTJAMTQwMTE2NjU2NzgzNw%3D%3D&el=1_x_6http://www.researchgate.net/institution/Petroleum-Gas_University_of_Ploiesti?enrichId=rgreq-0f8a6876-b1a2-4642-90cb-16ec681454d1&enrichSource=Y292ZXJQYWdlOzI1Njc4MDQyNTtBUzoxMDEzMTQwODAwMTg0NTJAMTQwMTE2NjU2NzgzNw%3D%3D&el=1_x_6http://www.researchgate.net/institution/Petroleum-Gas_University_of_Ploiesti?enrichId=rgreq-0f8a6876-b1a2-4642-90cb-16ec681454d1&enrichSource=Y292ZXJQYWdlOzI1Njc4MDQyNTtBUzoxMDEzMTQwODAwMTg0NTJAMTQwMTE2NjU2NzgzNw%3D%3D&el=1_x_6http://www.researchgate.net/institution/Petroleum-Gas_University_of_Ploiesti?enrichId=rgreq-0f8a6876-b1a2-4642-90cb-16ec681454d1&enrichSource=Y292ZXJQYWdlOzI1Njc4MDQyNTtBUzoxMDEzMTQwODAwMTg0NTJAMTQwMTE2NjU2NzgzNw%3D%3D&el=1_x_6http://www.researchgate.net/profile/Nicoleta_Tudor2?enrichId=rgreq-0f8a6876-b1a2-4642-90cb-16ec681454d1&enrichSource=Y292ZXJQYWdlOzI1Njc4MDQyNTtBUzoxMDEzMTQwODAwMTg0NTJAMTQwMTE2NjU2NzgzNw%3D%3D&el=1_x_5http://www.researchgate.net/?enrichId=rgreq-0f8a6876-b1a2-4642-90cb-16ec681454d1&enrichSource=Y292ZXJQYWdlOzI1Njc4MDQyNTtBUzoxMDEzMTQwODAwMTg0NTJAMTQwMTE2NjU2NzgzNw%3D%3D&el=1_x_1http://www.researchgate.net/profile/Nicoleta_Tudor2?enrichId=rgreq-0f8a6876-b1a2-4642-90cb-16ec681454d1&enrichSource=Y292ZXJQYWdlOzI1Njc4MDQyNTtBUzoxMDEzMTQwODAwMTg0NTJAMTQwMTE2NjU2NzgzNw%3D%3D&el=1_x_7http://www.researchgate.net/institution/Petroleum-Gas_University_of_Ploiesti?enrichId=rgreq-0f8a6876-b1a2-4642-90cb-16ec681454d1&enrichSource=Y292ZXJQYWdlOzI1Njc4MDQyNTtBUzoxMDEzMTQwODAwMTg0NTJAMTQwMTE2NjU2NzgzNw%3D%3D&el=1_x_6http://www.researchgate.net/profile/Nicoleta_Tudor2?enrichId=rgreq-0f8a6876-b1a2-4642-90cb-16ec681454d1&enrichSource=Y292ZXJQYWdlOzI1Njc4MDQyNTtBUzoxMDEzMTQwODAwMTg0NTJAMTQwMTE2NjU2NzgzNw%3D%3D&el=1_x_5http://www.researchgate.net/profile/Nicoleta_Tudor2?enrichId=rgreq-0f8a6876-b1a2-4642-90cb-16ec681454d1&enrichSource=Y292ZXJQYWdlOzI1Njc4MDQyNTtBUzoxMDEzMTQwODAwMTg0NTJAMTQwMTE2NjU2NzgzNw%3D%3D&el=1_x_4http://www.researchgate.net/?enrichId=rgreq-0f8a6876-b1a2-4642-90cb-16ec681454d1&enrichSource=Y292ZXJQYWdlOzI1Njc4MDQyNTtBUzoxMDEzMTQwODAwMTg0NTJAMTQwMTE2NjU2NzgzNw%3D%3D&el=1_x_1http://www.researchgate.net/publication/256780425_Bazele_programrii_n_limbajul_C?enrichId=rgreq-0f8a6876-b1a2-4642-90cb-16ec681454d1&enrichSource=Y292ZXJQYWdlOzI1Njc4MDQyNTtBUzoxMDEzMTQwODAwMTg0NTJAMTQwMTE2NjU2NzgzNw%3D%3D&el=1_x_3http://www.researchgate.net/publication/256780425_Bazele_programrii_n_limbajul_C?enrichId=rgreq-0f8a6876-b1a2-4642-90cb-16ec681454d1&enrichSource=Y292ZXJQYWdlOzI1Njc4MDQyNTtBUzoxMDEzMTQwODAwMTg0NTJAMTQwMTE2NjU2NzgzNw%3D%3D&el=1_x_2
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
2/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
3/80
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
4/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
LIVIANA TUDOR
Bazele programãrii în limbajul C++
Editura MATRIX ROM
Bucureşti 2010
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
5/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
Referent ştiinţific
prof. dr. ing. Mircea Petrescu
Universitatea POLITEHNICA Bucureşti
Tehnoredactare computerizatã
lect. dr. Tudor Nicoleta Liviana
Universitatea Petrol-Gaze din Ploiesti
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
6/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
Bazele programãrii în limbajul C++
1. Sisteme de calcul. Reprezentarea datelor în memoria calculatorului
1.1. Componenta hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.
Componenta software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.3. Reprezentarea datelor în memoria calculatorului . . . . . . .
9
9
12
17
2. Principiile programãrii structurate. Metode de reprezentare a
algoritmilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2.1.
Principiile programãrii structurate . . . . . . . . . . . . . . . . . . .
2.2.
Reprezentarea algoritmilor . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3. Aplicaţii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2122
23
28
3. Limbajul C++. Alfabet şi vocabular . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.1. Alfabetul limbajului C++ . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2.
Vocabularul limbajului C++ . . . . . . . . . . . . . . . . . . . . . . . . .
33
33
35
4. Tipuri de date. Operaţii de intrare-ieşire . . . . . . . . . . . . . . . . . . . . . . . .
4.1.
Tipuri fundamentale de date . . . . . . . . . . . . . . . . . . . . . . . .
4.2. Structura programelor în limbajul C++ . . . . . . . . . . . . . . .
4.3. Funcţii uzuale de intrare-ieşire . . . . . . . . . . . . . . . . . . . . . .
4.4.
Operaţii cu consola ( header ) . . . . . . . . . . . .
47
47
50
52
57
5. Structuri decizionale: if, switch, operatorul ?: . . . . . . . . . . . . . . . . . . .
5.1.
Instrucţiunea if şi directiva #if . . . . . . . . . . . . . . . . . . . . . . .5.2.
Instrucţiunea switch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.3. Operatorul ?: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
59
5964
69
6. Structuri iterative. Instruciuni pentru transferul execuţiei . . . . . . . .
6.1.
Instrucţiunea for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
71
71
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
7/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
6.2.
Instrucţiunea while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.3.
Instrucţiunea do-while . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.4. Instrucţiuni pentru transferul execuţiei . . . . . . . . . . . . . . .
76
81
84
7. Tablouri ( vectori, matrice, şiruri de caractere) . . . . . . . . . . . . . . . . . . .7.1. Tablouri unidimensionale ( vectori) . . . . . . . . . . . . . . . . . . .
7.1.1. Cãutare în vectori . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.1.2. Sortarea unui vector . . . . . . . . . . . . . . . . . . . . . . . . .
7.1.3. Interclasarea a doi vectori ordonaţi . . . . . . . . . . . .
7.2. Tablouri bidimensionale ( matrice) . . . . . . . . . . . . . . . . . . .
7.3. Şiruri de caractere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8990
96
99
102
105
109
8. Structuri şi uniuni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8.1. Structuri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8.2.
Uniuni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
117117
126
9. Funcţii C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.1.
Prototipul, definiţia şi apelul unei funcţii . . . . . . . . . . . . . .
9.2.
Transferul parametrilor unei funcţii . . . . . . . . . . . . . . . . . .
9.2.1.
Transferul parametrilor prin valoare . . . . . . . . . .
9.2.2.
Transferul parametrilor prin referinţã . . . . . . . . .9.2.3.
Transferul parametrilor de tip tablou . . . . . . . . .
9.2.4.
Transferul parametrilor de tip structurã . . . . . . .
9.3. Funcţii cu un numãr neprecizat de parametri . . . . . . . . . .
9.4.
Pointeri la funcţii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.5.
Funcţii recursive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.5.1.
Funcţii direct recursive . . . . . . . . . . . . . . . . . . . . . .
9.5.2.
Recursivitatea şi metoda reluãrii (backtracking)
129
129
132
133
136138
142
145
146
148
150
155
10. Structuri de date alocate dinamic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10.1. Operaţii cu variabile de tip pointer . . . . . . . . . . . . . . . . . .
10.2. Pointeri cãtre tablouri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
159
159
165
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
8/80
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
9/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
Capitolul 1
Sisteme de calcul. Reprezentarea datelor
în memoria calculatorului
Un sistem de calcul este un ansamblu de componente hardware(echipamente fizice) şi componente software (componente logice), cecoordoneazã şi controleazã executarea operaţiilor prin intermediul programelorşi oferă servicii utilizatorului:• componenta hardware (echipamente de calcul, dispozitive) asigurã prelucrarea
automatã a informaţiei, precum şi comunicarea utilizatorului cu sistemul de calcul;• componenta software (sistem de operare şi programe specializate).
Programele realizeazã prelucrarea automatã, folosind echipamentele decalcul. Sistemul de operare [Boian F. M., 1994] este un ansamblu de proceduri şiprograme care oferã unui grup de utilizatori posibilitatea de utilizare eficientã asistemului de calcul.
În funcţie de metoda de reprezentare a informaţiei, sistemele de calcul aufost clasificate în:
• sisteme de calcul analogice ( informaţia este codificată sub forma unormărimi fizice);
•
sisteme de calcul numerice, care codifică informaţia sub formă discretă(numerică).
Un sistem de calcul numeric prelucrează automat informaţia codificatăsub formă de valori discrete, conform unui program ce indică o succesiunedeterminată de operaţii aritmetice şi logice, având la bază un algoritm deprelucrare. Structura unui calculator numeric a fost definită în anul 1945 de cătrevon Neumann, ca fiind constituitã din: UI (unitate de intrare), M (memorie),UAL (unitate aritmetico-logicã), UC (unitate centralã) şi UE (unitate de ieşire).
1.1. Componenta hardware
Schema de principiu a unui sistem de calcul este prezentatã în figura 1:
Unitatea centralã (UC) gestioneazã activitatea componentelor sistemuluide calcul, asigurã execuţia programelor din memoria centralã şi executãoperaţiile de prelucrare automatã a informaţiilor.
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
10/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
UC = CPU (unitate centralã de prelucrare ) + MI ( memorie internã )
CPU = UCC ( unitate de comandã şi control ) + UAL ( unitate aritmetico-logicã)
Fig. 1. Schema unui sistem de calcul.
Unitatea centralã conţine memoria centralã, unitatea aritmetico-logicã şiunitatea de comandã şi control.
Memoria centralã conţine regiştrii pentru memorarea temporarã a datelorprogramului care se executã şi pãstreazã datele în locaţii codificate binar,identificate prin adrese de memorie.
Dispozitivele aritmetico-logice executã operaţiile aritmetice şi/sau logicesau alte operaţii specificate de instrucţiunile executate.
Unitatea de comandã şi control coordoneazã activitatea celorlaltecomponente ale sistemului de calcul şi asigurã buna funcţionare a unitãţiicentrale.
Unitãţile de schimburi multiple permit comunicarea între sistemul decalcul şi exterior, coordonând funcţionarea dispozitivelor periferice.
Dispozitivele periferice sunt imprimanta, monitorul (display – ecran),unitãţile de discuri, tastatura, mouse, scanner, plotter, boxe, camerã Web.
Unitatea de memorie : Unitatea fundamentalã de mãsurã a memoriei estebitul.
Bit (binary digit) = cantitatea de informaţie ce poate fi memoratã într-ocelulã binarã.
O locaţie de memorie = o succesiune de celule binare folosite în timpuloperaţiilor de citire din memorie sau scriere în memorie.
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
11/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
Un octet (byte) 1o = 1 B = 8 biţi = cantitatea de informaţie memoratã într-olocaţie.
Capacitatea totalã a memoriei reprezintã numãrul maxim de octeţi ce potfi înregistraţi.
Un Kilo-octet 1 Ko = 1 Kb (kilo-byte) = 1024 o = 210 o
Un Mega-octet (1 Mo) = 1024 Ko = 210 KoUn Giga-octet = 1024 Mo = 210 MoUn Tera-octet = 1024 Go = 210 Go
Memoria este de douã tipuri :• memorie internã pãstreazã datele şi instrucţiunile programelor în locaţii dememorie identificate prin adrese sub formã de cifre binare, grupate în octeţi(byte), date care sunt prelucrate de procesor.
Din punct de vedere logic, memoria internă este organizată în blocuri dememorie, 1 bloc = 64 Kb.
Se cunosc urmãtoarele tipuri de memorii interne:- memoria RAM (Random Access Memory) este memoria cu acces aleator,ce conţine datele programului ce este executat la momentul curent,procedurile/programele sistemului de operare. Este volatilã (conţinutul eidispare la închiderea calculatorului) şi asigurã accesul rapid la date, prinoperaţii de citire şi scriere. Din punct de vedere fizic, memoria RAM este uncircuit integrat alcãtuit din milioane de tranzistoare şi condensatoare.Memoria RAM poate fi: SRAM şi DRAM:SRAM (static) – utilizeazã mai mulţi tranzistori pentru o celulã de memorieşi este folositã în special în memoria CACHE. Memoria cache stocheazãdatele refolosite de către procesorDRAM (dinamic) – utilizeazã o pereche tranzistor/condensator pentrufiecare celulã de memorie şi necesitã un refresh continuu deoarecetranzistorul se descarcã foarte rapid. O celulã stocheaza 1 bit. Celulele suntdispuse într-o matrice de linii şi coloane la intersecţia cãrora se aflã adresade memorie.- memoria ROM (Read Only Memory) din care se pot doar citi date, nu şiscrie. Nu este volatilã. Include:PROM (Programmable Read Only Memory)EPROM (Eraseable Programmable Read Only Memory) – permite în plusştergerea datelorEEPROM (Electricaly Eraseable Programmable Read Only Memory) – pot fiatât citite cât şi şterse în mod selectiv şi programate de cãtre sistemul care leutilizeazã.- memoria CMOS conţine informaţii despre caracteristicile fizice alecalculatorului (configuraţia calculatorului, tipul şi capacitatea HDD,capacitatea memoriei interne, data calendaristicã, parola de acces etc.),informaţii utilizate de BIOS (Basic Input Output System). Memoria CMOS
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
12/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
are capacitate foarte micã (64B), permite operaţii de citire şi scriere a datelorşi este nevolatilã.
• memorie externã constituitã din suporturi electromagnetice sau opticereutilizabile, pe care se pãstreazã datele codificate în formã binarã. Memoria
externã este mai lentã decât memoria internã, dar conţine cantitãţi mari de date.Memoria externã utilizeazã:
- suporturi electromagnetice (floppy-disk, hard-disk HDD) – suprafaţadiscului este împãrţitã în piste (cercuri concentrice), care sunt împãrţite însectoare egale. Pistele care au aceeaşi razã formeazã un cilindru. Locaţia dememorare de pe disc este sectorul, care are o capacitate de 512 octeţi- suporturi optice – discurile optice (discuri compact-CD si discuri DVD-disc video digital). Suprafaţa discului este împãrţitã în piste continue, înformã de spiralã. Spaţiul de memorare este divizat în blocuri pentruadresarea unei locaţii.
- suporturi electronice – cardurile de memorie flash. Celulele binare (biţii)utilizaţi corespund stãrii anumitor circuite (închis-deschis, prezenţa sauabsenţa curentului electric în circuite).
Hard Disk-ul ( disc dur, rigid) conţine un strat magnetic pe un suportrigid. Disk-ul hard este construit dintr-un metal dur şi uşor, de obicei dinaluminiu, fiind singura componentã a unui PC care nu este 100% electronicã. Dinaceastã cauzã, ea este şi mai înceatã, în comparaţie cu restul componentelorcalculatorului personal.
1.2. Componenta software
Componenta software este formatã din sistemul de operare ( S.O.) şiprogramele pentru aplicaţii.
Definiţie 1 – Sistemul de operare este un set de proceduri manuale şiautomate care oferã unui grup de utilizatori posibilitatea sã foloseascã în acelaşitimp şi în mod eficient sistemul de calcul.
Definiţie 2 – Sistemul de operare este un ansamblu de programe carefaciliteazã accesul la sistemul de calcul unuia sau mai multor utilizatori şi asigurão exploatare eficientã a echipamentului de calcul.
Caracteristicile sistemului de operare:- este rezident în memoria internã (RAM) a calculatorului (se încarcã automatla fiecare deschidere sau resetare a calculatorului)- conţine un încãrcãtor (care se aflã pe prima pistã a fiecãrui disc de boot)-
în memoria ROM, existã un preîncãrcãtor care este folosit la iniţializarealucrului cu calculatorul (iniţializarea echipamentelor periferice, identificareaconfiguraţiei sistemului de calcul, cãutarea unui disc de boot (cu sistemul de
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
13/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
operare). Acesta încarcã în RAM nucleul sistemului de operare şi îl lanseazã înexecuţie. Nucleul va încãrca programele de aplicaţie şi utilitarele.
Componentele sistemului de operare sunt:- nucleul ( Kernel )
-
interfaţa ( shell )
Nucleul ( Kernel) conţine programele necesare pentru gestionarearesurselor calculatorului şi pentru controlarea activitãţii echipamentelor.
Funcţiile nucleului constau în:- administrarea resurselor fizice: procesorul, memoria internã şi sistemul I/O(Input/Output)- depistarea şi tratarea evenimentelor deosebite (inexistenţa hârtiei laimprimantã, citirea dintr-un fişier inexistent, rezultatul unei operaţii aritmetice cedepãşeşte capacitatea zonei de memorie alocatã)
-
asigurã operaţiile de I/O la nivel fizic (cu echipamentele periferice)- asigurã operaţiile de I/O la nivel logic (unitatea logicã de acces laechipamentele periferice este fişierul)- gestionarea fişierelor de pe disc.
Interfaţa sistemului de operare (SHELL)- defineşte modul în care utilizatorul interacţioneazã cu S.O.- interfaţa poate folosi: un limbaj de comandã (ex. s. o. MS-DOS) sau interfaţagraficã (G.U.I. - graphical user interface, ex. s. o. Windows ).
Funcţiile sistemului de operare sunt:
- pregãtirea şi lansarea în execuţie a programelor de aplicaţii ( figura 2):- funcţia de gestiune a memoriei ( stabilirea procesului cãruia i se alocãmemorie, momentul de timp şi cantitatea, în cazul multiprogramãrii, alocarearesursei asigurând accesul şi protecţia proceselor solicitante şi dezalocarearesursei)- funcţia de gestiune a procesorului ( U. C. ) – alocã resursele procesorului laun proces, prin pregãtirea şi încãrcarea unor regiştrii hardware şi dezalocãresursa- funcţia de gestiune a dispozitivelor periferice, a unitãţilor de control şi acanalelor ( I/O Traffic Controller) – alocã resura şi iniţiazã operaţia de I/O şi
dezalocã resursa- funcţia de gestiune a informaţiei constã în:
• localizarea informaţiei, starea, utilizarea ( File System)• metode de acces şi protecţie
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
14/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
Fig. 2. lansarea în execuţie a unui program.
•
alocarea resursei prin deschiderea fişierului ( OPEN)•
dezalocarea resursei prin închiderea fişierului ( CLOSE).
Programele S. O.Componentele majore ale unui S.O. sunt:
• programe de comandã şi control ( PCC ) - coordoneazã şi controleazãfuncţiile S.O., fiind programe supervizoare, monitoare şi executive). Aucomponente
- rezidente ( sunt încãrcate în memoria internã încã de la generarea
S.O. şi pãstrate acolo pe tot parcursul execuţiei lucrãrilor de cãtreS.O., ele formeazã nucleul S.O.)- tranzitorii ( componente ce rãmân în memoria auxiliarã, fiind apelate
şi executate de cãtre nucleul S.O.)• programe de servicii ( folosite pentru dezvoltarea programelor de aplicaţie,fiind executate sub supravegherea PCC ). Ele pot fi clasificate în:
- translatoare (asamblor, macroasamblor, compilator, interpretor )- editoare de legãturi- încãrcãtoare- editoare de texte-
programe pentru organizarea colecţiilor de date ( fişiere, baze dedate)- alte utilitare.
Translatoarele de limbaje• traduc programele sursã în programe obiect, ale cãror instrucţiuni în limbajmaşinã pot fi executate de sistemul de calcul• sunt douã categorii de translatoare:
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
15/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
- compilative ( realizeazã numai traducerea programului sursã înprogram obiect), de exemplu:
- asambloare – traduc programele sursã, scrise în limbaje deasamblare specifice S.C.- compilatoare – traduc programele sursã scrise în limbaje
evoluate; unele compilatoare efectueazã şi lansarea în execuţie aprogramelor ( LOAD and GO)
- interpretative (odatã cu compilarea, are loc si execuţia programului ).
Compilatoarele creeazã o formã intermediarã arborescentã ainstrucţiunilor din programul sursã, astfel:- orice variabilã este un nod terminal al arborelui- orice operator creeazã un arbore binar a cãrui ramurã stângã este primul
operand, iar cea din dreapta este operandul 2.Exemplu: Sã se construiascã arborele binar corespunzator acţiunii unui
compilator, pentru calculul expresiei x ( figura 3):x = a * ( b – c ) + d * ( e + 10)
Fig. 3. arbore binar corespunzãtor ac iunii unui compilator.
Etapele unui proces de compilare şi componentele implicate suntevidenţiate în figura 4:
Analiza lexicalã – descompune programul sursã în atomi lexicali(identificatori, cuvinte rezervate, constante, operatori ) şi îi introduce în tabela desimboluri sub formã codificatã.
Analiza sintacticã – şirul de atomi lexicali este analizat pentru depistareaunor structuri sintactice, cum ar fi expresii, liste, proceduri, plasându-le într-unarbore de derivare.
Analiza semanticã – genereazã un grup de instrucţiuni simple cu formatfix (cod intern); dacã arborele sintactic nu respectã gramatica limbajului, sesemnaleazã eroare.
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
16/80
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
17/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
• sistemul de operare Netware, utilizat pentru administrarea serverelor defişiere, stocarea fişierelor, asigurând prelucrarea distribuitã şi centralizatã adatelor, securitatea sistemului (exemplu, reţele Novell Netware).Comunicarea este asiguratã de:
- folosirea de protocoale şi drivere LAN
- încãrcarea lui Netware Dos Requester pe fiecare client al reţelei- folosire Link Support Layer (LSL)- exemple de tipuri de clienţi acceptaţi de S.O. Netware 3.12. sunt:
clientul DOS, OS/2, Macintosh, UnixProtocolul de comunicaţie este un set de reguli ce determinã modul de
comunicare în reţea, între staţii de lucru şi server.
1.3. Reprezentarea datelor în memoria calculatorului
Fie p ∈ N, p ≥ 2.Definiţie. Se defineşte o bazã de numeraţie: Bp={ bi / 0 ≤ i < p},
corespunzãtoare primelor p numere naturale [Perjeriu E., Vaduva I., 1986]:Np = {0, 1, …. , p-1}.
Funcţia f: Np → Bp asociazã fiecãrui numãr i ∈ Np → simbolul bi = f( i ) ∈ ∈Bp,
f( i ) = bi.Observaţie: Sistemele de calcul utilizeazã bazele de numeraţie 2 şi 16:
B2 = { 0, 1}
B16
= { 0, 1, 2, ...., 9, A, B, C, D, E, F}.
Reprezentarea numerelor întregi intr-o bazã de numeraţie datãFie x ∈ N şi p ∈ N, p ≥ 2, p este o bazã de numeraţie. Ne propunem sã
reprezentãm numãrul întreg x în baza p.Prin împãrţiri repetate ale numãrului x la p se obţin :x = p * co + ro, co < x, 0 ≤ ro < pco = p * c1 + r1, c1 < co , 0 ≤ r1 < p…………………………………..cn-1 = p * cn + rn, cn = 0 < cn-1, 0 ≤ rn < p
⇒ x se poate reprezenta ca un polinom:x = p * co + ro = p * (p * c1 + r1 ) + ro = ... = pn rn + ... + p1r1 + p0r0.
În şirul resturilor : rn, rn-1, ... , r1 , r0, se aplicã funcţia f :
f( ri) = fi ∈ Bp (0 ≤ ≤ i < n) şi se concateneazã ⇒ se obţine reprezentareanumãrului x în baza p:
xp = fn … f1f0
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
18/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
x co c1 … cn = 0ro r1 … rn f0 f1 … fn
Exemplul 1: Sã se reprezinte numãrul x = 27 în baza 2
x = 27 co = 13 c1 = 6 c2 = 3 c3 =1 c4 = 0r0 = 1 r1 = 1 r2 = 0 r3 = 1 r4 = 11 1 0 1 1
Reprezentarea numãrului 27 în baza 2 este: 272 = 11011= 1*2o+1*21 + 0*22 +1* 23+ 1*24 = 1 + 2 + 8 + 16 = 27
Exemplul 2: Sã se reprezinte numãrul x = 6 în baza 2
x = 6 co = 3 c1 = 1 c2 = 0r0 = 0 r1 = 1 r2 = 10 1 1
Reprezentarea numãrului 6 în baza 2: 62 = 110 = 0*2o+1*21 + 1*22 = 6
Exemplul 3: Sã se reprezinte numãrul x = 27 în baza 16
x = 27 co = 1 c1 = 0r0 = 11 r1 = 1B 1
Scrierea numãrului 27 în baza 16: 2716 = 1B = B*160 + 1*161 = 11 + 16 = 27
Reprezentarea numerelor reale intr-o bazã de numeraţie datã
Fie x ∈ R+ şi p ∈ N, p ≥ 2, p este o bazã de numeraţie. Atunci numãrulreal x se poate scrie:
x = [x] + {x}, 0 ≤ {x} < 1,
unde [x] este partea întreagã a lui x şi {x} este partea fracţionarã a lui x.Reprezentarea numãrului real x în baza p se reduce la reprezentarea
numãrului {x} în baza p şi foloseşte urmãtorul algoritm:•
se înmulţeşte în mod repetat partea fracţionarã a lui x cu baza p•
se descompune în parte întreagã şi parte fracţionarã, ş.a.m.d.Notãm x1 = p * {x} = [x1] + {x1} = r -1 + {x1}, 0 ≤ r -1 < p
x2 = p * {x1} = [x2] + {x2} = r -2 + {x2}, 0 ≤ r -2 < p
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
19/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
x3 = p * {x2} = [x3] + {x3} = r -3 + {x3}, 0 ≤ r -3 < p
……………………………………………………..
xn = p * {xn-1} = [xn] + {xn} = r -n + {xn}, 0 ≤ r -n < p.
Se obţine reprezentarea polinomialã a lui {x}:
{x} = p-1 r-1 + p-2 r-2 + ... + p-nr-n + ...
Notãm f( r -i) = f -i ∈ Bp (1 ≤ i < n) ⇒ reprezentarea aproximativã a lui {x}p cu n cifre la partea zecimalã este:
{x}p = p-1 r-1 + p-2 r-2 + ... + p-nr-n + ... = f( r –1) f( r –2) … f( r -n) = f –1 f –2 … f -n
{x} x1 x2 … xn r -1 r -2 … r -n
f –1 f –2 … f -n Exemplu: Sã se reprezinte x = 27.513 cu 4 cifre zecimale în baza 16
x = 27.513 = 27 + 0.513 = [x] + {x}
[x] = 27 1 011 1B 1
[x] 16 = [ 27 ]16 = 1B
{x} = 0.513 0513*16 = 8.228 0.228*16 = 3.648 0.648*16 = 10.368 5.888
8 3 10 58 3 A 5
{ x } 16 = { 0.513 } 16 = 0.83A5
x 16 = [x] 16 + { x } 16 = 1B + 0.83A5 = 1B.83A5
Reprezentarea numerelor întregi în memoria calculatorului
Pe un cuvânt-memorie ( 4o = 32 biti), se pot înregistra numere întregi
pozitive cu maximum 32 cifre binare sau 8 cifre hexazecimale < 232 – 1.Se partiioneazã intervalul [ 0, 232 – 1] în: [ 0, 231 – 1] U [231, 232 – 1]
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
20/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
y =
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
21/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
Capitolul 2
Principiile programãrii structurate.
Metode de reprezentare a algoritmilor
Rezolvarea problemelor cu ajutorul calculatorului presupune existenţa uneifaze premergãtoare în care se concepe algoritmul.
Un algoritm este o secvenţã finitã de operaţii, ordonatã şi complet definitã,
care, pornind de la date de intrare, furnizeazã date de ieşire (rezultate).Un algoritm trebuie sã satisfacã în general urmãtoarele cerinţe:• claritate – descrierea algoritmului se realizeazã într-un mod precis, fãrãambiguitãţi, conţinând toate etapele de calcul, toate posibilitãţile ce apar, pentrua obţine o soluţie• generalitate – un algoritm este util dacã rezolvã o clasã întreagã de probleme• finitudine - algoritmul trebuie sã furnizeze rezultate pentru orice set de datede intrare, într-un numãr finit de paşi. O eroare care trebuie evitatã constã înutilizarea de structuri repetitive infinite ( bucle infinite), care blocheazãprogramele.
Operaţiile elementare care apar într-un algoritm sunt:- operaţii de citire-scriere ( intrare-ieşire) – datele de intrare se citesc, iar
datele de ieşire se scriu- operaţii de atribuire – unei variabile i se atribuie valoarea unei expresii- operaţii de decizie – se determinã valoarea de adevãr a unei expresii
logice şi, în funcţie de rezultatul obţinut, se ramificã execuţiaalgoritmului.
Algoritmii utilizeazã variabile pentru operaţiile elementare. De exemplu,variabilele de intrare se citesc, se prelucreazã, iar variabilele de ieşire se afişeazã(se scriu).
VariabileO noţiune de bazã în programare este cea de variabilã. O variabilã
reprezintã un ansamblu de patru elemente:- numele variabilei- tipul ei- valoarea ei- adresa din memorie, unde se salveazã variabila.
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
22/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
Numele unei variabile este format din unul sau mai multe caractere: litere,cifre, caracterul underscore (de subliniere), primul caracter fiind literã. Referireaunei variabile se realizeazã prin intermediul numelui sãu. Exemple: a, b, S, min,maxim, x1, etc.
Tipul variabilei indicã mulţimea de valori posibile ( întreg, real, caracter,
boolean, etc.), operaţiile ce pot fi aplicate acesteia, precum şi modul dereprezentare în memoria calculatorului. Fiecare limbaj de programare permitefolosirea unor tipuri elementare de date, specifice acestuia. Pentru fiecarevariabilã folositã trebuie declarat în mod explicit tipul de date.
Valoarea unei variabile este valoarea efectivã memoratã la un moment dat. Ovariabilã are în orice moment o singurã valoare, care se poate modifica printr-oinstrucţiune de atribuie sau de citire.
Adresa de memorie a unei variabile este adresa fizicã la care se aflã valoareavariabilei în memoria calculatorului.
2.1. Principiile programãrii structurate
Odatã cu dezvoltarea informaticii a apãrut conceptul de programarestructuratã. Ideea de bazã constã în elaborarea algoritmilor folosind structurielementare, având un singur set de date de intrare şi un singur set de date deieşire.
Un principiu de bazã al programãrii structurate este enunţat de teorema destructurã a lui Böhm şi Jacopini, conform cãreia orice algoritm se poate construifolosind doar trei structuri de control: secvenţialã, alternativã ( decizionalã) şirepetitivã.
Structurile elementare utilizate în programarea structuratã sunt prezentate în figura 1.
- structura liniarã ( secvenţialã) – constã în execuţia necondiţionatã aunei secvenţe de instrucţiuni
- structura alternativã (decizia) – ramificã execuţia algoritmului înfuncţie de valoarea de adevãr a unei condiţii evaluate
- structura repetitivã ( repetiţia) – constã în execuţia repetatã de unnumãr finit de ori a unei secvenţe de instrucţiuni. Existãposibilitatea utilizãrii de structuri repetitive cu test inţial (seevalueazã condiţia la început şi dacã este îndeplinitã, se executãinstrucţiunile) sau structuri repetitive cu test final ( se executãinstrucţiunile cel puţin o datã şi la final se evalueazã condiţia).
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
23/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
Fig. 1. Structuri de control.
Un principiu de bazã al programãrii structurate este programareadescendentã, care presupune descompunerea unei probleme complexe însubprobleme mai simple. Fiecãrei subprobleme îi corespunde un modul deinstrucţiuni, realizându-se astfel o structurare modularã a problemelor. Un
avantaj al programãrii modulare constã în extinderea şi modificarea programelorprin actualizarea sau adãugarea unor module cu instrucţiuni.
2.2. Reprezentarea algoritmilor
Pentru descrierea algoritmilor se pot utiliza:- schema logicã- pseudocodul- limbajul de programare
Schema logicãEste o reprezentare graficã, ce permite vizualizarea înlãnţuirii şi
subordonãrii secvenţelor de operaţii. Foloseşte simboluri grafice numite blocuricare prin forma lor, indicã tipul operaţiei.
PseudocodulEste o metodã de reprezentare a algoritmilor ce tinde spre un limbaj de
programare, neavând totuşi o sintaxã rigidã, precum limbajele de programare.Elementele componente ale limbajului pseudocod sunt:
•
instrucţiuni pentru scriere
write lista_variabile
Exemple: write x
write (“suma este “, s)
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
24/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
•
instrucţiuni pentru citire
read lista_variabile
Exemple: read n
•
instrucţiuni de atribuire
variabila expresie
Exemple: S 0
S = 0
• instrucţiuni decizionale
if condiţie then instructiune_1else instructiune_2
endifExemplu: if x >=0 then write ( “ numar pozitiv”)
else write (“negativ”)
endif
•
instrucţiuni repetitive cu contor
for contor = valoare_initiala, valoare_finalainstructiune_1
instructiune_2…
endor
sau:
for contor = valoare_initiala, valoare_finalainstructiune_1instructiune_2…
repeat
Exemplul 1) afişarea primelor 100 numere naturale
for i = 1 , 100
write i
repeat
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
25/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
Exemplul 2) Calculaţi suma primelor n numere naturale ( n este dat):
procedure sumaread ns 0
for i = 1 , ns s + irepeatwrite (‘suma s =’,s)
end
•
instrucţiuni repetitive cu test iniţial
while conditie:instructiune_1instructiune_2
…repeat
Exemplul 1) afişarea primelor 100 numere naturale
i = 1
while i
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
26/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
Exemplul 1) afişarea primelor 100 numere naturale
i = 0
do
i i +1
write i
until i >= 100
Exemplul 2) Afişaţi primele n numere naturale, unde n este dat.
procedure afisareread ni = 1do
write i
i
i+1until i >= n+1end
•
instrucţiuni pentru apelul procedurilor
procedure nume [ ( lista de parametri formali )]
[ declaratii locale]
[ secvenţã de instrucţiuni ]
[ return]
endObservaţii:
- apelarea unei proceduri se realizeazã prin instrucţiuneacall nume [ (lista de valori)]
- o apelare corectã are loc dacã între lista parametrilor şi cea avalorilor existã o bijecţie ( corespondenţã de numãr, tip şiordine)
- o procedurã poate apela o altã procedurã- terminarea execuţiei unei proceduri se face la întâlnirea unei
instrucţiuni return sau end, care determinã întoarcerea înprogramul apelant, la instrucţiunea imediat urmãtoareinstrucţiunii call, care a apelat-o.
Exemplu: Sã se calculeze suma a 2 numere a şi b realeprocedure sumainteger a, b, sread a, bs a + b
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
27/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
write (‘ suma = ‘, s)returnend
Apelul procedurii într-o aplicaţie se realizeazã asfel:call suma
•
instrucţiuni pentru apelul funcţiilor
function nume [ ( lista de parametri formali )]
[ declaratii locale]
[ secvenţã de instrucţiuni ]
[ return]end
Observaţii:
- apelarea unei funcţii se realizeazã prin instrucţiuni precum:call nume [ (lista de valori)]sauexpresie nume [ (lista de valori)]sau alte tipuri de instrucţiuni de scriere sau repetitive, etc., înfuncţie de aplicaţie
Exemplu: Sã se calculeze valoarea funciei f definitã astfel
f(x) =
>+
≤≤
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
28/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
GOTO etichetã
unde eticheta indicã o instrucţiune din aceeaşi procedurã
Este indicat sã evitãm folosirea instrucţiunii goto deoarece îngreuneazã înţelegerea algoritmului
•
declaraţia unui tablou
array A( n )
2.3. Aplicaţii
Se dau 3 numere reale x, y, z. Sã se calculeze valoarea expresiei:
E =
>
=
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
29/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
procedure calculread ns 0i = 1while i = n
write (‘suma s =’,s)end
Sã se citeascã n natural. Afişai divizorii unui numãr n.
procedure divizoriread nsw 0for i = 2 , int ( n/2)
if n /i = int ( n/i)write ( i, ‘ divizor’)sw 1
endifrepeat
if sw = 0 then write (‘nu exista divizori’)endifend
Fie vectorul A = ( a[1], a[2], ..., a[n]), unde n este numãr natural dat. Numãraielementele pare.
procedure divizoriarray a[n]
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
30/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
read nsw 0for i = 1 , n
read ( a[i])if a[i] mod 2 = 0 { restul impartirii la 2 }
write ( a[i], ‘ numar par’)sw 1
endifrepeatfor i = 1 to nwrite { a[i] )repeatif sw = 0 then write (‘nu exista numare pare’)endif
end
Ordonarea crescãtoare a elementelor unui vector prin interschimbarea elementelor
procedure ordonarearray a[n]read nfor i = 1 , n
read ( a[i])repeatwrite (‘vectorul initial:’)for i = 1 to n
write { a[i] )repeatfor i = 1 to n – 1
for j = i + 1 to nif a[i] > a[j] then
aux a[i]a[i] a[j]a[j] aux
endifrepeat
repeat
write (‘vectorul ordonat crescator:’)for i = 1 to n
write { a[i] )repeat
end
Fie o matrice pãtraticã de ordinul n, cu numere întregi. Sã se calculeze sumaelementelor de pe diagonala secundarã a matricei:
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
31/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
procedure diagonalaarray a[n, n]read nfor i = 1 , n
for j = 1 to n
read ( a[i, j])repeat
repeatwrite (‘matricea A:’)for i = 1 to n
for j = 1 to nwrite ( a[i, j])
repeatwriteln
repeat
s 0for i = 1 to nfor j = 1 to n
if i + j = n + 1 then s s + a[i, j]endif
repeatrepeatwrite (‘s =’, s)
end
•
Fie n un numãr întreg. Sã se verifice dacã este prim.
procedure primread nsw 0for i = 2 , int ( n/2)
if n /i = int ( n/i)sw 1
endifrepeatif sw = 0 then write (n, ‘este prim’)
else write (n, ‘nu este prim’)endif
end
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
32/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
Probleme propuse
1.
Fie o matrice A(m, n), cu m linii şi n coloane, cu elemente numere întregi. S se formeze un şir cu elementele pare, respectiv un şir cu elementele impare.
2.
Se d o matrice ptratic A(n, n), cu n linii şi n coloane, cu elemente numere
întregi. S se ordoneze cresctor elementele de pe diagonala principal, prinpermutri de linii şi coloane.
3.
Fie un vector A( n), cu elemente numere reale. S se inverseze elementelevectorului ( primul ↔ ultimul, al doilea ↔ penultimul, etc.). Exemplu: pentruA = ( 1.5, 5.7, -2.3, 25.2), rezult A = ( 25.2, -2.3, 5.7, 1.5).
4.
Pentru dou matrice A(m,n) şi B(m, n), s se determine matricea sum C(m,n),C = A + B.
5.
Fie o matrice A ( m, n), cu elemente de tip char . S se ordoneze cresctorelementele de pe fiecare linie a matricei.
6. Fie un vector A ( n), cu numere întregi. S se transforme vectorul A în
mulţimea B ( elementele unei mulţimi sunt unice). 7. Fie un numr n întreg dat. S se calculeze suma cifrelor sale. 8.
Se citeşte în mod repetat un numr n natural pân la introducerea unui numrn = 0. S se determine cifra maxim a fiecrui numr n.De exemplu, n = 48 ( max = 8 )
n = 731 ( max = 7)n = 0
9. S se citeasc în mod repetat un numãr pân la introducerea rspunsului ‚N’sau ‚n’ la întrebarea „Mai citiţi date? ( d/ n)”. Care este cel mai mare numãr?10. Se citesc n numere naturale. S se numere câte cifre are şirul de numere.
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
33/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
Capitolul 3
Limbajul C++. Alfabet şi vocabular
În anul 1970, Brian Kerninghan si Dennis Ritchie au definit şi dezvoltatlimbajul C , un limbaj foarte flexibil care permite atât programarea la nivel înalt,cât şi la nivel scãzut, fiind un limbaj procedural. Principalul scop pentru care afost realizat acest limbaj a fost rescrierea sistemului de operare UNIX , pentru a-lface portabil pe toate platformele existente.
În anul 1980, Bjarne Stroustrup a conceput limbajul "C with Classes", ovariantã îmbunãtãţitã a limbajului C, care permite lucrul cu clase. În 1983, C-with-classes a fost dezvoltat şi redefinit ca limbaj C++, ce oferã facilitãţi deprogramare orientatã pe obiecte.
Aplicaţiile orientate pe obiecte sunt mai uşor şi mai rapid de scris, princrearea sau dezvoltarea de tipuri de obiecte aparţinând claselor predefinite saudefinite de utilizator.
Există câteva limbaje dezvoltate ca extinderi ale limbajului C, printre carese pot enumera Visual C++, C#, Java, Javascript. De exemplu, Visual C++ este oversiune de compilator C++, produs de Microsoft, care permite crearea de
programe în mediul Windows.Exemplele din aceastã carte au fost realizate folosind mediul de dezvoltareBorland C++, versiunea 3.1., care pune la dispoziţie metoda de programare laconsolã, sau programarea sub sistemul de operare DOS. Existã o opţiune DOSshell în meniul File care asigurã lucrul exclusiv sub sistemul de operare MS-DOS.
3.1. Alfabetul limbajului C++
Alfabetul limbajului C este alcãtuit dintr-o mulţime de simboluri afişabile
şi neafişabile [ Marinoiu C, 2000].
Simbolurile afişabile ( care pot fi reprezentate grafic) sunt:
- litere mici / mari ale alfabetului englez: a, ..., z, A, ..., Z
- cifre zecimale 0, 1, 2, ... , 9
- linia de subliniere _ (underscore)
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
34/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
- semne de punctuaţie şi semne speciale (unele simboluriconstituie operatori în cadrul expresiilor)
; : , ? . “ < > = ! \ & ̂ * + - / % # ~
Câteva exemple de simboluri şi semnificaţiile acestora sunt prezentate în
tabelul 1:semn semnificaţie
# diez
& ampersand
/ slash
\ backslash
~ tildaTabelul 1. simboluri C++
Simbolurile neafişabile ( fãrã echivalent grafic)- reprezentate prin secvenţe escape ( de evitare) sau coduri backslash-caracter- sunt coduri ASCII care nu pot fi citite de la tastaturã
Exemple de secvene escape sunt prezentate în tabelul 2:
secvenţe escape semnificaţie
\n new line
\b backspace ( recul cu o poziţie)
\f form feed ( salt la paginã nouã)
\r carriage return ( retur de car)
\t horizontal tab
\v vertical tab
\ddd caracter ASCII în notaţie octalã ( baza 8)
\xdd caracter ASCII în baza 16
Tabelul 2. secvenţe ESCAPE
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
35/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
3.2. Vocabularul limbajului C++
Vocabularul limbajului C++ este alcãtuit din atomi lexicali: identificatori cuvinte cheie
constante semne de punctuaţie
simboluri speciale
operatori
Identificatori – reprezintã secvenţe de litere, cifre, liniuţe de subliniere,primul caracter fiind obligatoriu literã sau caracterul underscore ( _ ), fiindfolosite pentru numele variabilelor, funcţiilor, etc.
Ex: program_1, a0, SExemple de identificatori care nu sunt acceptaţi: x..a, a&b, &a
Cuvinte cheie – cuvinte rezervate în limbajul C++. Ele nu pot fi folosite caidentificatori. Limbajul standard ANSI C are 32 cuvinte cheie.
Ex: void, if, for, while, do, int, float, char, case, break, continue, else,include, switch, return, main.
Constante– pot fi numere, caractere, şiruri de caractere- valoarea lor nu se modificã în timpul execuţiei programului
-
în limbajul C, existã 4 tipuri de constante ( întregi, reale, de tipcaracter, şiruri de caractere)
- modul de declarare: este urmãtorul:
const tip var = valoare;
Printr-o astfel de declaraţie, se permite asignarea unei valori iniţiale uneivariabile ce nu poate fi modificatã ulterior în program.
Exemple:i.constante întregi: 179, -28
ii.constante octale ( în baza 8) încep cu cifra 0 pentru identificare: 012,
074, 023iii. constante hexazecimale încep cu ox: oxA4, oxB7iv.constante reale – în format F (cu punct zecimal: 0.7, .8, 12.59) şi în
format exponenţial ( 1.4E+3, -2.8E-4 ): const float pi= 3.14;1.4E+3 = 1.4 * 103-2.8E-4 = -2.8 * 10-4
v.constante şir de caractere: “program ordonare”
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
36/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
Observaţii:•
limbajul C++ extinde definiţia constantelor la clase şi funcţiimembru
•
o constantã poate fi modificatã indirect prin intermediul unuipointer, ca în exemplul urmãtor:
const x = 41;
*(int *)&x = 32;
Semne de punctuaţie ( separatori)# (pentru directiva include) – este utilizat numai de preprocesor : ( douã puncte) [ ] paranteze drepte( ) paranteze rotunde
{ } acolade pentru blocurispaţiul, tab; punct şi virgulã
Simboluri speciale comentarii
// comentariu pe o linie/*comentariu pe liniimultiple
*/
sfârşit de linie, de paginã
Operatori – combinaţii de semne speciale care aratã modalitatea deprelucrare sau atribuire a valorilor ( tabelul 3):
++ incrementare | | sau logic
- - decrementare ~ not pe bit
+ adunare | sau pe bit- scãdere & şi pe bit
*, / înmulţire, împãrţire ^ sau exclusiv pe bit
= = egalitate % modulo
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
37/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
! = diferit , virgulã ( operator desecvenţiere)
,=
mai mic, mai mare & adresã
! not logic deplasare pe biţi lastânga şi dreapta
&& şi logic sizeof dimensiunea în octeţia unei variabile sautip de datã
Tabelul 3.operatori C++
Un operator poate avea mai multe semnificaţii, în funcţie de context. Deexemplu, operatorul ampersand (&) poate fi interpretat ca:• operator ‘şi’ pe biţi (a & b), care este un operator binar
• operator adresã (&a), care este un operator unar
• sinonim de variabilã
int x=10, &y=x;
Clase de precedenţã Operatorii definesc operaţiile admise de operanzi. În limbajul C++, se pot
folosi urmãtoarele tipuri de operanzi:- variabile- constante- funcţii- expresii
O clasificare a operatorilor poate sã ia în considerare criterii precum:•
numãrul de operanzi cãrora li se aplicã ( operatori unari ++, - -,binari +, -, ternari ?: etc.)
•
prioritatea avutã în evaluarea expresiilor ( clase de precedenţã)•
tipul operanzilor ( aritmetici, logici, relaţionali, la nivel de bit)Prioritãtile operatorilor impun ordinea de evaluare a expresiilor.O clasã de precedenţã conţine operatori cu prioritãţi egale. Categoria 1 de
precedenţã are prioritatea cea mai mare, categoria 2 conţine operatorii unari, careau prioritate mai micã decât cei din prima clasã, ş.a.m.d. Operatorul virgulã arecea mai micã prioritate.
Conform precedenţei operatorilor în Borland C++, operatorii se împart în15 categorii ( tabelul 4):
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
38/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
Categoria Operator Descriere
( ) apel de funcţie
[ ]
indice în tablouri
selecţie indirectã decomponente ( în C++)
:: operatorul de rezoluţie ( înC++)
1. operatori cu ceamai mare prioritate
. selecţie directã de componente( în C++)
2. operatori unari ! NOT ( negaţie logicã)
~ NOT pe biţi
+ plus unar
- minus unar
++ incrementare
- - decrementare
&adresã
* indirectare
sizeof returneazã dimensiunea unuioperand în bytes
new alocare dinamicã în C++delete dezalocare dinamicã în C++
* înmulţire / împãrţire
3. operatorimultiplicativi
% restul modulo
4. operatori aditivi + plus binar
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
39/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
- minus binar
> shift dreapta
< mai mic mai mare
6. operatorirelaţionali
>= mai mare sau egal
7. operatori pentru
verificarea egalitãţii
==
!=
egal
diferit
8. & AND pe biţi
9. ^ XOR (sau exclusiv) pe biţi
10. | OR ( sau) pe biţi
11. && AND (şi) logic
12. || OR (sau) logic
13. operatorcondiţional
?: a ? x : y înseamnã
"if a then x, else y"
= atribuire
*= atribuire cu înmulţire
/= atribuire cu împãrţire
%=atribuire cu restul modulo
+= atribuire cu adunare
-= atribuire cu scãdere
14. operatori deatribuire
&= atribuire cu şi pe biţi
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
40/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
^= atribuire cu sau exclusiv pe biţi
|= atribuire cu sau pe biţi
= atribuire cu shft dreapta
15. operatorulvirgulã
, operator de secvenţiere
Tabelul 4.operatori C++
Toţi operatorii de mai sus pot fi supraîncãrcaţi, cu excepţia urmãtorilor:. operatorul de selecţie directã a componentelor în C++.* operator C++
:: operatorul de rezoluţie pentru accesul în C++?: operatorul condiţional
Reguli de asociere a operatorilor:- de la dreapta la stânga pentru operatorii unari şi cel condiţional ?:- de la stânga la dreapta pentru restul operatorilor.
Operatorii de atribuireSintaxa folositã pentru operaţia de atribuire este urmãtoarea:
expresie_unarã operator_atribuire expresie_de_atribuire
unde expresiile pot avea tipuri de date diferite. În limbajul C++ se fac conversiiimplicite de tip, existând relaţia:
sizeof ( int)
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
41/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
E1 = 1E1 = E1 + E2 sau *p ( un pointer), însã expresia E1 + E2 nu este o valoare-stângã
(exemplu: E1 + E2 =7).
Exemplu de atribuire cu conversie de tip:int a, b;float m, n;a = m; // a [ m ]
// sau variabilei a i se atribuie o valoare aleatoare, dacã se//depãşesc posibilitãţile de memorare
n = b; // b va fi reprezentat în virgulã mobilã
Atribuirea multiplã poate fi evidenţiatã astfel:a = b = c = d = 10;
Operatorul de atribuire compusã are forma generalã operator=, undeoperator poate fi unul dintre operatorii de mai jos:
* / % + - > & ^ |
Expresia E1 op= E2 are acelaşi efect ca şi expresia E1 = E1 op E2 undevaloarea-stângã E1 este evaluatã o singurã datã. De exemplu,
E1 += E2 înseamnã E1 = E1 + E2.
Operatorii de incrementare / decrementare
- operatorul de incrementare ( prefix sau postfix)sintaxa :
++ operand ( prefix)sauoperand ++ ( postfix)
unde operandul trebuie sã fie de tip scalar ( aritmetic sau pointer) şi sã fie ovaloare-stângã modificabilã
Pentru incrementare prefixatã, valoarea operandului creşte cu 1, iarvaloarea expresiei este valoarea obţinutã dupã incrementare.
Pentru incrementare postfix, valoarea expresiei este valoarea dinainte de
aplicarea incrementãrii. Dupã incrementarea postfix, valoarea operandului creştecu 1.
Exemplu :int x = 10, y, z ;y = x++ ; // y = x =10 şi x =x + 1 =11z = ++x ; // x =x + 1 = 11 + 1 = 12 şi z = x = 12
- operatorul de decrementare ( prefix sau postfix)
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
42/80
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
43/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
operand_1 + operand_2 respectiv operand_1 - operand_2
unde operanzii trebuie sã fie de tip aritmetic sau unul dintre operanzi poate sãfie pointer cãtre un anumit tip de obiecte.
Exemplu :
int x = 10, y = 100, z ;z = x + y ; // z = 110z = x - y; //z = -90
- operatorii multiplicativi: *, /, % Sintaxa operatorilor multiplicativi:
operand1 * operand2 ( înmulţirea a douã numere)
operand1 / operand2 ( împãrţirea a douã numere, al doilea fiind nenul)
operand1 % operand2 ( restul împãrţirii a douã numere, al doilea fiind nenul)
unde operanzii trebuie sã fie de tip aritmetic, iar conversiile de tip sunt celeuzuale. Operatorul / aplicat unor operanzi întregi furnizeazã un rezultat întregşi aplicat unor operanzi reali produce un rezultat real.
Exemplu :int x = 10, y = 7, z ;z = x * y ; // z = 70z = x / y ; //z =1z = x % y ; // z = 3
Operatorii relaţionali , =, ==, !=Sintaxa operatorilor relaţionali :
operand1 < operand2 respectiv operand1 > operand2
operand1 = operand2
În expresiile relaţionale operanzii trebuie sã îndeplineascã una dintreurmãtoarele condiţii:- ambii operanzi sunt aritmetici, caz în care se efectueazã conversiile uzuale, iarrezultatul expresiei relaţioanale este de tip int ( 1 – adevãrat şi 0 – fals)- operanzii pot fi pointeri cãtre obiecte de tip compatibil, caz în care rezultatuldepinde de adresele relative ale celor douã obiecte la care se referã pointerii
Operatorii de egalitate ==, != testeazã egalitatea sau inegalitatea întrevalori aritmetice sau pointeri, utilizând reguli similare cu ale celorlalţi operatorirelaţionali. Operatorii de egalitate sunt într-o categorie de precedenţã inferioarã(prioritate mai micã) decât ceilalţi operatori relaţionali.
Sintaxa operatorilor relaţionali :
operand1 == operand2 ( egalitate) respectiv operand1 != operand2 ( diferit)
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
44/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
Dacã ambii operanzi sunt aritmetici, rezultatul expresiei relaţionale este 1( true) sau 0 ( false).
Când operanzii sunt pointeri, atunci expresia operand1 == operand2 areca rezultat 1 ( true), dacã ambii pointeri sunt NULL sau dacã pointerii se referã laacelaşi obiect.
Operatorii logici- negaţie logicã ( ! operand) - expresia ( ! operand) este echivalentã cu expresia(operand ==0)- şi logic (operand1 && operand2)- sau logic (operand1 || operand2)
Operanzii trebuie sã fie de tip scalar. Sunt realizate conversiile aritmeticeuzuale pentru operanzi.
Operatorii && şi || sunt evaluaţi de la stânga la dreapta astfel:• operand1 este evaluat primul: dacã operand1 este 0, atunci operand1 &&
operand2 este implicit 0 şi operand2 nu se mai evalueazã•
operand1 este evaluat primul: dacã operand1 este 1, atunci operand1 ||operand2 este implicit 1 şi operand2 nu se mai evalueazã.
Exemplu : fie douã variabile x şi y de tip întreg, atunci expresiile logiceconstruite cu ajutorul operatorilor !, &&, || sunt evaluate în tabelul 5 :
x y ! x x && y x || y
1 1 0 1 1
1 0 0 0 1
0 1 1 0 1
0 0 1 0 0
Tabelul 5.operatori logici
Operatorii logici au prioritate mai micã decât operatorii relaţionali :x z este echivalent cu( x z )
Operatorii pe biţi•
operatorii pe biţi sunt:- negaţie pe biţi ( ~ operand)- şi pe biţi (operand1 & operand2)- sau pe biţi (operand1 | operand2)- sau exclusiv pe biţi (operand1 ^ operand2)
•
se aplicã operanzilor de tip int sau char, nu se aplicã valorilor de tip float,double, long double
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
45/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
Exemplu : fie douã variabile x şi y de tip întreg, atunci expresiile logiceconstruite cu ajutorul operatorilor !, &&, || sunt evaluate în tabelul 6 :
x y ~ x x & y x | y x ^ y
1 1 0 1 1 0
1 0 0 0 1 1
0 1 1 0 1 1
0 0 1 0 0 0
Tabelul 6.operatori pe biţi
Exemplu : Fie x = 6 şi y =27. Operaţiile pe biţi efectuate cu x şi y suntprezentate în tabelul 7:
x = 62 = 0000 0110 = 0*2o+1*21 + 1*22 = 2 + 4 = 6y =272 = 0001 1011= 1*20+1*21 + 0*22 + 1* 23+ 1*24 = 1 + 2 + 8 + 16 = 27
x = 6 y = 27 ~ x x & y x | y x ^ y
0000 0110 0001 1011 1111 1001 0000 0010 0001 1111 0001 1101
Tabelul 7.operaţii pe biţi
Operatorii shift•
operatorul shift stânga (variabilã > numãr) deplaseazã biţii variabilei cu
un numãr de poziţii la dreapta; la deplasarea spre dreapta, biţii liberi dinstânga se completeazã cu:
- 0 ( zero), dacã numãrul este fãrã semn- 1 ( unu), dacã numãrul este negativ
•
operaţiile de deplasare pe biţi la stânga şi dreapta sunt echivalente cu înmulţirea, respectiv împãrţirea cu 2 la o putere egalã cu numãrul de biţideplasaţi:
x > n este echivalentã cu x / 2n
• exemplu: pentru x = 5, n =2
x
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
46/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
x * 2n = 5 * 22 = 20
Deci 5 > 3 = 1111 1010 >> 3 ( se pierd ultimii trei biţi) = 1111 1111
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
47/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
Capitolul 14
Programare orientatã pe obiecteîn limbajul C++
Limbajul de programare C++ oferã facilitãţi de programare orientatã peobiecte, în care obiectele aparţin unor tipuri abstracte, denumite clase. În limbajulC++, clasele constituie tipuri de date structurate ce permit organizarea dateloreterogene, complexe şi reprezintã colecţii de variabile şi funcţii, grupate sub unsingur nume, pentru manipularea lor unitarã.
Programarea orientatã pe obiecte foloseşte concepte fundamentaleprecum:• încapsulare – un obiect grupeazã atât date, cât şi funcţiile necesare prelucrãrii
acestora; o clasã este un tip abstract de date care realizeazã încapsularea datelorşi funcţiilor;•
moştenire – datele sau funcţiile pot fi transmise de la o clasã de bazã la claselederivate din aceasta;•
derivare – definirea unei clase noi pe baza unei clase existente;•
polimorfism – redefinirea funcţiilor şi a operatorilor.În acest capitol se vor prezenta noţiunile de clasã, constructor şi
destructor, vor fi descrise conceptele fundamentale utilizate de programareaorientatã pe obiecte, precum moştenirea şi supraîncãrcarea. Se va exemplificamodul de realizare a polimorfismului şi se vor evidenţia proprietãţile funcţiilorvirtuale şi claselor abstracte.
14.1. Clase
Un obiect este o variabilã, reprezentând un ansamblu alcãtuit din:- date membre;-
funcţii membre, numite metode. Obiectele sunt variabile declarate de tipclass, un tip de date abstract, asemntor tipurilor de date structurate struct şiunion.
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
48/80
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
49/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
#include#includeclass rational{
int p, q;public:
void fractie( int x, int y){p = x;q = y;}
int numarator(){return p;
}int numitor(){return q;}
}a;void main(void){clrscr();a.fractie(7,8);
printf("\n fractia: %d / %d ", a.numarator(), a.numitor());getche();}
Operatorul de rezoluţie :: permite accesul la variabile globale aleprogramului. Un exemplu de afişare diferenţiatã a unei variabile declarateglobal, respectiv local este programul urmãtor:
#include#include
int i = 10;void main(){int i = 15;clrscr();printf("\n variabila globala ( din exteriorul functiei main) i = %i",::i);printf("\n variabila locala (din main) i = %i",i);
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
50/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
getch();}
Operatorul de rezoluţie se poate folosi pentru funcţii declarate înexteriorul unei clase, al cãror prototip este definit în interiorul clasei. Un exemplu
este problema definirii unei clase pentru numere raţionale, rezolvatã astfel:
#include#includeclass rational{int p, q;public:
void fractie( int, int);int numarator();
int numitor();}a;void main(void){clrscr();a.fractie(20,42);printf("\n fractia: %d / %d ", a.numarator(), a.numitor());getche();}void rational::fractie( int x, int y)
{ p = x;q = y;}
int rational::numarator(){ return p;}
int rational::numitor(){ return q;}
Funcţii inline – sunt funcţiile declarate şi definite în interiorul unei clase.La fiecare apel al funcţiei, aceasta este înlocuitã cu codul ei, mãrind viteza deexecuţie a programului.
Constructori şi destructoriConstructorul generat implicit este o metodã specialã ataşatã în mod
implicit unei clase, pentru declararea obiectelor. Astfel, se alocã spaţiul de
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
51/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
memorie necesar obiectelor declarate. O clasã poate avea mai mulţi constructori,cu restricţia ca metodele constructor sã difere prin numãrul şi tipul parametrilorformali. Existã un tip special de constructor numit constructor de copiere careatribuie datele unui obiect altui obiect.
Destructorul este o metodã specialã ataşatã unei clase, ce realizeazã
operatia inversã alocãrii obiectelor, adicã eliberarea memoriei. Numeledestructorului este acelaşi cu numele clasei, dar este precedat de caracterul ~. Oclasã are un singur destructor. Destructorul nu are parametri formali, el fiindapelat implicit atunci când existenţa unui obiect înceteazã.
Funcţiile prieten sunt funcţiile care nu aparţin unei clase, dar pot accesadatele private ale acesteia. Pentru a ataşa unei clase o funcţie prieten, seintroduce în interiorul definiţiei clasei prototipul funcţiei prieten, precedat decuvântul cheie “friend”, iar definiţia funcţiei se efectueazã în exteriorul clasei.
14.2. Moştenire
Moştenirea este o tehnicã de bazã în programarea orientatã pe obiecte,prin care se pot reutiliza şi extinde clasele existente. Mecanismul moştenirii esteurmãtorul:•
având o clasã oarecare B, se poate defini o altã clasã D care sã preia toatecaracteristicile clasei B, la care sã-şi poatã adãuga alte proprietãţi proprii;•
clasa B se numeşte clasã de bazã, iar clasa D se numeşte clasã derivatã;•
mecanismul de derivare poate fi aplicat numai claselor definite prinspecificatorii class şi struct;• se poate forma o ierarhie de clase.
Pentru derivarea claselor, se foloseşte sintaxa:
class | struct clasa_derivatã : { specificator_acces_1} clasã_bazã_1{, specificator_acces_2} clasã_bazã_2,. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
{. . . . . . . . .
}Controlul accesului la membrii:- specificatorul de acces poate lipsi; dacã lipseşte, se considerã private
pentru class şi public pentru struct.
Moştenirea de tip privat este modul de moştenire implicit pentru class.Membrii protected şi public prin moştenire private devin private.
Moştenirea de tip protected:
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
52/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
- membrii private → protectedmostenire private
- membrii protected şi public → protectedmostenire protected
Moştenirea de tip public:
-
membrii private → publicmostenire
private-
membrii protected → publicmostenire protected
-
membrii public → publicmostenire public.
Moştenirea multiplã presupune crearea unor clase derivate din mai multeclase de bazã. În aceste cazuri, constructorii se apeleazã în ordinea in care suntscrise clasele în liste de moştenire a clasei derivate.
Exemplu: Sã se defineascã o clasã de bazã pentru grafuri neorientate, caresã conţinã matricea de existenţã, matricea de adiacenţã, metode pentru citirea şi
afişarea unei matrice şi o metodã pentru algoritmul Roy Warshall. Sã seconstruiascã o clasã derivatã din prima, care sã conţinã metode pentru:-
verificarea conexitãtii unui graf;- tipãrirea vârfurilor izolate;-
tipãrirea vârfurilor de grad maxim.Algoritmul Roy Warshall transformã matricea de adiacenţã a muchiilor
unui graf neorientat in matrice de existenţã a lanţurilor. Pentru determinareacomponentelor conexe ale unui graf neorientat, se foloseşte matricea de existentãa lanţurilor.
#include#includeint i, j, n, m, x, y, k, sw;class graf
{public:
int a[10][10]; //matrice de adiacenta a muchiilorint e[10][10]; // matrice de existenta a lanturilorvoid citire();void tiparire();
void Roy_Warshall();};class graf1 : public graf
{public:int conex();int vf_izolate();void vf_gr_max();
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
53/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
}a;void graf::citire()
{for(i = 1; i
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
54/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
{sw = 1;for(i =1; i
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
55/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
printf("\n nr de varfuri n = "); scanf("%d", &n);printf("\n numarul de muchii: "); scanf("%d",&m);a.citire();a.Roy_Warshall();a.tiparire();
if (a.conex() == 0) printf ("\n graful nu este conex");else printf("\n graf conex");
if (a.vf_izolate() == 0)printf("\n nu exista varfuri izolate");
a.vf_gr_max();getche();}
Observaţie: Pentru execuţia programelor, se recomandã efectuarea maimultor teste. De exemplu:
•
Test 1:Pentru graful din figura 8.1., sepot introduce datele:- numãrul de vârfuri n = 5- numãrul de muchii m = 3- muchia 1: 1 2- muchia 2: 1 4- muchia 3: 3 5 Fig. 8.1. Test 1
Rezultate: graful nu este conexnu exista varfuri izolatevarful de grad maxim este 1 si are gradul 2
• Test 2:Pentru graful din figura 8.2., sepot introduce datele:- numãrul de vârfuri n = 3- numãrul de muchii m = 3- muchia 1: 1 2- muchia 2: 1 3- muchia 3: 2 3
Fig. 8.2. Test 2
Rezultate: graf conexnu exista varfuri izolatevarful de grad maxim este 1 si are gradul 2
• Test 3:Pentru graful din figura 8.3., sepot introduce datele:
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
56/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
- numãrul de vârfuri n = 5- numãrul de muchii m = 4- muchia 1: 1 2- muchia 2: 1 3- muchia 3: 1 4 Fig. 8.3. Test 3
- muchia 4: 2 4Rezultate: graful nu este conex
5 varf izolatvarful de grad maxim este 1 si are gradul 3
• Test 4:Pentru graful din figura 8.4., sepot introduce datele:- numãrul de vârfuri n = 6- numãrul de muchii m = 6- muchia 1: 1 2- muchia 2: 1 4- muchia 3: 2 5
Fig. 8.4. Test 4
- muchia 4: 3 5- muchia 5: 3 6- muchia 6: 5 6
Rezultate: graf conexnu exista varfuri izolatevarful de grad maxim este 5 si are gradul 3
14.3. Supraîncãrcare
Supraîncãrcarea permite atribuirea mai multor semnificaţii anumitoroperatori sau funcţii. De exemplu, operatorii binari precum ‘+’, ‘-‘, ‘*’ sunt folosiţi,de obicei, în construcţia expresiilor aritmetice, între operanzi întregi, reali sau dediverse tipuri aritmetice combinate. Însã, prin supraîncãrcarea acestor operatori,se pot construi expresii cu operatori şi operanzi definiţi de tip class.
Supraîncãrcarea operatorilor se poate realiza utilizând urmãtoareasintaxã:
operator ( ){
;}
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
57/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
unde operator defineşte o nouã acţiune asociatã unui operatorprin supraîncãrcare.
Supraîncãrcarea operatorilor +, *, -
Exemplul 1): Supraîncãrcarea operatorilor + şi * poate fi evidenţiatã înprogramul de calculare a sumei şi produsului a douã matrice. Se vor folosi douãclase:
• o clasã care memoreazã informaţii despre elementele matricelor şi metodepentru operaţiile de citire şi scriere;
•
a doua clasã derivatã din prima clasã, care sã defineascã supraîncãrcareaoperatorilor + şi *.
#include#includeclass matrice1
{public:
int inf[12][12];void citire();void tiparire();
};class matrice2 : public matrice1
{public:matrice2 operator+(matrice2);
matrice2 operator*(matrice2);}a, b, c;
int i, j, n, s, k;void matrice1::citire()
{for(i = 0; i < n; i++)for(j = 0; j < n; j++)
{printf("\n inf[%d][%d]= ",i,j);scanf("%d", &inf[i][j]);
}}void matrice1::tiparire()
{for(i = 0; i < n; i++){
for(j = 0; j < n; j++)
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
58/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
printf(" %d ",inf[i][j]);printf("\n ");
}}
matrice2 matrice2::operator+(matrice2 a)
{for(i = 0; i < n; i++)for(j = 0; j < n; j++)c.inf[i][j] = inf[i][j] + a.inf[i][j];return(c);}
matrice2 matrice2::operator*( matrice2 a){
for(i = 0; i < n; i++)for(j = 0; j < n; j++)
{ s = 0;for(k = 0; k < n; k++)
s += inf[i][k] * a.inf[k][j];c.inf[i][j] = s;
}return(c);
}void main(void){
clrscr();printf("\n nr de linii/coloane n = "); scanf("%d", &n);printf("\n dati matricea A:\n "); a.citire();printf("\n dati matricea B:\n "); b.citire();printf("\n matricea A este:\n "); a.tiparire();printf("\n matricea B este:\n "); b.tiparire();printf("\n matricea suma A + B:\n ");c = a + b;c.tiparire();printf("\n matricea produs A * B:\n ");c = a * b;c.tiparire();getche();}
Observaţie: La execuţia programului, se pot folosi urmãtoarele teste:
Test 1: n = 2, A =
4
2
3
1, B =
1
2
7
5
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
59/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
Rezultatele compilãrii programului:
matricea suma A + B =
5
4
10
6, matricea produs A * B =
10
4
43
19
Test 2: n = 3, A =
21
2
1543
01
, B =
53
1
1407
21
Rezultatele compilãrii programului:
matricea suma A + B =
7
4
3
29
410
22
,
matricea produs A * B =
18
20
11
1220
735
49
.
Exemplul 2): Sã se realizeze supraîncãrcarea operatorilor +, -, *, = lamulţimi, pentru operaţiile de bazã cu mulţimi: reuniunea ( +), diferenta ( -),intersecţia ( *) şi atribuirea ( =).
#include#includechar ch;class multime
{public:
int inf[10], n;void citire();void afisare();
};class multime1 : public virtual multime
{public:
multime1 operator*(multime1);multime1 operator+(multime1);
multime1 operator-(multime1);void operator=(multime1);
}a, b, c;int i, j, n, x, sw;void multime::afisare()
{if(!n)
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
60/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
cout
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
61/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
{for(i = 1; i
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
62/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
cin>>b.n;b.citire();cout
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
63/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
{int nr[100];public:
int& operator[](int);void citire();
void tiparire();};
int& vector::operator[](int i){ return nr[i];}
void vector::citire(){for(i = 0; i < n; i++){printf("\n nr[%d] = ",i);
scanf("%d",&nr[i]);}}
void vector::tiparire(){printf("\n Vectorul\n");for(i = 0; i < n; i++)
printf("%d ",nr[i]);}
void main(void)
{vector a;clrscr();printf("\n ne elemente ale vectorului n = ");scanf("%d", &n);printf("\n dati vectorul: ");a.citire();a.tiparire();s = 0;for(i = 0; i < n; i++)s+= a.operator[](i);
printf("\n suma elementelor = %d", s);p = 1;for(i = 0; i < n; i++)p *= a.operator[](i);
printf("\n produsul elementelor (metoda 1) = %d", p);p = 1;for(i = 0; i < n; i++)
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
64/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
p *= a[i];printf("\n produsul elementelor (metoda 2) = %d", p);getche();}
Observaţii:• în program, s-au utilizat notaţiile echivalente:
a.operator[ ] (i) ⇔ a[i]
• metoda operator[ ] declaratã astfel:
int& operator[](int);
returneazã valoarea membrului privat nr . Pentru tipul datelor returnate, sefoloseşte int& (lvalue required).
b)
operatorul ( ) este folosit pentru apelul funcţiilorDe exemplu, prin supraîncãrcarea operatorului ( ), un element a[i][j] al
unei matrice se poate scrie în mod echivalent astfel:a(i, j) ⇔ a.operator( ) (i, j)
unde a este un obiect din clasa matrice, iar funcţia operator( ) este o metodã:
class matrice{int nr[20][20];public:
int& operator( )(int, int);
} a;În programul urmãtor, se propune determinarea transpusei unei matrice,
folosind supraîncãrcarea operatorului ( ).
#include#includeint i, j, n;class matrice
{public:
int inf[10][10];int& operator()(int, int);void citire();
}a;int& matrice::operator()(int i, int j)
{return inf[i][j];
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
65/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
}void matrice::citire()
{for(i = 1; i
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
66/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
int nr[10][10];public:
int operator=(matrice);} a, b;
În programul urmãtor, se propune verificarea egalit
ii a dou
matrice,folosind supraîncãrcarea operatorului =.
#include#includeint i, j, n;class vector
{public:
int inf[10], n;int operator=(vector);void citire();void afisare();
}a, b;int vector::operator=(vector b)
{int sw;sw = 1;if(b.n != n)
sw = 0;for(i = 1; i
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
67/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
void main(void){clrscr();printf("\n nr de elemente ale vectorului A: n = ");scanf("%d", &a.n);
a.citire();printf("\n nr de elemente ale vectorului B: n = ");scanf("%d", &b.n);b.citire();printf("\n Vectorul A\n");a.afisare();printf("\n Vectorul B\n");b.afisare();if( a = b) printf("\n vectorii au elementele egale");if(!a.operator=(b)) printf("\n nu exista egalitate");
getche();}
Observaţie: În program, s-au utilizat notaţiile echivalente:
a.operator= (b) ⇔ a = b
Supraîncãrcarea funciilorFuncţiile pot fi supraîncrcate, adic pot exista dou sau mai multe funcii
cu acelaşi nume î n clase derivate. Exist o restricie, î n sensul c funciile trebuie
s difere prin numrul şi tipul parametrilor formali.
Supraîncãrcarea funciilor în clase derivate: se poate înzestra o clas derivat cu o metod cu acelaşi nume şi aceeaşi list de parametri formali, ca unaexistent în clasa de baz. Exemplu: o funcie de afişare definit atât î n clasa debaz, cât şi î n clasa derivat.
#include#includeclass A
{public:
int i;void afisare()
{printf("\n clasa de baza A: i = %d",i);}
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
68/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
};class B : public A
{public:
int i;
void afisare(){printf("\n clasa derivata B: i = %d",i);}
}y;void main(void){clrscr();y.A::i = 99;y.A::afisare();
y.i = 10;y.afisare();getche();}
Supraîncãrcarea funciilor standard presupune redefinirea funcţiilorstandard în interiorul unei clase.
Exemplu: Calculaţi radicalul unui numãr n în mod repetat pânã laintroducerea caracterului ‘n’ sau ‘N’, ca rãspuns la întrebarea “mai daţi unnumãr? (d/n)”. Sã se foloseascã redefinirea funcţiei standard ‘sqrt’.
#include#include#includeclass radical
{public:
float sqrt(int);}x;
float radical::sqrt(int a){return(::sqrt(a));
}int n;char c;void main(void){clrscr();
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
69/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
do{do{cout
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
70/80
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
71/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
void main(void){punct *p;patrat *q;int nr;
clrscr();coutnr;ob2.setare(nr);cout
-
8/19/2019 Book Basics of Programming in C++ Tudor 2010.pdf
72/80
Tudor L., Bazele programãrii în limbajul C++, Editura MATRIX ROM, Bucureşti, ISBN 978-973-755-644-8, 2010
Avantajele folosirii claselor virtuale• flexibilitate cresc