Sunteți pe pagina 1din 29

Programarea calculatoarelor

Capitolul I
Noțiuni de bază în programare

Informațiile vehiculate de om, în diferite situații, sunt legate de mijloacele prin


care acesta comunică cu mediul înconjurător și cu ceilalți oameni. În primul caz,
informațiile apar sub formă de imagini și sunete, iar în al doilea caz informațiile apar
în plus sub formă de texte (cărți, reclame, etichete de produs) și sub formă de
numere (sume de bani, vârste). În scopul manipulării acestor tipuri de informație prin
intermediul tehnicii de calcul, fiecare din categoriile de mai sus capătă o reprezentare
anume, pentru a fi „inteligibilă” calculatorului numeric.
Calculatoarele actuale sunt denumite calculatoare numerice (sau digitale – de
la cuvântul englezesc „digit” - cifră) pentru că ele transformă toate informațiile pe
care le stochează și prelucrează în reprezentări discrete. Au existat și calculatoare
analogice, în care informația păstra reprezentarea continuă, firească, a semnalelor
din lumea înconjurătoare; aceste calculatoare prelucrau semnalele continui cu
ajutorul „dispozitivelor electronice analogice” de tip amplificator de semnal, integrator
cu condensator electric, etc. Limitările calculatoarelor analogice privind aplicațiile și
modalitatea de stocare a datelor au dus la înlocuirea lor cu dispozitive numerice,
care prin discretizare și cuantificare pot reprezenta și prelucra orice semnal analogic
(cu o precizie mai mare sau mai mică).
Anterior, definiția informației a fost însoțită de exemplificări relative la tipuri de
informații – cum sunt de exemplu imagini, sunete, numere, text. Informațiile logice,
de tip Adevărat/Fals sau Da/Nu, sunt informații abstracte, putând fi considerate piese
elementare de informație fiindcă au doar două valori posibile și reprezintă situații
simple sau generale – de exemplu un eveniment oarecare se produce (Da) sau nu
se produce (Nu). Piesa de informație ce poate avea doar două valori posibile se
numește bit. Bit-ul reprezintă unitatea elementară de informație, atomul informației,
nivelul de la care aceasta nu mai poate fi descompusă. În calculatoarele numerice,
un bit se consideră că poate lua ori valoarea 0 ori valoarea 1, fiecare din acestea
corespunzând de fapt unei situații fizice în care un comutator este deschis –
respectiv, sau un condensator electric este încărcat cu sarcină electrică – respectiv
este descărcat. Valorile 0 sau 1 reprezintă deci „valori logice” (Adevărat/Fals) dar
totodată, fiind cifre, permit crearea de numere. Memoriile semiconductoare ale
calculatoarelor numerice pot stoca biți în miliarde de condensatoare minuscule,
numărul acestor biți reprezentând capacitatea de memorie a respectivului calculator.
Asemenea numere uriașe nu sunt comod de utilizat, de aceea se utilizează multipli
de bit. Octet (sau Byte) este un grup de opt biți reprezentând, tradițional, o celulă de
memorie. Evident ca evaluarea capacităților de memorie actuale, folosind ca unitate
de măsură octetul, nu rezolvă problema numerelor foarte mari vehiculate. De aceea
se folosesc multipli de octet, cu denumiri uzuale ale multiplilor unităților de măsură,
dar cu semnificație diferită.
Reprezentarea interna a datelor se face binar utilizându-se o codificare.
Aceasta codificare poate fi:
• ASCII – cea mai utilizată tabelă de cod, provenind din standardul american
(American Standard Code for Information Interchange);
• Unicode – pe 16 biți, care este o altă extensie a tabelei ASCII și care are un
număr mare de coduri disponibile, pentru reprezentarea nu numai a caracterelor
latine cu diverse diacritice dar și a caracterelor diferite de cel latin (chirilic, arab, etc.)
Sistemul de numerație reprezintă o modalitate de notare matematică și se
definește ca fiind totalitatea regulilor folosite în vederea scrierii numerelor cu ajutorul
simbolurilor de scriere. Un sistem de numerație este nepozițional atunci când
simbolurile de scriere prin care sunt reprezentate cantitățile (numerele/ dimensiunea)
nu au o pondere în funcție de poziția ocupată în cadrul șirului de simboluri ce
desemnează (semnifică) cantitatea globală (totală). Exemplu cel mai elocvent îl
reprezintă sistemul de numerație roman. Un sistem de numerație este pozițional
atunci când aportul unui simbol de scriere (cifră sau literă) în valoarea totală a unui
număr depinde atât de valoarea simbolului de scriere, cât și de locul ocupat de
acesta în reprezentarea numărului respectiv.
Baza unui sistem de numerație pozițional reprezintă numărul de semne
distincte necesare scrierii unui număr sau totalitatea unităților de același ordin de
mărime care formează o unitate de ordin imediat superior.
Sisteme de numerație:
• sisteme în baza 2 (binary numeral system) – Digital computing
• sisteme în baza 5 (quinary numeral system) - Sistemul Roman
• sisteme în baza 8 (octal numeral system) - Informatică
• sisteme în baza 10(decimal numeral system) - Sistemul Arab
• sisteme în baza 16(hexazecimal numeral system) - Informatică
• sisteme în baza 20 (vigesimal numeral system) - Sistemul Mayaș
• sisteme în baza 60 (sexazecimal numeral system) – Sistemul Babilonian.
Modalitatea în care are loc prelucrarea efectivă a unor date se exprimă prin
algoritm – ca pași succesivi, repetiții și ramificații prin care se execută operațiile
vizate. Rezolvarea oricărei probleme presupune o metodă și o execuție în pași a
acesteia, spre soluția dorită.
Pe scurt, algoritmul reprezintă o succesiune ordonată de operații (număr finit de pași)
care trebuie efectuate pentru a realiza un anumit scop. Totodată, algoritmii sunt
modalități prin care se exprimă succesiunea de operații prin care un program pe
calculator poate ajunge, pornind de la datele de intrare furnizate, la rezultatele dorite.
Trebuie remarcat că un algoritm nu exprimă doar operații cu numere ci orice fel de
prelucrări (cu texte, imagini, etc.), având scopul de a ajunge la un rezultat.
Un algoritmul trebuie să dețină următoarele caracteristici:
• caracter discret - este format din mai mulți pași;
• caracter finit - numărul pașilor este limitat;
• caracter determinist – se ajunge la un rezultat;
• caracter realizabil - fiecare operație prevăzută este realizabilă efectiv;
• caracter universal - nu se aplică unui caz izolat, ci unui număr de cazuri, care
diferă prin datele de intrare.
Reprezentarea algoritmilor
În general, descrierea prelucrărilor prin care se obține soluția unei probleme
date se face fără a se specifica tipurile de date utilizate, ca și cum acestea ar fi
subînțelese. Un algoritm este o înșiruire de operațiuni în care se utilizează variabile
și (eventual) alte prelucrări, indicate prin identificatori inventariați într-un dicționar sau
nomenclator ce specifică rolul variabilelor sau prelucrărilor respective.
Există diferite metode de reprezentare a algoritmilor:
• într-un limbaj natural (de exemplu, în limba română);
• sub formă de schemă logică (reprezentare grafică).
• în pseudocod.
Istoric, prima modalitate de exprimare a algoritmilor au constituit-o
organigramele – cu avantajul descrierii grafice, intuitive și ușor de urmărit. Evoluția
către programarea și proiectarea structurată a impus exprimarea prin pseudocod –
cu avantajele descrierii concise, modularizate și apropiate limbajelor de programare.
Succesiunea operațiilor se indică prin linii și săgeți care leagă blocurile grafice
prezentate, astfel constituind așa-numita schemă logică.
Schema logică este clară și intuitivă, indicând riguros atât operațiile cât și
succesiunea lor. Astfel, pentru un număr mare de operații, cu ajutorul schemei logice,
algoritmul devine dificil de reprezentat și de urmărit.
Atunci când se dorește nu doar descrierea algoritmului ci și structurarea
etapelor de rezolvare a problemei (prin modularizare), este indicată utilizarea unui
limbaj codificat care exprimă operațiunile de executat și cele de control al fluxului de
comenzi (cum sunt decizia, repetiția). Modularizarea (adică separarea operațiunilor
pe secțiuni, fiecare cu un scop restrâns și specific) este singura modalitate de
abordare a rezolvării problemelor complexe și cu soluție puțin sau deloc cunoscută.
Pe de altă parte, descrierea algoritmilor prin pseudocod este mult mai compactă
decât schema logică (care necesită mult spațiu pe foaia de scris), este apropiat de
un limbaj de programare, fiind o replică exprimată în limba maternă a programului
structurat.
Rezolvarea diferitor probleme din lumea reală cu ajutorul calculatorului se
poate face doar dacă soluția se cunoaște dar trebuie căutată într-un set existent sau
dacă există o metodă de găsire a soluției. Algoritmul este o asemenea metodă, dar
elaborarea sa este de cele mai multe ori dificilă, considerată uneori (îndeosebi la
începuturile programării) o artă. Este evident că folosirea unor metode sistematice de
elaborare a algoritmilor este mai eficientă decât o căutare „la ureche” sau prin
încercări; aceste metode sunt totodată algoritmi generici ce vor fi concretizați apoi
pentru problema reală dată.
Algoritmii generali pot sta la baza elaborării de algoritmi particulari, pentru
rezolvarea problemelor concrete, după stabilirea celei mai adecvate metode pentru
situația impusă.

