Differences

This shows you the differences between two versions of the page.

Link to this comparison view

poo-is-ab:laboratoare:01 [2025/11/20 14:06]
razvan.cristea0106
poo-is-ab:laboratoare:01 [2026/09/28 12:50] (current)
razvan.cristea0106
Line 26: Line 26:
 În continuare, vom descoperi asemănările dintre cele două limbaje de programare, ilustrând similaritățile dintre acestea prin exemple de cod concrete. În continuare, vom descoperi asemănările dintre cele două limbaje de programare, ilustrând similaritățile dintre acestea prin exemple de cod concrete.
  
-=== Declararea și initializarea ​variabilelor ===+=== Declararea și inițializarea ​variabilelor ===
  
 Modul de declarare și de inițializare a variabilelor în cele 2 limbaje este același, avem aceleași tipuri de date precum: **int**, **float**, **char**, **double**, **unsigned int**, **long**, **unsigned long** etc. Modul de declarare și de inițializare a variabilelor în cele 2 limbaje este același, avem aceleași tipuri de date precum: **int**, **float**, **char**, **double**, **unsigned int**, **long**, **unsigned long** etc.
Line 117: Line 117:
 Instrucțiunea **switch** poate fi o alternativă mult mai elegantă atunci când vrem să înlocuim o secvență de instrucțiuni de forma **if -> else if -> ... -> else**. Deși pare o instrucțiune "​demodată"​ aceasta este extrem de eficientă și de utilă atunci când ne dorim un cod rapid și ușor de citit. Instrucțiunea **switch** poate fi o alternativă mult mai elegantă atunci când vrem să înlocuim o secvență de instrucțiuni de forma **if -> else if -> ... -> else**. Deși pare o instrucțiune "​demodată"​ aceasta este extrem de eficientă și de utilă atunci când ne dorim un cod rapid și ușor de citit.
  
-Forma generală a instrucțiunii ​swicth+Forma generală a instrucțiunii ​switch
  
 <code cpp> <code cpp>
Line 235: Line 235:
 </​code>​ </​code>​
  
-Instrucțiunea **do-while** este o variantă a buclei **while**, cu o diferență esențială:​ în bucla **do-while**,​ condiția de verificare este evaluată **după** ce codul din interiorul buclei a fost executat, **nu** înainte. Aceasta înseamnă că blocul de cod din bucla **do-while** va fi executat cel puțin **o dată**, indiferent de valoare ​de adevăr a expresiei din clauza while.+Instrucțiunea **do-while** este o variantă a buclei **while**, cu o diferență esențială:​ în bucla **do-while**,​ condiția de verificare este evaluată **după** ce codul din interiorul buclei a fost executat, **nu** înainte. Aceasta înseamnă că blocul de cod din bucla **do-while** va fi executat cel puțin **o dată**, indiferent de valoarea ​de adevăr a expresiei din clauza while.
  
 Forma generală a instrucțiunii do-while Forma generală a instrucțiunii do-while
Line 294: Line 294:
 C++, la fel ca C-ul, are tipuri de date speciale denumite **pointeri**,​ care sunt utile atunci când vrem să modificăm o valoare de la o anumită adresă din memorie. C++, la fel ca C-ul, are tipuri de date speciale denumite **pointeri**,​ care sunt utile atunci când vrem să modificăm o valoare de la o anumită adresă din memorie.
  
-**Un pointer** este un tip de date care stochează **o adresă** din memorie la un anumit moment de timp în program. Să luam spre exemplu următoarea secvență de cod.+**Un pointer** este un tip de date care stochează **o adresă** din memorie la un anumit moment de timp în program. Să luăm spre exemplu următoarea secvență de cod.
  
 <code cpp> <code cpp>
Line 306: Line 306:
 </​code>​ </​code>​
  
-Se poate observa că avem o varibilă de **tip int** care a fost inițializată cu valoarea 10 și un **pointer la int** care a fost inițializat cu adresa lui x. Într-o ilustrare simplificată putem înțelege efectiv ce s-a întâmplat pe lina a doua de cod.+Se poate observa că avem o variabilă de **tip int** care a fost inițializată cu valoarea 10 și un **pointer la int** care a fost inițializat cu adresa lui x. Într-o ilustrare simplificată putem înțelege efectiv ce s-a întâmplat pe linia a doua de cod.
  
 {{ :​poo-is-ab:​laboratoare:​pointer_logic.jpg |}} {{ :​poo-is-ab:​laboratoare:​pointer_logic.jpg |}}
