This shows you the differences between two versions of the page.
poo-is-ab:laboratoare:01 [2024/10/02 10:14] razvan.cristea0106 [Asemănări C/C++] |
poo-is-ab:laboratoare:01 [2025/01/19 22:27] (current) razvan.cristea0106 |
||
---|---|---|---|
Line 12: | Line 12: | ||
==== Introducere ==== | ==== Introducere ==== | ||
- | În acest laborator vom face o scurtă recapitulare a noțiunilor de bază învățate în limbajul C și vom vedea care sunt diferențele în linii mari dintre limbajele C și C++. Noi vom scrie programe în C++ pe întreg parcursul acestui semestru, deoarece vom învăța o nouă paradigmă de programare și anume cea __**Orientată Obiect (OO)**__. | + | În acest laborator vom face o scurtă recapitulare a noțiunilor de bază învățate în anul întâi la disciplina **Programarea Calculatoarelor și Limbaje de Programare (PCLP)** și vom vedea care sunt diferențele în linii mari dintre limbajele C și C++. Noi vom scrie programe în C++ pe întreg parcursul acestui semestru, deoarece vom învăța o nouă paradigmă de programare și anume cea **Orientată Obiect (OO)**. |
==== Scurt Istoric ==== | ==== Scurt Istoric ==== | ||
Line 183: | Line 183: | ||
</code> | </code> | ||
- | Pasul indică la ce iterație ne aflăm în bucla for și dacă este satisfăcută condiția de continuare. Putem lua ca exemplu de cod incrementarea cu 5 a valorilor unui vector de numere întregi. | + | Pasul indică la ce iterație ne aflăm în bucla **for** și dacă este satisfăcută condiția de continuare. Putem lua ca exemplu de cod incrementarea cu 5 a valorilor unui vector de numere întregi. |
<code cpp> | <code cpp> | ||
Line 233: | Line 233: | ||
</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 dacă condiția este adevărată sau falsă. | + | 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 dacă condiția este adevărată sau falsă. |
Forma generală a instrucțiunii do-while | Forma generală a instrucțiunii do-while | ||
Line 267: | Line 267: | ||
<note>Puteți folosi oricare din cele 3 instrucțiuni repetitive, important este ca efectul codului scris de voi să fie cel dorit și să fiți atenți la cum puneți condițiile.</note> | <note>Puteți folosi oricare din cele 3 instrucțiuni repetitive, important este ca efectul codului scris de voi să fie cel dorit și să fiți atenți la cum puneți condițiile.</note> | ||
- | <note warning>Trebuie menționat faptul că șansele de a intra într-o **buclă infinită** sunt mai mari atunci când folosim instrucțiunea **while**, deoarece putem omite să modificăm **pasul** la fiecare iterație. Instrucțiunea **for** este mai sigură din acest punct de vedere, dar trebuie menționat că putem avea un infinite loop chiar și dacă folosim cum nu trebuie for-ul. | + | <note warning>Trebuie menționat faptul că șansele de a intra într-o **buclă infinită** sunt mai mari atunci când folosim instrucțiunea **while**, deoarece putem omite să modificăm **pasul** la fiecare iterație. Instrucțiunea **for** este mai sigură din acest punct de vedere, dar trebuie menționat că putem avea un **infinite loop** chiar și dacă folosim cum nu trebuie for-ul. |
</note> | </note> | ||
Line 286: | Line 286: | ||
</code> | </code> | ||
- | Astfel programul nu va mai ieși din bucla for și va multiplica valoarea lui x de 10 ori la infinit. | + | Astfel programul nu va mai ieși din bucla **for** și va multiplica valoarea lui x de 10 ori la infinit. |
=== Utilizarea pointerilor === | === Utilizarea pointerilor === | ||
- | 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ă luam spre exemplu următoarea secvență de cod. |
<code cpp> | <code cpp> | ||
Line 310: | Line 310: | ||
Pe linia ''int* ptr = &x;'', ceea ce se întâmplă este faptul că pointerul **ptr** este asociat cu adresa variabilei **x** (apariția săgeții de la **ptr** la **adresa** lui **x** din desen). Practic, **ptr** devine un **"arătător"** către locația din memorie unde este stocată variabila **x**. Este important să înțelegeți că un pointer nu este altceva decât o variabilă specială care conține adresa de memorie a unei alte variabile. Astfel, **ptr** indică către adresa lui **x** și poate fi folosit pentru a accesa sau modifica valoarea lui **x** prin intermediul acestei adrese. | Pe linia ''int* ptr = &x;'', ceea ce se întâmplă este faptul că pointerul **ptr** este asociat cu adresa variabilei **x** (apariția săgeții de la **ptr** la **adresa** lui **x** din desen). Practic, **ptr** devine un **"arătător"** către locația din memorie unde este stocată variabila **x**. Este important să înțelegeți că un pointer nu este altceva decât o variabilă specială care conține adresa de memorie a unei alte variabile. Astfel, **ptr** indică către adresa lui **x** și poate fi folosit pentru a accesa sau modifica valoarea lui **x** prin intermediul acestei adrese. | ||
- | <note warning>Un pointer poate pointa doar către **o singură** adresă, situația de mai jos fiind taxată cu o eroare de compilare.</note> | + | <note warning>**Un pointer** poate pointa doar către **o singură** adresă, situația de mai jos fiind taxată cu o eroare de compilare.</note> |
<code cpp> | <code cpp> | ||
Line 762: | Line 762: | ||
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 cele care odată inițializate cu o valoare **nu** mai pot fi modificate. | 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 cele care odată inițializate cu o valoare **nu** mai pot fi modificate. | ||
- | <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 inț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 835: | Line 835: | ||
=== Citirea și afișarea variabilelor === | === Citirea și afișarea variabilelor === | ||
- | În C erați obișnuiți să citiți și să afișați variabilele utilizând funcțiile **scanf** și **printf**. În C++ vom folosi operatorul **>>** pentru citire și operatorul **<<** pentru afișare. | + | În C erați obișnuiți să citiți și să afișați variabilele utilizând funcțiile **scanf** și **printf**. În C++ vom folosi operatorul **%%>>%%** pentru citirea datelor de la tastatură sau din fișiere și operatorul **%%<<%%** pentru afișarea datelor în fișiere sau consolă. |
- | == Citirea și afisarea în C == | + | == Citirea și afișarea în C == |
<code c> | <code c> | ||
Line 855: | Line 855: | ||
</code> | </code> | ||
- | == Citirea și afisarea în C++ == | + | == Citirea și afișarea în C++ == |
<code cpp> | <code cpp> | ||
Line 1190: | Line 1190: | ||
Funcția afisareVector folosește referințe constante la pointeri (const int* const& v), pentru a garanta că atât adresa vectorului, cât și conținutul acestuia nu vor fi modificate în timpul afișării, menținând integritatea datelor. | Funcția afisareVector folosește referințe constante la pointeri (const int* const& v), pentru a garanta că atât adresa vectorului, cât și conținutul acestuia nu vor fi modificate în timpul afișării, menținând integritatea datelor. | ||
- | <note important>C++ introduce posibilitatea de a inițializa pointerii cu **nullptr**, care este specific doar pentru acest tip de date. Acesta funcționează similar cu **NULL**, dar cu un avantaj important: **nullptr** este un tip de date dedicat **pointerilor**, ceea ce previne atribuirea sa accidentală altor tipuri de variabile, cum se putea întâmpla cu **NULL** în C++. În C++, **NULL** este definit doar ca un **macro** care reprezintă valoarea 0 și poate fi atribuit chiar și variabilelor care nu sunt pointeri, lucru care poate duce la erori neintenționate.</note> | + | <note important>C++ introduce posibilitatea de a inițializa pointerii cu **nullptr**, care este specific doar pentru acest tip de date. Acesta funcționează similar cu **NULL**, dar cu un avantaj important: **nullptr** este un tip de date dedicat **pointerilor**, ceea ce previne atribuirea sa accidentală altor tipuri de variabile, cum se putea întâmpla cu **NULL** în C++. În C++, **NULL** este definit doar ca un **macro** care reprezintă valoarea 0 și poate fi atribuit chiar și variabilelor care nu sunt pointeri, lucru care poate duce la confuzii nedorite.</note> |
<code cpp> | <code cpp> | ||
Line 1209: | Line 1209: | ||
==== Concluzii ==== | ==== Concluzii ==== | ||
- | Am putut observa în cadrul acestui laborator care sunt asemănările dar și diferențele în linii mari dintre C și C++. De acum înainte suntem pregătiți să explorăm paradigma orientată obiect pe care o vom începe din laboratorul următor. | + | Am putut observa în cadrul acestui laborator care sunt **asemănările**, dar și **diferențele** în linii mari dintre C și C++. De acum înainte suntem pregătiți să explorăm **Paradigma Orientată Obiect** pe care o vom începe din laboratorul următor. |