This shows you the differences between two versions of the page.
sd-ca:laboratoare:laborator-01 [2016/02/21 19:28] darius.neatu |
sd-ca:laboratoare:laborator-01 [2016/02/21 19:49] (current) radu.stochitoiu |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Laborator 01 - Introducere in C++ ====== | + | ====== Articol 01 - Introducere in C++ ====== |
- | Responsabili | + | În cadrul acestui articol ne propunem să ilustrăm conceptele din C++ cu care veți lucra pe parcursul acestui semestru. |
- | * [[mailto:daniel.ciocirlan1607@cti.pub.ro | Daniel Ciocîrlan]] | + | |
- | * [[mailto:andrei.vasiliu2211@cti.pub.ro | Andrei Vasiliu]] | + | |
- | În cadrul acestui laborator ne propunem să ilustrăm conceptele din C++ cu care veți lucra pe parcursul acestui semestru. | + | Într-un mod extrem de simplist spus C++ este un superset al limbajului C, iar tot ceea ce ați învățat în C la [[http://ocw.cs.pub.ro/courses/programare| PC]] se poate compila cu un compilator pentru limbajul C++, funcționalitatea rămânând aceeași. |
- | + | ||
- | Într-un mod extrem de simplist spus C++ este un superset al limbajului C, iar tot ceea ce ați învățat în C la [[http://ocw.cs.pub.ro/courses/programare-ca| PC]] se poate compila cu un compilator pentru limbajul C++, funcționalitatea rămânând aceeași. | + | |
===== Obiective ===== | ===== Obiective ===== | ||
Line 13: | Line 9: | ||
Ne dorim să: | Ne dorim să: | ||
*Realizăm tranziția de la C la C++ | *Realizăm tranziția de la C la C++ | ||
+ | * înțelege conceptul de referințe din C++ | ||
+ | * înțelege conceptul de read-only introdus prin identificatorul const | ||
*Înțelegem ce presupune definirea unei clase | *Înțelegem ce presupune definirea unei clase | ||
===== De ce C++? ===== | ===== De ce C++? ===== | ||
- | Pentru că C++ permite implementarea structurilor de date cu tipuri de date generice, prin intermediul template-urilor, într-un mod care nu presupune trecerea la programarea orientată pe obiecte. În cadrul acestui laborator nu ne așteptăm să dobândiți cunoștințe (elementare sau avansate) legate de programarea obiectuală, întrucât în anul II există un [[http://elf.cs.pub.ro/poo|curs]] dedicat acestui lucru. | + | Pentru că C++ permite implementarea structurilor de date cu tipuri de date generice, prin intermediul template-urilor, într-un mod care nu presupune trecerea la programarea orientată pe obiecte. În cadrul acestui articol nu ne așteptăm să dobândiți cunoștințe (elementare sau avansate) legate de programarea obiectuală, întrucât în anul II există un [[http://elf.cs.pub.ro/poo|curs]] dedicat acestui lucru. |
- | Vă încurajăm însă să citiți cât mai multe despre C++ pe parcurs și să cereți lămuriri suplimentare din partea asistenților de la laborator. | ||
===== Sintaxa C++ ===== | ===== Sintaxa C++ ===== | ||
- | |||
- | ==== De la structuri C la clase C++ ==== | ||
==== Definirea structurii ==== | ==== Definirea structurii ==== | ||
- | În cadrul laboratorului de Programarea Calculatoarelor am învățat să declarăm și să folosim tipuri de date complexe, [[http://ocw.cs.pub.ro/courses/programare-ca/laboratoare/lab10 | structuri]] în limbajul C. Pentru a recapitula, iată mai jos un exemplu simplu de astfel de structură, pentru a reprezenta un număr complex. | + | În cadrul laboratorului de Programarea Calculatoarelor am învățat să declarăm și să folosim tipuri de date complexe, [[http://ocw.cs.pub.ro/courses/programare/laboratoare/lab10| structuri]] în limbajul C. Pentru a recapitula, iată mai jos un exemplu simplu de astfel de structură, pentru a reprezenta un număr complex. |
<columns 400px 100% -> | <columns 400px 100% -> | ||
Line 169: | Line 164: | ||
return 0; | return 0; | ||
} | } | ||
- | </code> | ||
- | |||
- | ==== Clase ==== | ||
- | |||
- | Formal am făcut deja primii pași mai sus pentru a implementa o clasă în C++, utilizând keyword-ul //struct//. | ||
- | |||
- | Totuși, ce înseamnă o clasă? Nu trebuie decât să ne gândim la ce am făcut mai sus: | ||
- | *am definit un tip de date | ||
- | *i-am adăugat atribute (am definit ce proprietăți îl caracterizează: partea reală și partea imaginară) | ||
- | *i-am adăugat metode (am definit cum se comportă: inițializarea și conjugarea) | ||
- | |||
- | Cu această adăugare menționată, putem să ne referim la ceea ce înseamnă o **clasă**, respectiv un **obiect**. | ||
- | |||
- | Ne referim la o **clasă** ca fiind o amprentă (blueprint) sau descriere generală. | ||
- | Un **obiect** sau o **instanță a clasei** este o variabilă concretă ce se conformează descrierii clasei. | ||
- | |||
- | Vom numi **clasă** tipul de date definit de //struct complex// sau //class complex// și **obiect** o instanțiere (o alocare dinamică sau locală) a tipului de date. | ||
- | |||
- | Când discutăm despre tipul de date //complex// ne referim la clasă. | ||
- | Când discutăm despre variabila //number// ne referim la un obiect, o instanță a clasei. | ||
- | |||
- | ==== Keyword-ul "class" vs. "struct" ==== | ||
- | |||
- | Și totuși, C++ adăugă keyword-ul //class//. Care este diferența între //class// și //struct//? | ||
- | Iată cum definim complet clasa de mai sus, separând antetul de implementare și de programul principal. | ||
- | |||
- | <columns 100% 100% -> | ||
- | <code c++ complex.h> | ||
- | class Complex { | ||
- | double re; | ||
- | double im; | ||
- | | ||
- | Complex conjugate(); | ||
- | }; | ||
- | </code> | ||
- | |||
- | <newcolumn> | ||
- | |||
- | <code c++ complex.cc> | ||
- | #include "complex.h" | ||
- | Complex Complex::conjugate() { | ||
- | Complex conjugate; | ||
- | conjugate.re = this->re; | ||
- | conjugate.im = -(this->im); | ||
- | | ||
- | return conjugate; | ||
- | } | ||
- | </code> | ||
- | |||
- | <newcolumn> | ||
- | |||
- | <code c++ main.cc> | ||
- | #include <stdio.h> | ||
- | #include "complex.h" | ||
- | |||
- | int main() { | ||
- | Complex number; | ||
- | number.re = 2; | ||
- | number.im = 4; | ||
- | | ||
- | printf("%.2lf %.2lf\n", number.re, number.im); | ||
- | | ||
- | return 0; | ||
- | } | ||
- | </code> | ||
- | </columns> | ||
- | |||
- | |||
- | ====Compilare==== | ||
- | |||
- | Sursele C++ se compilează folosind compilatorul **g++**. Acesta permite exact aceleași opțiuni de bază ca și **gcc**, compilatorul utilizat pentru sursele de C. | ||
- | |||
- | * Încercați să compilați și să rulați codul din cele 3 fișiere de mai sus. | ||
- | |||
- | <code bash> | ||
- | g++ complex.cc main.cc -o exemplu | ||
- | </code> | ||
- | Ce observați? | ||
- | |||
- | Înlocuiți acum keyword-ul //class// cu keyword-ul //struct// și compilați din nou. | ||
- | |||
- | ==== Specificatori de acces ==== | ||
- | Am observat mesajul de eroare în urma compilării fișierelor de mai sus. | ||
- | |||
- | Astfel, **singura diferență** folosirea celor două keyword-uri este nivelul implicit de vizibilitate a metodelor și atributelor. | ||
- | ***private** - pentru clasele declarate cu **class** | ||
- | ***public** - pentru clasele declarate cu **struct** | ||
- | |||
- | Membri precedați de label-ul **private** pot fi folosiți numai în interiorul clasei, în cadrul metodelor acesteia. | ||
- | Ei nu pot fi citiți sau modificați din afara clasei. | ||
- | |||
- | Iată cum puteam remedia soluția: | ||
- | <code c++ complex.h> | ||
- | class Complex { | ||
- | public: | ||
- | double re; | ||
- | double im; | ||
- | |||
- | Complex conjugate(); | ||
- | }; | ||
</code> | </code> | ||
Line 435: | Line 330: | ||
Codul de mai sus returnează o referință către membrul ''re'' al obiectului ''Complex z'', așadar orice atribuire efectuată asupra acestui câmp va fi vizibilă și în obiect. | Codul de mai sus returnează o referință către membrul ''re'' al obiectului ''Complex z'', așadar orice atribuire efectuată asupra acestui câmp va fi vizibilă și în obiect. | ||
- | ===== Exercitii ===== | + | ====Compilare==== |
+ | |||
+ | Sursele C++ se compilează folosind compilatorul **g++**. Acesta permite exact aceleași opțiuni de bază ca și **gcc**, compilatorul utilizat pentru sursele de C. | ||
+ | |||
+ | * Încercați să compilați și să rulați codul din cele 3 fișiere de mai sus. | ||
+ | |||
+ | <code bash> | ||
+ | g++ complex.cc main.cc -o exemplu | ||
+ | </code> | ||
+ | Ce observați? | ||
+ | |||
+ | Înlocuiți acum keyword-ul //class// cu keyword-ul //struct// și compilați din nou. | ||
- | *[**2p**] Parcurgeți laboratorul în întregime și discutați cu asistentul vostru eventualele neclarități. | ||
<hidden> | <hidden> | ||
*[**3p**] Clasa Complex | *[**3p**] Clasa Complex |