Line 391: Line 391:
 </​code>​ </​code>​
  
-<note tip>Vom folosi foarte mult pointerii în acest semestru, iar pentru cei mai puțini familiarizați puteți urmări tutorialul ​urmator: [[https://​youtu.be/​zuegQmMdy8M?​si=kxUOPspywfF5gR00|C++ Pointers]]+<note tip>Vom folosi foarte mult pointerii în acest semestru, iar pentru cei mai puțini familiarizați puteți urmări tutorialul ​următor: [[https://​youtu.be/​zuegQmMdy8M?​si=kxUOPspywfF5gR00|C++ Pointers]]
 </​note>​ </​note>​
  
Line 408: Line 408:
 <​note>​A **doua** componentă împreună cu cea de a **treia** sunt cunoscute și sub denumirea de **semnătură a funcției**.</​note>​ <​note>​A **doua** componentă împreună cu cea de a **treia** sunt cunoscute și sub denumirea de **semnătură a funcției**.</​note>​
  
-Dacă îmbinăm cele 3 componente putem constata ​ca forma generală a unei funcții în C/C++ va arăta în felul următor -> **return_type name(parameters)**.+Dacă îmbinăm cele 3 componente putem constata ​că forma generală a unei funcții în C/C++ va arăta în felul următor -> **return_type name(parameters)**.
  
 În continuare vom vedea câteva exemple de declarări pentru funcții definite de către programator. În continuare vom vedea câteva exemple de declarări pentru funcții definite de către programator.
Line 471: Line 471:
 </​code>​ </​code>​
  
-Variabilelor **x** și **y** li se face la fiecare ​câte o copie atunci când se apelează funcția **diferenta**. Nu doar că aceste copii sunt pierdute la încheierea execuției acestei funcții ba chiar și rezultatul întors de această funcție este transmis prin valoare. Deci în total avem 3 copii care s-au făcut în momentul în care linia de cod ''​int dif = diferenta(x,​ y);''​ a fost executată.+Variabilelor **x** și **y** li se face câte o copie atunci când se apelează funcția **diferenta**. Nu doar că aceste copii sunt pierdute la încheierea execuției acestei funcții ba chiar și rezultatul întors de această funcție este transmis prin valoare. Deci în total avem 3 copii care s-au făcut în momentul în care linia de cod ''​int dif = diferenta(x,​ y);''​ a fost executată.
  
 Pentru a vedea efectiv dezavantajul transmiterii parametrilor prin valoare vom implementa o funcție care realizează interschimbarea valorilor a două variabile întregi. Pentru a vedea efectiv dezavantajul transmiterii parametrilor prin valoare vom implementa o funcție care realizează interschimbarea valorilor a două variabile întregi.
Line 495: Line 495:
 Deși parametrii **a** și **b** ai funcției **interschimbare** sunt copii ale variabilelor **x** și **y** din programul principal, aceștia sunt doar variabile locale care există doar în interiorul funcției. Astfel, valoarea lui **a** va deveni 21 și cea a lui **b** va fi 5, însă aceste modificări se aplică doar la nivel local. După terminarea execuției funcției, variabilele originale **x** și **y** nu vor fi afectate și vor păstra valorile inițiale, deoarece modificările din interiorul funcției nu se propagă în afara ei. Deși parametrii **a** și **b** ai funcției **interschimbare** sunt copii ale variabilelor **x** și **y** din programul principal, aceștia sunt doar variabile locale care există doar în interiorul funcției. Astfel, valoarea lui **a** va deveni 21 și cea a lui **b** va fi 5, însă aceste modificări se aplică doar la nivel local. După terminarea execuției funcției, variabilele originale **x** și **y** nu vor fi afectate și vor păstra valorile inițiale, deoarece modificările din interiorul funcției nu se propagă în afara ei.
  
-Vom soluționa problema de mai sus utilizând un alt mod de transmitere a parametrilor și anume cea prin intermediul pointerilor.+Vom soluționa problema de mai sus utilizând un alt mod de transmitere a parametrilor și anume cel prin intermediul pointerilor.
  
 __**Transmiterea parametrilor prin pointer**__ __**Transmiterea parametrilor prin pointer**__
Line 526: Line 526:
 </​code>​ </​code>​
  
-Deși parametrii **a** și **b** sunt tot variabile locale în funcția **interschimbare**,​ faptul că aceștia sunt pointeri schimbă modul în care subrogramul ​funcționează. În loc să fie doar copii ale valorilor lui **x** și **y**, acești pointeri conțin adresele de memorie ale variabilelor originale. Astfel, orice modificare efectuată asupra variabilelor accesate prin intermediul pointerilor va afecta **direct** valorile lui **x** și **y**. Acest mecanism permite funcției să modifice variabilele din programul principal, deoarece nu lucrează cu copii ale acestora, ci direct cu locațiile lor din memorie.+Deși parametrii **a** și **b** sunt tot variabile locale în funcția **interschimbare**,​ faptul că aceștia sunt pointeri schimbă modul în care subprogramul ​funcționează. În loc să fie doar copii ale valorilor lui **x** și **y**, acești pointeri conțin adresele de memorie ale variabilelor originale. Astfel, orice modificare efectuată asupra variabilelor accesate prin intermediul pointerilor va afecta **direct** valorile lui **x** și **y**. Acest mecanism permite funcției să modifice variabilele din programul principal, deoarece nu lucrează cu copii ale acestora, ci direct cu locațiile lor din memorie.
  
-<​note>​Putem folosi transmiterea prin pointer atunci când vrem sa facem anumite modificări asupra variabilelor,​ dar se poate utiliza și atunci când ne dorim doar să **evităm** copierea inutilă a valorilor, spre exemplu ​afisarea ​valorilor unui vector de numere întregi.</​note>​+<​note>​Putem folosi transmiterea prin pointer atunci când vrem să facem anumite modificări asupra variabilelor,​ dar se poate utiliza și atunci când ne dorim doar să **evităm** copierea inutilă a valorilor, spre exemplu ​afișarea ​valorilor unui vector de numere întregi.</​note>​
  
 <code cpp> <code cpp>
Line 747: Line 747:
 </​code>​ </​code>​
  
-Se poate observa cât de elegant am evitat acum codul duplicat prin construirea a doi comparatori (cele două funcții care întorc o valoare booleană) pentru a decide ordinea de sortare și trimiterea adreselor acestora ca al treilea parametru de la funcția de sortare. Așadar prin utilizarea function pointer-ului ca parametru beneficiem de flexibilitate și eleganță în cod chiar dacă sintaxa nu este cea mai prietenoasă. Acesta este doar un simplu exemplu demonstrativ de utilizare a pointerilor la funcții. Pentru mai multe exemple de cum pot fi folosți pointerii la funcții puteți citi de [[https://​www.geeksforgeeks.org/​function-pointer-in-c/​|aici]].+Se poate observa cât de elegant am evitat acum codul duplicat prin construirea a doi comparatori (cele două funcții care întorc o valoare booleană) pentru a decide ordinea de sortare și trimiterea adreselor acestora ca al treilea parametru de la funcția de sortare. Așadar prin utilizarea function pointer-ului ca parametru beneficiem de flexibilitate și eleganță în cod chiar dacă sintaxa nu este cea mai prietenoasă. Acesta este doar un simplu exemplu demonstrativ de utilizare a pointerilor la funcții. Pentru mai multe exemple de cum pot fi folosiți pointerii la funcții puteți citi de [[https://​www.geeksforgeeks.org/​function-pointer-in-c/​|aici]].
  
 <note important>​Tipul de date **bool** în C++ este un **tip de bază**, care simplifică exprimarea condițiilor în programare. O variabilă booleană poate avea doar două valori: **true** sau **false**, făcând astfel codul mai clar și mai ușor de înțeles. Se recomandă utilizarea tipului **bool** în locul tipului **int** atunci când rezultatul unei comparații este strict **adevărat** sau **fals**. În C, pentru a folosi acest tip de date, este necesară includerea antetului **stdbool.h** prin directiva ''#​include <​stdbool.h>''​ la începutul programului.</​note>​ <note important>​Tipul de date **bool** în C++ este un **tip de bază**, care simplifică exprimarea condițiilor în programare. O variabilă booleană poate avea doar două valori: **true** sau **false**, făcând astfel codul mai clar și mai ușor de înțeles. Se recomandă utilizarea tipului **bool** în locul tipului **int** atunci când rezultatul unei comparații este strict **adevărat** sau **fals**. În C, pentru a folosi acest tip de date, este necesară includerea antetului **stdbool.h** prin directiva ''#​include <​stdbool.h>''​ la începutul programului.</​note>​
Line 755: Line 755:
 La fel ca în C, în C++ putem declara variabile constante folosind cuvântul cheie **const**. Așa cum le spune și numele variabilele constante sunt acea categorie de variabile care odată ce au fost inițializate cu o valoare **nu** mai pot fi modificate ulterior. La fel ca în C, în C++ putem declara variabile constante folosind cuvântul cheie **const**. Așa cum le spune și numele variabilele constante sunt acea categorie de variabile care odată ce au fost inițializate cu o valoare **nu** mai pot fi modificate ulterior.
  
-<note warning>​O **variabilă constantă** se ințializează pe linia unde a fost **declarată** altfel va genera o eroare de compilare.</​note>​+<note warning>​O **variabilă constantă** se inițializează pe linia unde a fost **declarată** altfel va genera o eroare de compilare.</​note>​
  
 == Utilizarea keyword-ului const pe variabile obișnuite == == Utilizarea keyword-ului const pe variabile obișnuite ==
Line 807: Line 807:
  
     // Pointer constant la un int constant     // Pointer constant la un int constant
-    // P3 este un pointer constant la un int constant si pointerul in sine nu poate fi schimbat (nu poate pointa catre alta adresa)+    // P4 este un pointer constant la un int constant si pointerul in sine nu poate fi schimbat (nu poate pointa catre alta adresa)
     const int* const p4 = &a;     const int* const p4 = &a;
  
     // Efectiv aceeași declaratie ca p4, dar cu sintaxa diferita     // Efectiv aceeași declaratie ca p4, dar cu sintaxa diferita
-    // P4 este un pointer constant la un int constant si pointerul in sine nu poate fi schimbat+    // P5 este un pointer constant la un int constant si pointerul in sine nu poate fi schimbat
     int const* const p5 = &a;     int const* const p5 = &a;
  
Line 847: Line 847:
   * **Istoricul modificărilor** – putem reveni oricând la o versiune anterioară.   * **Istoricul modificărilor** – putem reveni oricând la o versiune anterioară.
   * **Gestionarea branch-urilor** – dezvoltare paralelă și integrare prin **merge**.   * **Gestionarea branch-urilor** – dezvoltare paralelă și integrare prin **merge**.
-  * **Integrare cu unelte moderne** – paltforma ​GitHub permite **code review**, **issue tracking** și **CI/CD**.+  * **Integrare cu unelte moderne** – platforma ​GitHub permite **code review**, **issue tracking** și **CI/CD**.
  
 === Termeni specifici === === Termeni specifici ===
Line 953: Line 953:
   * Pentru a vă crea un cont pe GitHub puteți urmări indicațiile de [[https://​youtu.be/​Gn3w1UvTx0A|aici]]   * Pentru a vă crea un cont pe GitHub puteți urmări indicațiile de [[https://​youtu.be/​Gn3w1UvTx0A|aici]]
 </​note>​ </​note>​
 +
 ==== Concluzii ==== ==== Concluzii ====
  
-În cadrul acestui laborator am explorat asemănările dintre **C** și **C++** și am observat că ambele limbaje folosesc **aceeași sintaxă** de bază pentru **variabile**,​ **funcții** și **instrucțiuni**. De asemenea, am înțeles în mare ce sunt **Git** și **GitHub** și am învățat să **inițializăm** și să **clonăm** repository-uri,​ să lucrăm cu **branch-uri**,​ să facem **commit-uri** și să folosim comenzi precum **push** sau **pull**. În esență laboratorul și-a propus trecerea lină de la **C** la **C++** cât și pregătirea mediului de lucru pe partea de **Git** și **Github**.+În cadrul acestui laborator am explorat asemănările dintre **C** și **C++** și am observat că ambele limbaje folosesc **aceeași sintaxă** de bază pentru **variabile**,​ **funcții** și **instrucțiuni**. De asemenea, am înțeles în mare ce sunt **Git** și **GitHub** și am învățat să **inițializăm** și să **clonăm** repository-uri,​ să lucrăm cu **branch-uri**,​ să facem **commit-uri** și să folosim comenzi precum **push** sau **pull**. În esență laboratorul și-a propus trecerea lină de la **C** la **C++** cât și pregătirea mediului de lucru pe partea de **Git** și **GitHub**.
poo-is-ab/laboratoare/01.txt · Last modified: 2026/09/28 12:50 by razvan.cristea0106
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0