Capitolul II
Limbaje de programare
Orice limbaj constituie un mijloc de comunicare între două entități: emițătorul și
receptorul.
În general limbajele sunt de două tipuri:
• limbaje naturale;
• limbaje artificiale.
Limbajele naturale s-au constituit de-a lungul timpului în procesul conlucrării
membrilor societății.
Limbajele artificiale au fost şi sunt create pentru comunicarea într-un
domeniu particular de activitate.

Un limbaj de programare face parte din categoria limbajelor artificiale și este


un set de instrucțiuni și comenzi utilizate pentru a crea un software și/sau pentru a
pentru a furniza instrucțiuni computerului cu scopul de a efectua și îndeplini o
sarcină. Fiecare limbaj de programare are propria sintaxă și semantică, ceea ce îl
face unic și potrivit pentruanumiteîntrebuințări.
În termeni simpli, un limbaj de programare este un vocabular și un set de reguli
gramaticale care îi spun unui computer sau unui dispozitiv de calcul ce să facă.
După cum bine știm, rezolvarea unei probleme se poate face prin mai multe
căi – deci prin algoritmi diferiți, iar în cele mai multe cazuri este utilă, chiar necesară
uneori, compararea acestor căi pentru a răspunde la următoarele întrebări:
• Soluția obținută este corectă? Dacă da este ea optimă?
• Rezolvarea problemei este inteligibilă și ușor de modificat?
• Execuția algoritmului este eficientă - în sensul timpului de calcul și a
resurselor necesare? Pe lângă aceste probleme fundamentale din punct de vedere
practic apar și chestiuni teoretice prin care algoritmii se pot analiza și compara:
• Durata de execuție este predictibilă?
• Cât de complexă este rezolvarea problemei relativ la timpul de calcul
necesar?
Pentru prelucrările simple – de genul calculelor matematice, este suficient un
calculator științific, de buzunar. Dacă aceste calcule sunt combinate pentru a
determina un rezultat al unei probleme care implică un anumit grad de dificultate – de
exemplu soluționarea generală a unei ecuații de gradul întâi, atunci sunt necesare
acțiuni de decizie: de exemplu „este coeficientul necunoscutei nul?” – atunci ecuația
este degenerată; asemenea acțiuni de control a desfășurării prelucrărilor propriu-zise
trebuie realizate printr-un program de calculator, pe baza unor comenzi specifice
limbajului de programare ales. De fapt, pe lângă prelucrările variabilelor (care se
realizează prin acțiuni secvențiale), mai sunt necesare două tipuri generice de
acțiuni: de decizie și de repetiție.
Rezultă că un limbaj de programare trebuie să asigure comenzi de:
a) Atribuire –obținerea unui rezultat pentru o expresie și încărcarea valorii
acestui rezultat în variabila destinație (din stânga semnului =).
b) Decizie – pentru alegerea unei secvențe de comenzi din mai multe variante
(uzual două) urmare a rezultatului unei expresii logice – condiția de decizie.
c) Repetiție – pentru repetarea unei secvențe de comenzi de mai multe ori,
până la îndeplinirea unei condiții de oprire.
Între aceste acțiuni doar atribuirea este cea care privește formularea
expresiilor, rezolvarea și păstrarea rezultatelor. Decizia și repetiția modifică doar
cursul de execuție a atribuirilor. Tabloul comenzilor posibile se completează cu:
d) Salturi și reveniri – pentru întreruperea unei secvențe de comenzi și
preluarea controlului de către altă secvență de comenzi în cadrul aceluiași bloc
program sau într-un subprogram.
e) Operații de intrare/ieșire – pentru interacțiunea cu exteriorul, prin periferice
de intrare / ieșire (către om sau instalații, pentru stocarea sau transferul datelor).
Comenzile din categoriile a) și e) modifică valoarea sau suportul datelor, iar
comenzile din categoriile b) c) și d) modifică controlul asupra fluxul de comenzi.
Uzual, operațiile de intrare / ieșire nu fac parte din limbajul de programare ci din
biblioteci de funcții atașate acestuia.
Un program este un text ce cuprinde o secvență de instrucțiuni din categoriile
enumerate mai sus, care sunt executate în ordinea în care apar în text. Procesorul
asigură preluarea și executarea comenzilor în secvență, aceasta fiind ideea centrală
de funcționare a mașinilor von Neumann. Sintetizând cele enunțate anterior, putem
afirma că programul este un ansamblu de instrucțiuni, scrise într-un limbaj de
programare, pe care calculatorul le execută pentru a îndeplini o anumită sarcină.
După cum se poate imagina, comparativ cu instrucțiunile secvențiale, instrucțiunile
de decizie și de repetiție au o exprimare mai complexă – de exemplu pentru decizie
trebuie indicate acțiunile pentru ramura în care condiția de decizie are rezultat „fals”
sau acțiunile pentru ramura cu rezultat „adevărat”. Instrucțiunile pentru decizii și
repetiții sunt mai complexe și au nevoie de mai multe linii de text pentru a le descrie,
pe când pentru instrucțiunile de atribuire este suficientă o linie de text ce descrie
expresia vizată. De aceea instrucțiunile din prima categorie se consideră „instrucțiuni
simple”, iar cele din ultimele două categorii „instrucțiuni structurate”. Instrucțiuni
simple (secvențiale) Într-un program acțiunile sunt descrise prin linii de cod/text, care
apoi pot fi interpretate și executate de către calculator – linie cu linie sau pe loturi de
linii. Descrierea unei acțiuni complete se încheie cu simbolul”;”(punct și virgulă)
indicând „sfârșitul acțiunii”.
Declarațiile de variabile sunt instrucțiuni în care se declară tipul și, eventual,
valoarea inițială a unor variabile (inițializare). Instrucțiunile expresie sunt expresii de
atribuire, de incrementare/ decrementare sau de invocare de metodă, care se
termină prin simbolul ';' (punct și virgulă), numită și instrucțiunea vidă.
Instrucțiunea de atribuire Prelucrarea efectivă a datelor are loc în cadrul
evaluării instrucțiunii de atribuire: una sau mai multe valori intră într-o expresie al
cărei rezultat se atribuie variabilei stânga, simbolul de atribuire = (în limbajele C++ și
Java) sau := (în limbajul Pascal).
Cele mai cunoscute și utilizate limbaje de programare sunt:
Python este unul din cele mai căutate și utilizate limbaje de programare de
care au acum nevoie angajatorii, mai ales în back-end web development. A crescut
foarte mult în ultimii ani și rămâne pe un trend ascendent, datorită utilității pe care o
are în AI (artificial intelligence), data science și machine learning.
Este un limbaj de programare dinamic, creat de Guido van Rossum și lansat
pe piață în 1991. Acesta poate fi folosit atât pentru a crea alicații pentru desktop, cât
și aplicații web sau framework-uri.
Este unul dintre cele mai ușor de învățat și utilizat limbaje de programare
pentru că are puține particularitați și o sintaxă simplă, care poate fi înțeleasă cu
ușurință, chiar și de cei fără experiență în codare.
Python este cel mai adesea folosit ca limbaj de scripting și automatizare, dar
poate fi folosit și pentru analiza datelor.
Limbajul de programare Python îți poate deschide multe oportunități de carieră
te poate califica pentru joburi precum software engineer, python developer, research
analyst sau data engineer.
Poate cel mai în trend limbaj de programare, Javscript este în topul
preferințelor developerilor an de an, fără a da semne că va fi înlocuit în viitor, mai
ales că este baza web developmentului.
JavaScript este un limbaj de programare cu ajutorul căruia poți construi site-uri
interactive. Este una dintre tehnologiile fundamentale ale internetului, alături de
HTML și CSS.
JavaScript este folosit în principal pentru front-end web development (desigur,
îl poți folosi la fel de bine și în Back-end web development) și este relativ ușor de
învățat, chiar dacă ești începător în ale programării. Poți să scrii cod JavaScript chiar
în browser, însă acesta se poate comporta diferit de la un browser la altul. Pe lângă
website-uri, javascript poate fi folosit și pentru a crea chatboti, system scripts sau
chiar jocuri.
Pe piața de muncă există o mulțime de joburi pentru cei ce scriu cod
javascript. Cele mai populare sunt JavaScript developer sau front-end developer,
care impune nu doar cunoștințe de JavaScript, ci și cunoștințe de HTML și CSS.
Limbajul de programare Java este foarte răspândit tocmai pentru că este atât
de stabil și scalabil, ceea ce îl face foarte căutat în rândul angajatorilor. Acesta poate
fi utilizat pentru aplicații de desktop cu interfață grafică, aplicații de mobil (mobile web
development) sau aplicații și chiar servere web, fiind foarte versatil și compatibil cu
multe platforme.
Pe piața de muncă există un deficit de programatori java, așa că decizia de a
învăța acest limbaj de programare îți va garanta o mulțime de oportunități în carieră.
De asemenea, Java poate fi un punct de start pentru învățarea unor limbaje mult mai
complexe, cum ar fi C, C# sau C++.
Un limbaj de programare “old school”, printre primele apărute, C e la fel de
relevant astăzi ca în momentul în care s-a lansat, în 1970.
Da, poate suna mai tentant să înveți limbaje de programare noi apărute, abia
lansate, însă C are avantajul de a fi limbajul pe care s-au bazat zeci de limbaje de
programare care derivă sau au fost influențate de sintaxa și paradigma sa (printre ele
se află chiar și Java, Javascript, C# și D). Prin urmare, le vei putea înțelege foarte
ușor o dată ce ai deslușit C. Așa că să ai cunoștințele de limbaj C sunt foarte utile
pentru un programator care vrea să învețe limbaje mai avansate.
C este un limbaj de programare procedural, flexibil și versatil, care îi permite
programatorului să aibă control maxim prin comenzi minime. Limbajul C are foarte
puține cuvinte cheie și structuri semantice, însă nu este foarte ușor de învățat, mai
ales pentru un începător în programare – pregătește-te pentru o curbă de învățare
mai mare, dar care va merita din plin toate eforturile tale.
Pentru că multe persoane optează pentru limbaje de programare mai noi,
învățarea limbajului de programare C te poate diferenția pe piața de muncă pentru că
C rămâne an de an în preferințele angajatorilor, mai ales dacă vrei să lucrezi îngame
development și systems programming.
Limbajul de programare C++ este o versiune updatată a limbajului C. C++
poate fi numit limbaj hibrid pentru că este o combinație între un limbaj procedural și
un limbaj de programare orientat pe obiecte.
Principala diferență între C și C++ o constituie funcționalitățile de clase și
obiecte și relația de moștenire dintre clasele de bază și clasele derivate din acestea.
C++ este un limbaj scalabil, cu ajutorul căruia poți crea aplicații ce consumă
multe resurse, precum aplicații pentru desktop sau jocuri cu grafică complexă. Așa
că dacă vrei să lucrezi ca developer în industria de gaming, C++ este limbajul potrivit
pentru tine.
PHP este un limbaj de programare special creat pentru web development.
PHP este deopotrivă un limbaj simplu de programare pentru începători, însă în
același timp îi oferă unui developer experimentat multe funcționalități avansate.
Chiar dacă există developeri care consideră că PHP un limbaj de programare
învechit, acesta își păstrează relevanța chiar și în 2021. Conform Best Programming
Language, 80% dintre cele mai bune 10 milioane de site-uri din lume folosesc PHP.
Pentru că PHP este atât de utilizat și în prezent, există o mulțime de posturi
disponibile pentru developerii PHP pe piață.
C# este un limbaj de programare orientat pe obiecte, ce a fost lansat în 2000
și gândit ca competitor pentru limbajul Java, cu care este foarte similar.
C# este un limbaj de programare versatil, cu care poți crea aplicații pentru
Windows, dar și aplicații pentru web sau pentru device-uri mobile. C# are cea mai
rapidă evoluție și este unul dintre limbajele folosite pentru a crea aplicații în
framework-ul .NET.
Oportunitățile de angajare pentru developerii C# sunt numeroase, așa că
studierea acestui limbaj de programare poate fi considerată o adevărată investiție în
carieră.
Kotlin este un limbaj hibrid, care combină funcționalități de programare
funcțională cu funcționalități de programare orientată pe obiecte. A fost conceput să
funcționeze perfect împreună cu Java, însă este un limbaj de programare mai concis,
prin care poți rezolva probleme frecvente de programare cu doar câteva linii de cod.
Kotlin este unul dintre limbajele de programare mai nou apărute pe piață, însă
deja s-a remarcat ca fiind limbajul preferat de Google pentru dezvoltarea aplicațiilor
pentru Android. Pentru că popularitatea acestui limbaj continuă să crească, la fel se
întâmplă și cu oportunitățile profesionale pentru developerii Kotlin. Cele mai populare
joburi pentru cunoscătorii de Kotlin sunt Kotlin developer sau Android developer.
Limbajul de programare Go sau Golang a fost creat în 2009 de către Robert
Griesemer, Rob Pike și Ken Thompson, pentru Google. Sintaxa Go este simplă și
ușor de înțeles, de aceea Go a surclasat limbajul Python și a devenit cel mai ușor de
învățat limbaj de programare.
Go este de două ori mai rapid decât orice alt limbaj de programare pentru că
folosește goroutines în loc de thread-uri și le permite programatorilor să lucreze cu
milioane de goroutines simultan. Deși Go este un limbaj de programare cu foarte
mult potențial, este încă la început de drum și are anumite neajunsuri pe care
predecesori precum Java sau Python nu le au.
Tocmai pentru că este atât de nou, limbajul Go nu îți oferă atât de multe
oportunități profesionale, joburile de Go developer fiind mai puțin numeroase decât
cele de Java developer sau Python developer.
Rust este un limbaj de programare similar cu C și C++ care a fost dezvoltat de
Mozilla în 2015. Limbajul Rust are un sistem de management modern și poate fi
instalat cu orice sistem de operare sau sistem embedded. Este un cod versatil, cu
care poți crea de la sisteme de operare și kernel-uri, până la browsere web și jocuri.
Cu toate astea, Rust nu este cel mai ușor limbaj de programare și poate fi
copleșitor pentru un începător. Să înveți sintaxa și regulile de programare Rust nu
este de ajuns, trebuie să ai și o gândire logică și precisă. Experiența anterioară cu
limbaje de programare precum C, C++, Python sau Java se va dovedi foarte
valoroasă pentru un developer care vrea să învețe Rust.
Posturile de Rust developers disponibile pe piață nu sunt numeroase, tocmai
pentru că Rust e încă la început de drum, iar companiile preferă să parieze pe
limbaje de programare cu notorietate mai mare.
Creat de Apple în 2014, Swift este un limbaj de programare compatibil cu
sistemele de operare și framework-urile Apple.
Limbajul Swift este similar cu Python și Ruby și a fost gândit să fie ușor de
utilizat pentru începătorii care aspiră să devină software engineer. Codul Swift are
foarte multe elemente din limba engleză, ceea ce îl face simplu de citit chiar și pentru
cei care nu au cunoștințe în programare.
Pentru că Swift a fost creat de și pentru Apple, acest limbaj de programare îți
oferă posibilitatea să te îndrepți către un job de iOS developer. Așa că dacă vrei să
dezvolți software-uri și aplicații pentru produsele Apple, atunci Swift este limbajul de
programare pe care vrei să îl înveți.
Atunci când faci o alegere e necesar să ții cont de specificul limbajului, de
cunoștințele tale în domeniu, dar și de diversitatea ofertelor de pe piața de muncă la
care îți oferă acces. În momentul de față platformele de joburi din România pun
accentul pe Java, C++ și PHP.

Categorii de limbaje de programare


Există mai multe tipuri de limbaje de programare, fiecare cu propriul său set
de caracteristici și avantaje. În continuare, vom explora cele mai populare tipuri de
limbaje deprogramare.
Limbajele de programare pot fi clasificate în două categorii principale: limbaje
de nivel înalt (high level) și limbaje de nivel scăzut (low level). Aceste categorii se
referă la nivelul de abstractizare pe care limbajul îl oferă programatorului.
Limbaje de programare de nivel înalt – high level
Limbajele de programare high level sunt concepute pentru a fi ușor de citit și
de scris. Ele sunt de obicei mai abstracte decât limbajele low level, ceea ce
înseamnă că sunt mai îndepărtate de la nivelul hardware. Această categorie de
limbaje oferă un nivel de portabilitate, ceea ce înseamnă că un cod poate fi folosit pe
diferite platforme fără a fi modificat. Limbajele high level folosesc cuvinte cheie și
sintaxă care seamănă cu limbajul natural, făcându-le ușor de înțeles atât pentru
programatori, cât și pentru non-programatori. Limbajele de nivel înalt au de obicei
funcții și biblioteci încorporate care simplifică sarcinile complexe, cum ar fi
programarea în rețea sau accesul la baze de date.
Limbaje de programare high level – AVANTAJE
1. Se învață mai ușor decât limbajele low level;
2. Sunt mai portabile, ceea ce înseamnă că un cod poate fi rulat pe diferite
platforme fără modificare;
3. Abstracția mai mare permite o dezvoltare și depanare mai rapide;
4. Există o comunitate mare care optează pentru limbaje high level, astfel poți
găsi sprijin și răspuns la întrebări mai ușor.
Limbaje de programare de nivel scăzut – low level
Limbajele de programare de nivel scăzut sunt mai apropiate de hardware și oferă
un nivel mai mic de abstractizare. Ele sunt de obicei mai dificil de citit și de scris, dar
oferă un control mai fin asupra hardware-ului, făcându-le mai eficiente și mai rapide.
Aceste limbaje oferă acces direct la hardware și permit programatorului să-și
optimizeze codul pentru configurații hardware specifice. Limbajele de nivel scăzut nu
au funcții sau biblioteci încorporate, ceea ce înseamnă că programatorul trebuie să-și
scrie propriile funcții pentru sarcini comune.
Limbaje de programare low level – AVANTAJE
1. Oferă un control mai mare asupra hardwear-ului;
2. Codul este mai rapid, mai precis și mai eficient;
3. Utilizează mai puțină memorie
4. Este util pentru scrierea de software la nivel de sistem
Tipuri de limbaje de programare
Există numeroase criterii pentru a clasifica un limbaj de programare. Unele
limbaje se pot încadra perfect chiar și în două sau mai multe grupare. În continuare
îți vom prezenta 10 tipuri principale de limbaje de programare.
1. Limbaje de programare procedurale
Limbajele de programare procedurale sunt un tip de limbaje care se concentrează pe
secvența de acțiuni necesare pentru a îndeplini o sarcină specifică. Aceste limbaje
de programare utilizează proceduri, funcții sau subrutine pentru a împărți codul în
bucăți mai mici și mai ușor de gestionat. Adică, fiecare serie de pași se numește
procedură, iar un program scris într-una dintre aceste limbi va avea una sau mai
multe proceduri în el.
Limbajele de programare procedurale sunt utilizate în special pentru dezvoltarea de
software de nivel scăzut, cum ar fi driverele și sistemele de operare. Acestea sunt
adesea considerate mai rapide și mai eficiente decât limbajele de programare
orientate pe obiecte sau funcționale, deoarece se concentrează pe sarcina specifică
de executat. Cu toate acestea, limbajele de programare procedurale pot fi mai dificil
de înțeles și de gestionat decât celelalte tipuri de limbaje, deoarece programatorii
trebuie să aibă o mai mare înțelegere a structurii codului și a fluxului de control.
Cele mai cunoscute limbaje procedurale: C, C++, Java, Pascal, BASIC.
2. Limbaje de programare funcționale
Limbajele funcționale se bazează pe evaluarea funcțiilor matematice și pe
programarea bazată pe expresii. Acestea sunt construite pe ideea că programarea ar
trebui să se concentreze pe evaluarea expresiilor matematice și să evite efectele
secundare.
Limbajele de programare funcționale sunt utilizate în special pentru aplicații
matematice și științifice, precum și pentru procesarea de date. Ele sunt adesea
considerate mai sigure și mai ușor de înțeles decât limbajele procedurale sau
orientate pe obiecte, deoarece elimină efectele secundare și evită utilizarea
variabilelor globale.
Cele mai cunoscute limbaje funcționale: Scala, F#, Elixir, Haskell.
3. Limbaje de programare orientate pe obiecte
Limbajele de programare orientate pe obiecte au la bază definirea și utilizarea
obiectelor în programare. Acestea sunt construite pe ideea că programarea ar trebui
să se concentreze pe obiecte reale și să evite abstracțiile matematice. Ele sunt
utilizate în special pentru dezvoltarea de aplicații complexe și pentru dezvoltarea de
software de nivel înalt. Ele sunt adesea considerate mai ușor de gestionat și de
înțeles decât limbajele procedurale sau funcționale, deoarece utilizează obiecte și
clase pentru a organiza codul și a împărți sarcinile.
Cele mai cunoscute limbaje orientate pe obiecte: Java, Python, Ruby, PHP, C++.
4. Limbaje de programare declarative
Limbajele de programare declarative sunt un tip de limbaje care se concentrează pe
descrierea problemei și pe specificarea relațiilor dintre elemente, în locul descrierii
exacte a modului în care se realizează o sarcină. Acestea sunt construite pe ideea
că programarea ar trebui să se concentreze pe descrierea sarcinii, în locul
specificării metodelor și instrucțiunilor de control. Ele permit programatorilor să
descrie problemele într-un mod clar și concis, permițând apoi interpretorului să
determine soluțiile.
Cele mai cunoscute limbaje declarative: Prolog, Lisp, Haskell, ML.
5. Limbaje de programare front-end
Limbajele front-end sunt folosite în dezvoltarea de aplicații și site-uri web, în special a
părții vizuale și interactive a acestora. Acestea sunt construite pe ideea că
programarea ar trebui să se focuseze pe experiența utilizatorului și pe interacțiunea
acestuia cu site-ul sau aplicația web.
Limbajele de programare front-end sunt limbaje de programare de nivel înalt și sunt
adesea considerate mai ușor de înțeles și de gestionat decât limbajele de
programare de nivel scăzut, deoarece se concentrează pe partea vizuală și
interactivă a aplicațiilor și site-urilor.
Cu toate acestea, limbajele de programare frontend pot fi mai limitate în
funcționalitățile lor și pot necesita cunoștințe suplimentare pentru a fi utilizate
împreună cu alte limbaje și tehnologii web.
Cele mai cunoscute limbaje front-end: HTML, CSS, JavaScript, React, TypeScript.
6. Limbaje de programare back-end
Limbajele de programare back-end sunt un tip de limbaje care se bazează pe
dezvoltarea de aplicații și servicii web, în special partea de procesare a datelor și de
gestionare a serverelor. Acestea sunt construite pe ideea că programarea ar trebui
să se concentreze pe procesarea și manipularea datelor, în spatele interfeței și
interacțiunii cu utilizatorul. Acestea sunt adesea considerate mai complexe și mai
dificil de înțeles decât limbajele de programare fron-tend, deoarece se concentrează
pe partea de procesare a datelor și de comunicare cu baza de date.
Cele mai cunoscute limbaje back-end: Python, PHP, Java, Ruby, .Net.
7. Limbaje de programare algoritmice
Limbajele algoritmice se ocupă de implementarea algoritmilor și de rezolvarea
problemelor algoritmice. Acestea sunt construite pe ideea că programarea ar trebui
să se concentreze pe rezolvarea de probleme complexe prin intermediul algoritmilor.
Limbajele de programare algoritmice sunt utilizate în special pentru dezvoltarea de
algoritmi și pentru rezolvarea de probleme complexe, precum cele din matematică,
știință și inginerie. Aceste limbaje se consideră a fi printre cele mai sofisticate și greu
de asimilat. Cu toate acestea, limbajele de programare algoritmice sunt esențiale
pentru dezvoltarea de aplicații și de soluții pentru probleme complexe din diferite
domenii de activitate, așadar programatorii care le stăpânesc dețin un avantaj major
în plan profesional.
Cele mai cunoscute limbaje algoritmice: C, Fortran, Lisp, Algol, Cobol, Refal.
8. Limbaje de programare vizuale
Limbajele vizuale utilizează reprezentări grafice pentru a descrie și a crea programe.
Acestea sunt construite pe ideea că programarea ar trebui să fie accesibilă și ușor de
înțeles pentru oricine, lucru posibil prin intermediul unor reprezentări grafice.
Limbajele de programare vizuale sunt utilizate în special pentru a face programarea
mai accesibilă și mai ușor de înțeles pentru utilizatori fără experiență, cum ar fi
copiii/adolescenți sau utilizatorii non-tehnici. Acestea sunt mai ușor de înțeles și de
gestionat decât limbajele de programare tradiționale.
Cele mai cunoscute limbaje algoritmice: Grasshopper, Kodu, Blockly, XOD,
ToonTalk.
9. Limbaje de programare de scripting
Limbajele de programare de scripting sunt utilizate pentru a dezvolta programe și
aplicații care rulează într-un mediu de interpretare, precum un browser web sau un
shell de sistem. Acestea sunt construite pe ideea că programarea ar trebui să fie
rapidă și ușor de implementat. Ele sunt utilizate în special pentru dezvoltarea rapidă
și ușoară de aplicații și programe, precum și pentru automatizarea sarcinilor de
sistem.
Cele mai cunoscute limbaje algoritmice: JavaScript, Python, PHP, Ruby, Pearl.
10. Limbaje de programare de asamblare
Limbajele de asamblare se folosesc pentru a pentru a programa dispozitive de nivel
scăzut, precum procesoarele sau microcontrolerele. Acestea sunt construite pe ideea
că programarea ar trebui să se concentreze pe nivelul scăzut al hardware-ului,
pentru a oferi un control maxim și o performanță optimă.
Capitolul III
Limbajul C++
Este un limbaj multi-paradigmă, cu verificarea statică a tipului variabilelor ce
suportă programare procedurală, abstractizare a datelor, programare orientată pe
obiecte. În anii 1990, C++ a devenit unul din cele mai populare limbaje de
programare comerciale.
Bjarne Stroustrup de la Bell Labs a dezvoltat C++ (inițial denumit C cu clase)
în anii 1980, ca o serie de îmbunătățiri ale limbajului C. Acestea au început cu
adăugarea noțiunii de clase, apoi de funcții virtuale, suprascrierea
operatorilor, moștenire multiplă, șabloane (engleză template) și excepții. Limbajul de
programare C++ a fost standardizat în 1998 ca și ISO 14882:1998, versiunea
curentă fiind din 2003, ISO 14882:2003.
În timp ce Stroustrup a proiectat C cu clase (mai apoi C++), a scris de asemenea
și C front, un compilator care genera cod sursă C din cod C cu clase. Prima lansare
comercială a fost în 1985. În 1982, numele limbajului a fost schimbat de la C cu
clase la C++. Au fost adaugate noi facilități, inclusiv funcții virtuale, supraîncărcarea
operatorilor și a functiilor, referințe, constante, alocare dinamică, un control al tipului
mai puternic și noua variantă de comentariu pe un singur rând (liniile care încep cu
caracterele'//').
În 1985 a fost lansată prima ediție a cărții "The C++ Programming Language"
(Limbajul de programare C++), oferind informații importante despre limbaj, care încă
nu era un standard oficial. În 1989 a fost lansată versiunea 2.0 a C++. Au apărut
acum moștenirea multiplă, clase abstracte, funcții statice, funcții constante și membri
protected. În 1990 o altă carte a fost lansată, oferind suport pentru standarde
viitoare. Ultimele adăugări includeau template-uri, excepții, spații de nume
(namespace-uri) și tipulboolean.
O dată cu evoluția limbajului C++, a evoluat și o bibliotecă standard. Prima
adăugire a fost biblioteca de intrări/ieșiri (I/O stream), care oferea facilități pentru a
înlocui funcțiile tradiționale C cum ar fi printf și scanf. Mai târziu, printre cele mai
semnificative adăugari la biblioteca standard a fost STL (Standard Template Library)
(Biblioteca de formate standard).
Limbajele de programare sunt limbaje asemănătoare cu limbajul
uman. Conțin cuvinte (destul de puține), semne de punctua ție, opera ții
matematice și au reguli de scriere. Programele care rulează pe orice
calculator au fost scrise într-un limbaj de programare.
Programul scris într-un limbaj de programare se
numește program sursă și trebuie traduse într-un limbaj pe care îl
înțelege procesorul, numit cod mașină, sau program executabil.
Pentru anumite limbaje de programare operația de traducere se
numește compilare (cazul lui C, C++, Pascal, etc.), pentru alte limbaje
(PHP, Python, Javascript, etc.) operația de traducere se
numește interpretare. Traducerea este realizată de un program
specializat numit compilator sau interpretor.

Limbajul C++ este un limbaj compilat. Etapele scrierii unui program


în C++ sunt:
 editarea programului C++; se obține fișierul sursă, cu
extensia .cpp
 compilarea fișierului sursă; aici se verifică corectitudinea
sintactică a programului (corectitudinea cuvintelor folosite,
prezența semnelor de punctuație, etc.); dacă programul este
corect sintactic, se va obține fișierul obiect, cu
extensia .o sau .obj
 editarea de legături; se stabilesc legături între fișierul obiect
curent și alte fișiere obiect, ale programatorului sau incluse în
compilator; în urma acestei etape se obține programul executabil.
În Windows, fișierele executabile au extensia .exe;
 programul executabil poate fi lansat în execuție (rulat).

Elementele de limbaj
Limbajul C++ este caracterizat de:
 sintaxă – este formată din totalitatea regulilor de scriere corectă a
programelor;
 semantică – reprezintă semnificaţia construcţiilor corecte din punct de
vedere sintactic;
 vocabular – este format din totalitatea cuvintelor care pot fi folosite într- un
program.
Vocabularul limbajului C++ este format din:
• setul de caractere;
• identificatori;
• cuvinte cheie;
• comentarii;
• separatori.
Setul de caractere
Setul de caractere utilizat pentru scrierea programelor C++ este setul de
caractere al codului ASCII.

Codul ASCII este format din:


• literele mari şi mici ale alfabetului latin (A-Z, a-z);
• cifrele sistemului de numeraţie zecimal (0-9);
• caracterele speciale (blank, +, *, %, =, {, !, #, etc.).
Identificatori
Identificatorii (numele) au rolul de a denumi elemente ale programului
precum constante, variabile, funcţii etc.
Identificatorii:
• reprezintă o secvenţă de litere, cifre şi _ (linia de subliniere) care trebuie să
înceapă cu _ sau cu o literă;
• nu pot fi cuvinte cheie (rezervate) ale limbajului.
Cuvinte cheie (rezervate)
Cuvintele cheie (keywords) sunt cuvinte care au un înţeles bine definit şi nu
pot fi folosite în alt context.
! Exemple

bool default do for if int


break double else long return
case char float
const

Comentarii
Pentru ca un program să fie uşor de înţeles se folosesc comentariile. Acestea
sunt texte care vor fi ignorate de compilator, dar au rolul de a explicita pentru
programator anumite secvenţe de program.
// comentariu
sau
/* comentariu
comentariu
.......*/
Tipuri simple de date (standard)
Prin date se înţelege, în general, tot ceea ce este prelucrat de un
calculator. Fiecare dată are un anumit tip.
Un tip de date defineşte:

• mulţimea valorilor pe care le pot lua datele de tipul respectiv;


• modul de reprezentare a acestora în memorie;
• operaţiile care se pot efectua cu datele respective.
Clasificarea tipurilor de date:
• tipuri de date predefinite - asociate cu un cuvânt cheie, utilizat în
declaraţie;
• tipuri de date definite de utilizator.
Tipuri standard în C++:
• int şi long – pentru memorarea numerelor întregi;
• float şi double pentru memorarea numerelor reale;
• char – pentru memorarea caracterelor;
• void – pentru tip neprecizat.
Tipul void este un tip special, pentru care mulţimea valorilor este vidă. Acest
tip se utilizează atunci când este necesar să specificăm absenţa oricărei valori. De
exemplu, poate fi utilizat pentru a specifica tipul unei funcţii care nu returnează
niciun rezultat.
Tipuri standard în C++. Domeniul de valori şi dimensiunea memoriei
ocupate:
Constante şi variabile
O categorie aparte de date o reprezintă constantele şi variabilele.

Constantele
• constanta are un tip și o valoare fixă pe toată durata execuției programului
care o conține;
• tipul și valoarea unei constante se definesc prin caracterele care compun
constanta respectivă.
Constantele se clasifică astfel:
• numerice: - întregi
- reale
• caracter
şir de caractere
Declararea constantelor
Sintaxa:
const [tip_dată] nume=valoare;
unde:
• const este un cuvânt cheie;
• tip_dată precizează tipul constantei (poate lipsi);
• nume este identificatorul constantei;
• valoare este valoarea constantei.
Variabile
• nume asociat cu una sau mai multe locaţii de memorie;
• valoarea păstrată în aceste locaţii se poate modifica în cursul execuţiei
programului;
• trebuie declarate – se specifică tipul şi numele.
Declararea variabilelor
Sintaxa:
tip_dată nume;
unde:
• tip_dată precizează tipul datei memorate în variabila de memorie;
• nume este identificatorul variabilei de memorie.
Operatori şi expresii
Operatori
Operatorii sunt caractere speciale care indică operaţia care se efectuează în
cadrul unui program.

Clasificarea operatorilor:
• operatori aritmetici;
• operatori relaţionali;
• operatori de egalitate;
• operatori de incrementare şi decrementare;
• operatori logici;
• operatori de atribuire;
• operatorul „,‟ (virgulă);
• operatorul de conversie explicită.
Operatori aritmetici
• - minus (unar) – pentru semn
• + plus (unar) – pentru semn
• + (binar) – adunare
• - (binar) – scădere
• * (binar) – înmulţire
• / (binar) – împărţire întreagă
• % (binar) – restul împărţirii întregi
Operatori de egalitate
 == egal
 != diferit

Rezultatul obţinut în cazul aplicării unuia dintre operatorii de egalitate este


true sau false.
Operatori de incrementare şi decrementare
 ++ incrementare (adună 1)
 - - decrementare (scade 1)
Expresii
O expresie este alcătuită din unul sau mai mulţi operanzi legaţi între ei prin
operatori. Operanzii pot fi constante, variabile sau funcţii.
Operanzii reprezintă valorile care intră în calcul și operatorii desemnează operațiile
care se execută în cadrul expresiei.
expresie= operatori+ operanzi
Tipul unei expresii reprezintă tipul valorii expresiei. Expresiile se împart în două
categorii:
• expresii aritmetice;
• expresii logice.
Expresii aritmetice
• expresiile aritmetice sunt cele care efectuează operaţii aritmetice având ca
rezultat un număr.
Expresii logice
• o expresie logică descrie o condiţie
• valoarea unei expresii logice reprezintă valoarea de adevăr a expresiei
aferente
• o condiţie poate fi falsă/false (valoarea 0) sau adevărată/true (o
valoare diferită de 0)
Operaţii de citire şi scriere
În limbajul C++ operaţiile de introducere şi extragere date se execută prin fluxurile
de date.
Un flux de date (stream) reprezintă fluxul datelor de la sursă (de
exemplu tastatură) la destinaţie (de exemplu ecranul monitorului).
Prin fluxurile de date echipamentele periferice de intrare-ieşire sunt
conectate la programul C++.

Fluxuri de date standard


flux de date de intrare (cin);
flux de date de ieşire (cout).
Pentru operaţiile de citire şi scriere se folosesc instrucţiunile expresie prin
care se creează fluxurile de date, cu ajutorul operatorilor >> şi <<.
Flux de date de intrare (cin)
• conectează tastatura la program
• execută operaţii de citire
• datele de intrare sunt furnizate programului
• datele sunt păstrate în variabile de memorie
• cin reprezintă tastatura
• operatorul de intrare >> înseamnă transmiterea unei valori de la
tastatură

Sintaxa: cin>>nume_var;
sau cin>>nume_var1>>nume_var2 >> … >>nume_varn;

Flux de date de ieşire (cout)


• conectează monitorul la program
• execută operaţii de scriere
• datele de ieşire sunt furnizate de program
• datele sunt transmise către monitor
• cout reprezintă monitorul

• operatorul de ieșire << înseamnă transmiterea unei valori către monitor.


Sintaxa: cout<<nume_var|constantă;
sau cout<<nume_var1|constantă1<< nume_var 2|constantă2<<
… <<nume_varn|constantăn;
Funcţiile de sistem cin>> şi cout<< sunt definite în fişierele biblioteci ale
limbajului C++. Informaţiile despre funcţiile de sistem (nume funcţiei, numărul şi
tipul parametrilor, tipul rezultatului funcţiei) se numesc prototipul funcţiei.
Prototipurile funcţiilor de sistem se găsesc în fişierele antet (header).
Pentru a putea folosi în program funcţiile de sistem se scrie în program
directiva pentru procesor:
#include<iostream>
Cum scriem un program C++? Avem nevoie cel puțin de un editor de text
pentru scrierea sursei și de un compilator C++. Deși fișierul sursă poate fi realizat
cu orice editor de text, de cel mai multe ori folosim un IDE. Un IDE pentru C/C++
foarte utilizat este Code::Blocks împreună cu compilatorul MinGW, sau la fel de
bine utilizat poate fi un compilator online.
Structura generală a unui program C++

• un program C++ este constituit dintr-o succesiune de module, denumite


funcţii
• una dintre aceste funcţii este funcţia principală, denumită main()
• main() este o funcţie specială, care trebuie să apară obligatoriu o singură
dată în orice program C++
• execuţia oricărui program începe cu funcţia main()
• o funcţie este constituită din antet şi corp
• antetul funcţiei conţine numele funcţiei, tipul rezultatului pe care îl
calculează funcţia şi o listă de parametri prin care funcţia comunică cu
exteriorul ei, încadrată între paranteze rotunde
• corpul funcţiei conține declarații și instrucțiuni care specifică prelucrările
realizate de funcția respectivă.

Liniile care încep cu # se numesc directive preprocesor. Ele sunt interpretate


înainte de compilarea propriu-zisă, de către un program numit preprocesor. În cazul
nostru, directiva #include cere preprocesorului să includă în sursă o secțiune a
codului C++ standard, header-ul iostream, care permite realizarea operațiilor de
citire și afișare .
int main()
Această linie reprezintă declararea unei funcții. În esență, o functie este un
grup de instructiuni care are un un nume dat; în acest caz, funcția se
numește main și este alcătuită din toate instrucțiunile care urmează. Funcția
numită main este specială în toate programele C++; această funcție este apelată
când se lansează în execuție programul și trebuie să apară în orice program C++.
În C++, identificatorii sunt grupați în spații de nume – namespaces. Există un
spațiu de nume predefinit, cu numele std, din care fac parte toți identificatorii din
biblioteca C++ standard. Pentru a ne referi mai simplu la identificatorii din spațiul de
nume std se poate folosi instructiunea: using namespace std;

Instrucțiuni

Pentru a genera rezultatele dorite, un program trebuie să acţioneze asupra


datelor într-un mod bine precizat. Descrierea acestor acţiuni se face cu ajutorul
instrucţiunilor limbajului de programare. Comenzile pe care programul le dă
calculatorului, atunci când programul este rulat se numesc instrucţiuni.
Instrucţiunile limbajului C++ sunt:
• instrucţiunea expresie;
• instrucţiunea compusă;
• instrucţiunea if;
• instrucţiunea switch;
• instrucţiunea break;
• instrucţiunea while;
• instrucţiunea do while;
• instrucţiunea for.
Instrucţiunile limbajului C++ se împart în două categorii:
• instrucţiuni simple;
• instrucţiuni de control (structurate). Instrucţiunile simple nu conţin alte instrucţiuni
(exp. instrucţiunea de atribuire). Instrucţiunile de control specifică ordinea în care se
execută instrucţiunile programului, controlând fluxul de execuţie al programului.

Instrucțiunea expresie
Instrucțiunea expresie este cel mai frecvent folosit tip de instrucțiune dintr-un
program C++. O expresie devine instrucțiune dacă este urmată de ;.

Sintaxa:

Expresie;

Exemple:
x = 2;
x ++;
cout << x;

Notă: În C++, operațiile de intrare/ieșire folosind stream-uri sunt și ele operații. În


exemplul de mai sus, cout și x sunt operanzii, iar << este operatorul. Rezultat
operației este o adresă de memorie, a stream-ului cout.

Instrucțiunea declarativă
Printr-o instrucțiune declarativă se pot declara identificatori de un anumit tip.
Identificatorii pot fi variabile, dar vom vedea mai târziu că pot fi și funcții.

Sintaxa este:

Tip_de_date Lista_identificatori;

unde

Tip_de_date poate fi orice tip C++ corect (int, double, etc.),


iar Lista_identificatori este alcătuită din cel puțin un identificator. Dacă sunt mai mulți,
se vor separa prin caracterul virgulă ,.

Exemple:

int x, y , z;
double a;

Instrucțiunea compusă
Instrucțiunea compusă sau blocul este o grupare de declarații și instrucțiuni închise
între acolade {}. Ele au fost introduse cu scopul de a folosi mai multe instrucțiuni
acolo unde sintaxa cere o singură instrucțiune. Instrucţiunea compusă sau blocul
sunt echivalente sintactic cu o singură instrucţiune.

Blocul determină și un domeniu de vizibilitate pentru identificatori. Mai precis,


identificatorii declarați într-un bloc vor fi eliminați la terminarea acestuia.

După acolada închisă}nu se scrie;!

Exemple:

#include <iostream>
using namespace std;
int main(){
int x = 5;
{
int x = 7;
cout << x << endl; // se va afisa 7
}
cout << x << endl; // se va afisa 5
return 0;
}

Instrucțiunea if
Instrucțiunea if este cea mai utilizată structură alternativă.

Sintaxa
Instrucțiunea if are două forme:

Varianta 1

if ( Expresie ) Instrucțiune1 else Instrucțiune2

Varianta 2

if ( Expresie ) Instrucțiune1

Mod de execuție
Expresia trebuie să fie de tip bool sau să poată fi convertită la bool. Conversia se
face astfel:

 dacă expresia este nenulă se va obține valoarea true;


 dacă expresia este nulă se va obține valoarea false.

Instrucțiunea if se execută în felul următor:

Varianta 1
 se evaluează Expresia, care este de tip bool sau poate fi convertită la bool
 dacă valoarea ei este true
o se execută Instrucțiune1
o se continuă cu instrucțiunea care urmează după if
 dacă valoare expresiei este false
o se execută Instrucțiune2
o se continuă cu instrucțiunea care urmează după if

Varianta 2

 se evaluează Expresia
 dacă valoarea ei este true
o se execută Instrucțiune1
o se continuă cu instrucțiunea care urmează după if
 dacă valoare expresiei este false
o se continuă cu instrucțiunea care urmează după if

Observații

 Instrucțiune1 se execută numai dacă Expresie este


adevărată. Instrucțiune2 se execută numai dacă Expresie este falsă. În nicio
situație nu se execută ambele instrucțiuni!
 Instrucțiune1 și Instrucțiune2 pot fi orice fel de instrucțiuni, inclusiv
instrucțiunea vidă și inclusiv o altă instrucțiune if.
 Dacă logica programului o cere, Instrucțiune1 și/sau Instrucțiune2 pot fi
instrucțiuni compuse, care să conțină mai multe instrucțiuni.

Instrucțiunea switch
Instrucțiunea switch permite executarea unor instrucțiuni, în funcție de egalitatea unei
expresii cu anumite valori numerice constante:

Sintaxa
switch ( Expresie ) { case Constanta_1: Grup_Instructiuni_1 break; case
Constanta_2: Grup_Instructiuni_2 break; … case Constanta_N: Grup_Instructiuni_N
break; default: Grup_Instructiuni_default break; }

Mod de execuție

 se evaluează Expresie
 dacă valoarea expresiei este egală cu una dintre valorile constante din
clauzele case, se execută instrucțiunile din grupul de instrucțiuni
corespunzător, apoi se trece la instrucțiunea de după switch
 dacă valoarea expresiei nu este egală cu niciuna dintre valorile constante din
clauzele case, se verifică existența clauzei default;
o dacă există clauza default, se execută instrucțiunile din grupul de
instrucțiuni corespunzător clauzei default, apoi se trece la instrucțiunea
de după switch
o dacă nu există clauza default, se trece la instrucțiunea de după switch

Observații

 Valorile din clauzele case trebuie să fie constante întregi.


 În fiecare grup de instrucțiuni pot să apară oricâte instrucțiuni, de orice tip,
eventual niciuna. Nu este necesară utilizarea instrucțiunii compuse.
 Prezența instrucțiunii break; nu este obligatorie, dar lipsa ei modifică modul de
execuție al instrucțiunii. În exemplul de mai jos:

switch(n)
{
case 1:
cout << "n = 1\n";
case 2:
cout << "n = 2\n";
break;
case 3:
cout << "n = 3\n";
break;
}

dacă valoarea lui n este 1, se va afișa:

n=1
n=2

Mai exact, se execută toate instrucțiunile de la clauza case corespunzătoare valorii


expresiei până la prima instrucțiune break; întâlnită.

Instrucţiunea break
Instrucţiunea break se foloseşte în instrucţiunea decizională switch sau în
instrucţiunile repetitive. Sintaxa: break;
Efect:
• determină ieşirea necondiţionată din instrucţiunea în care apare (switch, while, do
while sau for).

Structurile repetitive execută o instrucțiune de mai multe ori. Se mai numesc


și bucle sau cicluri.

Structurile repetitive pot fi:

 cu număr cunoscut de pași (iterații) – se cunoaște de la început de câte ori


se va execută instrucțiunea
 cu număr necunoscut de pași. Instrucțiunea se execută cât timp o condiție
este adevărată. La fiecare pas se va evalua condiția, iar dacă aceasta este
adevărată se va executa instrucțiunea.

Structurile repetitive cu număr necunoscut de pași pot fi:

 cu test inițial: mai întâi se evaluează condiția; dacă este adevărată se


execută instrucțiunea și procesul se reia.
 cu test final: mai întâi se execută instrucțiunea, apoi se evaluează condiția;
Dacă este adevărată, procesul se reia.

Instrucțiunea care se execută în mod repetat poartă numele de corp al structurii


repetitive, corp al ciclului, corp al buclei și de foarte multe ori este o instrucțiune
compusă, care conține alte instrucțiuni.

În C/C++, instrucțiunile repetitive sunt:

 while – reprezintă o structură repetitivă cu număr necunoscut de pași și test


inițial;
 do...while – reprezintă o structură repetitivă cu număr necunoscut de pași și
test final;
 for – reprezintă o structură repetitivă cu număr cunoscut de pași și test inițial.
Putem spune că structura repetitivă cu număr cunoscut de pași se
implementează în C/C++ prin intermediul său!

Există de asemenea două instrucțiuni care controlează execuția structurilor


repetitive:

 break – întrerupe execuția structurii repetitive curente;


 continue – la întâlnirea ei execuția programului trece la expresiile care
controlează structura repetitivă curentă, ignorând instrucțiunile care îi urmează
în corpul ciclului.

Sintaxa
while (Expresie) Instructiune;

Mod de execuție

1. Se evaluează Expresie, iar rezultatul se convertește la bool


2. Dacă rezultatul este true
o Se execută Instructiune
o Se reia pasul 1.
3. Dacă rezultatul este false, se trece la instrucțiunea de după while.

Observații

 Instructiune se execută cât timp Expresie este true – condiție adevărată.


 Dacă Expresie este de început false, Instructiune nu se execută deloc.
 Instructiune poate fi orice fel de instrucțiune, dar una singură. Dacă sunt
necesare mai multe instrucțiuni, se va folosi instrucțiunea compusă.
 Este necesar ca cel puțin o variabilă care apare în Expresie să-și modifice
valoarea în Instructiune. Altfel se obține o buclă infinită.

Exemplu
 Următorul program citește valoarea variabilei n și calculează suma
primelor n numere naturale.
Instrucțiunea do ... while este o structură repetitivă cu număr necunoscut de
pași și test final.

Sintaxa
do Instructiune while ( Expresie );

Mod de execuție

1. Se execută Instructiune
2. Se evaluează Expresie. Rezultatul se convertește la bool.
3. Dacă rezultatul este true, se reia pasul 1.
4. Dacă rezultatul este false, se trece la instrucțiunea de după do ... while.

Observații

 Instructiune se execută cât timp Expresie este true – condiție adevărată.


 Dacă Expresie este de început false, Instructiune se execută exact o dată. În
orice situație, Instructiune se execută cel puțin o dată.
 Instructiune poate fi orice fel de instrucțiune, dar una singură. Dacă sunt
necesare mai multe instrucțiuni, se va folosi instrucțiunea compusă.
 Este necesar ca cel puțin o variabilă care apare în Expresie să-și modifice
valoarea în Instructiune. Altfel se obține o buclă infinită.

Instrucțiunea for este o structură repetitivă cu număr cunoscut de pași și test


inițial, echivalentă cu while.

Sintaxa
for (Expresie_de_Initializare ; Expresie_de_Testare ; Expresie_de_Continuare)
Instructiune

Mod de execuție

1. Se evaluează Expresie_de_Initializare
2. Se evaluează Expresie_de_Testare. Rezultatul se convertește la bool.
3. Dacă rezultatul este true:
o Se execută Instructiune.
o Se evaluează Expresie_de_Continuare.
o Se revine la pasul 2.
4. Dacă rezultatul este false, se trece la instrucțiunea de după for.
Observații

 Instrucțiunea for este echivalentă cu instrucțiunea while. Sintaxa descrisă mai


sus este echivalentă cu:

Expresie_de_Initializare; while( Expresie_de_Testare ) { Instructiune


Expresie_de_Continuare; }

 Instructiune se execută cât timp Expresie_de_Testare este nenulă – condiție


adevărată.
 Dacă Expresie_de_Testare este de la început vidă, Instructiune nu se execută
deloc, iar Expresie_de_Continuare nu se mai evaluează.
 Instructiune poate fi orice fel de instrucțiune, dar una singură. Dacă sunt
necesare mai multe instrucțiuni, se va folosi instrucțiunea compusă.
 Este necesar ca cel puțin o variabilă care apare în Expresie_de_Testare să-și
modifice valoarea în Instructiune sau la evalurea Expresiei_de_Continuare.
Altfel se obține o buclă infinită.
 Cele trei expresii, de_Initializare, _de_Testare și _de_Continuare sunt
separate prin caracterul ; – obligatoriu!
 Oricare dintre cele trei
expresii, de_Initializare, _de_Testare și _de_Continuare, eventual toate, poate
să lipsească. În acest caz avem expresii vide.
Dacă Expresie_de_Testare este vidă, rezultatul său este nenul!
 Expresie_de_Initializare se execută o singură dată. Poate să conțină și
declararea unor variabile. În acest caz, variabilele vor exista numai în
instrucțiunea for.
 Instrucțiunea break are sens și poate fi folosită numai în
instrucțiunile switch, while, do ... while și for.

 Sintaxa
 break;

 Mod de execuție
 Am văzut semnificația instrucțiunii break atunci când apare în
instrucțiunea switch.

 Efectul instrucțiunii break când apare într-o instrucțiune repetitivă este


întreruperea execuției acesteia și trecerea la instrucțiunea care urmează celei
repetitive.

 Instrucțiunea continue are sens și poate fi folosită numai în


instrucțiunile while, do ... while și for.

 Sintaxa
 continue;

 Mod de execuție
 Efectul instrucțiunii continue este ignorarea instrucțiunilor care îi urmează în
corpul ciclului și revenirea la evaluarea Expresiei, în cazul lui while, do ...
while, respectiv la evaluarea Expresiei_de_Continuare, în cazul lui for.

S-ar putea să vă placă și