45
Programarea Calculatoarelor. Laborator Versiune 0.3 Cristian Vicas ian. 03, 2021

Programarea Calculatoarelor. Laboratorusers.utcluj.ro/~visoft/teach/programareacalculatoarelor...L1. Setarea mediului de lucru 1.1Bine At, i Venit! Bine at, i venit la "Programarea

  • Upload
    others

  • View
    57

  • Download
    0

Embed Size (px)

Citation preview

  • Programarea Calculatoarelor. LaboratorVersiune 0.3

    Cristian Vicas

    ian. 03, 2021

  • Contents

    1 L1. Setarea mediului de lucru 11.1 Bine At,i Venit! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.2 Setare mediu de lucru . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.3 Evaluarea laboratorului (muncă individuală) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

    2 L2. Instruct, iuni de control al execut, iei programului 32.1 Recapitulare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32.2 Not,iuni noi introduse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42.3 Probleme rezolvate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52.4 Probleme propuse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72.5 Evaluarea laboratorului (muncă individuală) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

    3 L3. Operatori s, i Expresii 93.1 Recapitulare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93.2 Not,iuni noi introduse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103.3 Probleme propuse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103.4 Evaluarea laboratorului (muncă individuală) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

    4 L4.Tabele I 134.1 Recapitulare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134.2 Not,iuni noi introduse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144.3 Probleme propuse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144.4 Evaluarea laboratorului (muncă individuală) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

    5 L5. Tabele II 175.1 Recapitulare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175.2 Not,iuni noi introduse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175.3 Probleme propuse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195.4 Evaluarea laboratorului (muncă individuală) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

    6 L6. Structuri. S, iruri de caractere 216.1 Recapitulare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216.2 Probleme propuse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236.3 Evaluarea laboratorului (muncă individuală) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

    7 L7. Operat, ii cu date compuse I 257.1 Recapitulare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

    i

  • 7.2 Probleme propuse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257.3 Evaluarea laboratorului (muncă individuală) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

    8 L8. Operat, ii cu date compuse II 278.1 Probleme propuse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278.2 Evaluarea laboratorului (muncă individuală) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

    9 L9. Structuri de date complexe I 299.1 Recapitulare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299.2 Probleme propuse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309.3 Evaluarea laboratorului (muncă individuală) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

    10 L10. Structuri complexe II 3310.1 Recapitulare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3310.2 Probleme propuse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3310.3 Evaluarea laboratorului (muncă individuală) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

    11 L11. Recursivitate 3511.1 Recapitulare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3511.2 Probleme propuse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3511.3 Evaluarea laboratorului (muncă individuală) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

    12 L12. Pointeri la funct, ii 3712.1 Recapitulare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3712.2 Probleme propuse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3812.3 Evaluarea laboratorului (muncă individuală) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39

    13 Bibliografie 41

    ii

  • L1. Setarea mediului de lucru

    1.1 Bine At, i Venit!

    Bine at,i venit la "Programarea Calculatoarelor", laborator!

    Scopul primului laborator este de a vă seta s, i pune la punct mediul de lucru. Odată ce exemplul "Hello World" rulează,setarea mediului de lucru se consideră bine făcută.

    1.2 Setare mediu de lucru

    Sunt mai multe alternative, pentru început vă recomand pe cele simple, OnlineGDB s, i CodeBlocks. Acestea au"împachetate" toate cele necesare rulării unui program simplu. (IDE, toolchain)

    După ce s, tit,i să scriet,i câteva linii de cod, putet,i încerca Eclipse. Eclipse este "doar" un IDE. Trebuie să avet,i pecalculator un toolchain. Există tutoriale pentru toate sistemele de operare mari, urmărit,i-le cu atent,ie.

    Programele mari (gen Eclipse sau NetBeans) nu vin cu toolchain-ul lor preinstalat pentru că, în practică, există zeci sausute de toolchain-uri. Sunt foarte multe tipuri de arhitecturi, foarte multe variante, iar IDE-urile mai serioase permitsă lucrat,i relativ us, or cu aceste toolchain-uri variate.

    1.2.1 CodeBlocks

    Pe calculatoarele din sala de laborator avet,i instalat mediul CodeBlocks. Urmat,i pas, ii din îndrumătorul de laboratoral colegului meu, Ionel Giosan: Introducere în programare. Scheme logice s, i limbaj pseudocod. Familiarizarea cumediul de dezvoltare CodeBlocks

    Urmat,i instruct,iunile de la sect,iunea: Primul proiect în CodeBlocks

    Mai avet,i câteva opt,iuni la dispozit,ie, mai ales pe dispozitivele de acasă.

    1

    http://users.utcluj.ro/~igiosan/Resources/PC/Lab/L01.pdfhttp://users.utcluj.ro/~igiosan/Resources/PC/Lab/L01.pdf

  • Programarea Calculatoarelor. Laborator, Versiune 0.3

    1.2.2 OnlineGDB

    Există un portal unde putet,i scrie cod direct în browser: OnlineGdb. Vă recomand să vă facet,i un cont pentru a văputea salva munca. Portalul este relativ limitat (nu se poate face debug us, or) dar este suficient pentru primele 2-3laboratoare!

    Din păcate, unele setări de securitate s, i dependint,a de un serviciu extern il fac bun doar pentru a încerca idei, rapid,atunci când nu avem acces la un mediu complet.

    1.2.3 Eclipse CDT

    Mediul de dezvoltare Eclipse, este un mediu profesionist, open-source s, i heavyweight ("greu"). Des, i va fi greoi caprimul contact cu C-ul, (trebuie să avet,i răbdare să citit,i tutoriale) îl recomand cu căldură. CodeBlocks îs, i va arătalimitarea rapid, când avem proiecte un pic mai mari.

    Eclipse CDT funct,ionează pe majoritatea platformelor (Windows, Linux, Mac).

    Mergeti la unul din tutorialele care explică cum să vă instalat,i toolchain-ul.

    Căutat,i Eclipse IDE for C/C++ Developers aici: Eclipse IDE

    Pe scurt, trebue să:

    • Instalat,i MinGW (Minimalist GNU for Windows)

    – Căutat,i mingw-get-setup.exe

    – Instalat,i

    – Rulat,i Instalation Manager s, i selectat,i mingw32-base, mingw32-gcc-g++, msys-base. ApoiInstallation -> Apply Changes

    • Editat,i căile sistemului (la fel ca în tutorial)

    • Instalat,i Eclipse CDT (dezarhivat,i zip-ul)

    • Creat,i un nou proiect "Hello World" C, click dreapta pe el Build Project apoi Run As -> Local C/C++Application

    • Erori? Întrebat,i!

    1.2.4 NetBeans

    NetBeans este un alt IDE popular, mai ales în mediul Java. Trebuie să vă instalat,i Java Runtime Environment de laOracle pentru a putea rula NetBeans.

    Apoi, intrat,i pe tutorial pentru a vă activa plugin-ul de C s, i instala toolchain-ul.

    1.3 Evaluarea laboratorului (muncă individuală)

    Mediul de dezvoltare trebuie să meargă pe calculatorul de laborator s, i pe dispozitivul studentului.

    Exemplul "Hello World" rulează pe toate dispozitivele.

    Putet,i spune, empriric, ce rol are fiecare element din program.

    2 Chapter 1. L1. Setarea mediului de lucru

    https://www.onlinegdb.com/https://wiki.eclipse.org/CDT/User/FAQ#Are_there_complete_HowTos_for_setting_up_the_CDT.3Fhttps://www.eclipse.org/downloads/packages/https://netbeans.org/https://java.com/en/download/https://netbeans.org/community/releases/80/cpp-setup-instructions.html

  • L2. Instruct, iuni de control al execut, iei programului

    2.1 Recapitulare

    În acest moment putem să apelăm un toolchain care să transforme codul sursă în cod executabil. Putem executa acestcod s, i observa rezultatele.

    Am văzut structura unui program minimal, unde trebuie să scriem cod, s, i câteva blocuri constructive care declarăvariabile s, i execută afis, ări pe ecran. Deocamdată le vom folosi as, a cum sunt, mai încolo, intrând în detalii.

    • "Linia de text" int i; declară o variabilă în care putem stoca s, i opera cu întregi cu semn.

    • "Linia de text" printf("%d ", i); cu care pot afis, a cont,inutul lui i împreună cu un mesaj, pe ecran

    • Construct,ia \n care scrisă între ghilimelele de la printf trece la o linie nouă pe ecran

    • Instruct,iunile pot fi grupate în blocuri de instruct,iuni

    • Codul se scrie în funct,ia main() s, i se va executa secvent,ial.

    • Expresii matematice simple.

    Câteva expresii:

    • a = 5 va păstra în a valoarea 5

    • i = i + 1 va păstra în i valoarea incrementată cu 1 a lui i

    • a == 5 va fi adevărată dacă a are valoarea 5.

    • Operat,ii matematice, + - * /

    Am introdus oficial instruct,iunile: for s, i if.

    Convent,ia din C este că dacă o expresie are valoarea zero (0) ea este considerată falsă din punct de vedere al logiciiboleene.

    3

  • Programarea Calculatoarelor. Laborator, Versiune 0.3

    2.1.1 for

    Definit,ia este:

    for( A ; B ; C ) instructiune

    A este expresia de init,ializare, B condit,ia de continuare (sau de terminare) iar C este expresia de reinit,ializare

    A se execută o singură dată la începutul ciclului for, apoi vine instruct,iunea care va fi repetată (care poate fi s, i un blocde instruct,iuni). Apoi, pe rând, se execută C urmat de evaluarea lui B. Dacă B rămâne adevărată, iterat,ia continuă.

    Atent,ie, la final, expresia C va avea cu o execut,ie în plus fat, ă de numărul de rulări ai blocului instruct, iune.

    2.1.2 if

    if( condit, ie ){

    cod A

    }else{

    cod F

    }

    Dacă condit, ie se evaluează la o valoare diferită de zero, se va executa cod A. Dacă se evaluează ca fals, se va executacod F. Asta înseamnă că bucata cod A se va executa doar când condit,ia este adevărată. Partea cu else poate sălipsească.

    Atent,ie la înlocuirea blocului cu o singură instruct,iune s, i la confuziile între = s, i ==.

    2.2 Not, iuni noi introduse

    2.2.1 while

    while( B ) instructiune

    Cât timp expresia B este adevărată se va executa instruct,iunea.

    Atent,ie, utilizatorul este responsabil de a termina bucla while. Dacă condit,ia B nu va fi falsă niciodată, avem un cicluinfinit. instructiune poate fi s, i un bloc de instruct, iuni.

    2.2.2 do ... while

    do instructiune while( B );

    Execută instruct,iunea cât timp B este adevărată

    Se va executa instructiune cel put,in o dată. Apoi se va evalua B. În funct,ie de valoarea de adevăr, se va relua ciclul.

    Reiterăm, de obicei, în limbajul C, acolu unde este legal să apară o instruct,iune este legal să apară s, i un bloc deinstruct,iuni.

    4 Chapter 2. L2. Instruct, iuni de control al execut, iei programului

  • Programarea Calculatoarelor. Laborator, Versiune 0.3

    2.2.3 break

    Dacă vrem să ies, im mai repede din ciclul for putem apela această instruct,iune. Se va ies, i imediat. Util când, căutămo valoare într-un s, ir s, i odată găsită, nu are rost să iterăm până la capăt.

    2.2.4 continue

    Se întâmplă să putem decide că iterat,ia curentă nu mai trebuie executată până la capăt s, i că putem trece la următoarea.

    În momentul întâlnirii ei, se va executa expresia de reinit,ializare s, i condit,ia de continuitate (la for, while) respectiv seva reveni la începutul blocului de instruct,iuni pentru do...while

    2.2.5 goto s, i switch

    Instruct,iunea goto nu o folosit,i

    La switch vom reveni după ce stăpânit,i mai bine expresiile s, i constantele.

    2.3 Probleme rezolvate

    2.3.1 Afis, area numerelor divizibile cu 3

    Problemă: Afis, ati numerele divizibile cu 3, mai mari decât zero s, i mai mici decât 100. Reluat,i s, i adaptat,i exemplul dela curs!

    Sugestie de rezolvare:

    Facem iterativ. Primul pas al fiecărei iterat,ii, proiectarea este dat. Voi trebuie să executat,i implementarea, rularea s, itestarea.

    Preferabil, la fiecare iterat,ie să adăugat,i cod. Nu s, terget,i codul vechi din iterat,ia anterioară dacă nu vă mai trebuie,Comentat,i-l!

    Putet,i să vă verificat,i s, i singuri de succesul fiecărei iterat,ii!

    Iterat,ia 1:

    Creat,i un proiect nou cu "Hello World" s, i rulat,i să fit,i siguri că mediul de dezvoltare este configurat ok

    Iterat,ia 2:

    Declarat,i o variabilă, init,ializat,i cu o valoare s, i afis, at,i-o

    Iterat,ia 3:

    Afis, at,i restul împărt,irii cu 3 a variabilei. Încercat,i mai multe numere pentru variabilă.

    Iterat,ia 3:

    Adăugat,i cod care să afis, eze dacă variabila este divizibilă cu 3 sau nu. Încercat,i mai multe numere.

    Iterat,ia 4:

    Iterat,i pentru toate valorile între 0 s, i 100, cele două instruct,iuni de afis, are de mai sus.

    Iterat,ia 5:

    Adăugat,i condit,ie pentru a afis, a doar numerele divizibile cu 3. Dacă facem această iterat,ie am îndeplinit cerint,eleproblemei!

    2.3. Probleme rezolvate 5

  • Programarea Calculatoarelor. Laborator, Versiune 0.3

    Iterat,ia 6:

    Curăt,at,i codul, aranjat,i textul, aliniat,i instruct,iunile s, i blocurile, înfrumuset,at,i ies, irea în consolă s, i mai facet,i o ultimăverificare.

    Felicitări!

    Mai jos, găsit,i o altă solut,ie posibilă. tot cu o abordare iterativă. De la simplu la complex.

    Listing 2.1: Iterat,ia 1. Hello World!

    #include int main(){

    printf("Hello World");return 0;

    }

    Listing 2.2: Iterat,ia 2 Variabile s, i afis, are

    #include int main(){

    int i=32;printf("i este %d", i);return 0;

    }

    Listing 2.3: Iterat,ia 3. Calculul restului pentru o valoare.

    #include int main(){

    int i=32;printf("i este %d\n", i);printf("Restul este %d", i % 3);return 0;

    }

    Listing 2.4: Iterat,ia 4. Calculul restului pentru toate valorile

    #include int main(){

    int i=32;for(i = 0; i < 100; i = i + 1){

    printf("i este %d\n", i);printf("Restul este %d\n", i % 3);

    }return 0;

    }

    Listing 2.5: Iterat,ia 5. Afis, area condit,ionată

    #include int main(){

    (continues on next page)

    6 Chapter 2. L2. Instruct, iuni de control al execut, iei programului

  • Programarea Calculatoarelor. Laborator, Versiune 0.3

    (continuare din pagina precedentă)

    int i=32;for(i = 0; i < 100; i = i + 1){

    if (i % 3 == 0)printf("i este %d\n", i);

    // printf("Restul este %d\n", i % 3);}return 0;

    }

    Listing 2.6: Iterat,ia 6. Curăt,are cod s, i afis, are mai elegantă.

    #include int main(){

    int i;printf("Numerele intre 0 si 100, divizibile cu 3, sunt:\n");for(i = 0; i < 100; i = i + 1)

    if (i % 3 == 0)printf("%d ", i);

    return 0;}

    2.4 Probleme propuse

    Acum e rândul vostru să abordat,i problemele iterativ. Putet,i să facet,i iterat,ii mai mari, dar atent,ie, dacă vă împotmolit,isau merge mai greu, revenit,i la iterat,ii mici!

    2.4.1 Minimul unei funct, ii pe un interval dat

    Luat,i funct,ia matematică 𝑓(𝑥) = 𝑥4 − 5𝑥2 + 3𝑥 + 20 s, i găsit,i punctul 𝑥0 pentru care funct,ia e minimă. Se dă uninterval de căutare [-4, 4] s, i un pas de căutare, eps=0.001.

    Sugestii:

    Cu instruct,iunea double x; vă declarat,i o variabilă ce poate stoca numere în virgulă mobilă.

    NU rezolvat,i problema matematic (algebric) din prima. Parcurget,i intervalul dat, cu pasul cerut. T, inet,i minte cea maimică valoare, într-o variabilă.

    Evaluat,i funct,ia la fiecare pas. Dacă valoarea curentă e mai mică decât valoarea stocată anterior, ret,inet,i noua valoare.

    Afis, at,i atât punctul de minim cât s, i valoarea funct,iei în punctul respectiv.

    Pentru verificare rezolvat,i analitic sau putet,i introduce expresia în zona de căutare a motorului Google. Vă va plotafrumos graficul. Verificat,i dacă răspunsul dvs este în zona minimului.

    2.4. Probleme propuse 7

  • Programarea Calculatoarelor. Laborator, Versiune 0.3

    2.5 Evaluarea laboratorului (muncă individuală)

    Se va verifica că s, tit,i să folosit,i conceptele de limbaj prezentate până în acest moment.

    2.5.1 Primele numere divizibile cu un număr dat

    Scriet,i primele n numere mai mari sau egale cu 0, divizibile cu un număr a. Valorile n s, i a se scriu în variabile.

    ATENT, IE!! Se cere primele n numere, s, i NU numerele mai mici decât n, ca la problema rezolvată.

    Putet,i începe de la problema anterioară. Vă sugerez să folosit,i instruct,iuni while. Cu atent,ie să nu intrat,i în cicluinfinit.

    Încercat,i să folosit,i s, i instruct,iunea break pentru a ies, i din bucla while.

    8 Chapter 2. L2. Instruct, iuni de control al execut, iei programului

  • L3. Operatori s, i Expresii

    3.1 Recapitulare

    În acest moment:

    • Putem lucra cu variabile de tip întreg s, i virgulă mobilă, putem face operat,ii matematice, putem afis, a rezultatele,putem controla execut,ia programului, itera s, i lua decizii pe baza valorii expresiilor.

    • Am văzut cum arată diverse tipuri de date, cum să determinăm câtă memorie ocupă un tip de date in memorie.

    • Am văzut pe scurt, cum se defines, te o funct,ie s, i s, tim cum să apelăm funct,ii din diversele biblioteci.

    3.1.1 Expresii

    Egalitatea e testată cu ==. Avem clasicul strict mai mic < s, i strict mai mare > pe care le putem combina cu egalitatea:mai mic sau egal =.

    Avem operat,ii logice s, i &&, sau ||, negare ! s, i prescurtarea pentru diferit, !=.

    Dacă unele concepte enumerate nu vă sunt clare, reluat,i cursurile s, i laboratoarele anterioare.

    Pe lângă cunos, tint,ele acumulate la laboratorul anterior, am văzut cum se poate lucra cu intrarea s, i ies, irea la tastatură.

    3.1.2 I/O

    printf("%d ", i) afis, ează variabila de tip int pe ecran. Construct,ia %d specifică cum anume se va interpretapattern-ul de bit,i a lui i. (Specificatorul de format). Avem specificatori pentru tipul float, char, s, i s, iruri decaractere.

    Funct,ia scanf: scanf("%d", &i); preia un s, ir de caractere din buffer-ul de tastatură s, i îl interpretează ca unzecimal întreg (datorită lui %d). ATENT, IE la caracterul & în fat, ă la variabilă!

    Căutat,i pentru printf s, i scanf documentat,ia. Familiarizat,i-vă cu afis, area pe un număr fix de caractere, afis, areaunui număr limitat de zecimale, spat,ii, alinierea la dreapta sau la stânga, etc.

    9

  • Programarea Calculatoarelor. Laborator, Versiune 0.3

    3.2 Not, iuni noi introduse

    3.2.1 Operatorii relat, ionali:

    3.2.2 Incrementarea

    Operat,ia i = i + 1 o putem prescurta cu operatorul de incrementare, ca i++ sau ++i. Căutat,i diferent,a întrevalorile acestor operat,ii, după execut,ia lor. Primul se numes, te postfix increment al doilea prefix increment.

    Similar se poate folosi s, i i-- respectiv --i. Folosirea lor în expresii mai complexe nu este recomandată deoareceintroduce o dificultate la citire.

    Altă prescurtare este i += 1. Operatorul de egalitate se poate combina în acest fel s, i cu alt,i operatori matematici s, ipe bit,i.

    3.2.3 Operatori pe bit, i

    Între două variabile se pot executa operat,ii pe bit,i. Ele sunt:

    s, i & pe bit,i, sau |, negare ~, sau-exclusiv ^, s, i două operat,ii mai speciale, deplasarea pe bit,i:

    > deplasare la dreapta: Bit,ii din dreapta se pierd, la stânga se inseră o valoare dependentă de tip s, i de compilator. Deobicei, operat,iile cu bit,i le executat,i pe tipuri fără semn (cu modificatorul unsigned). Pe tipuri fără semn, se va insera0. Pe tipurile cu semn, uneori, se inseră bitul de semn.

    3.2.4 Asocierea

    Există reguli de asociere. Deocamdată s, tim că înmult,irea este mai prioritară decât adunarea. Pentru restul, folosimdeocamdată parantezele.

    3.3 Probleme propuse

    3.3.1 Verificat, i deplasarea la dreapta sau la stânga

    Matematic, deplasările pe bit,i sunt echivalente înmult,irii sau împărt,irii cu 2.

    Verificat,i acest lucru! Luat,i un număr oarecare, mai mare. (gen 3423433). Facet,i operat,ii de deplasare cu diversevalori (mai mici decât 10). Verificat,i s, i înmult,irea respectiv împărt,irea cu 2.

    Exemplu:

    3423433 > 5 este 106982

    Luat,i un ciclu for care să împartă sau să înmult,ească numărul cu 2, de atâtea ori de cât este precizat în operandul dindreapta.

    Atent,ie, folosit,i o variabilă pentru numărul init,ial, pentru a putea controla toate operat,iile dintr-un singur punct!

    Adică, luat,i variabila n pentru numărul init,ial s, i a pentru numărul de deplasări. Tot restul codului să fie scris în funct,iede n s, i a. Atent,ie, n trebuie să fie de tip unsigned int.

    10 Chapter 3. L3. Operatori s, i Expresii

  • Programarea Calculatoarelor. Laborator, Versiune 0.3

    3.3.2 Afis, at, i valoarea binară a unui întreg fără semn I

    Declarat,i o variabilă întreagă fără semn unsigned int s, i afis, at,i-i pattern-ul de bit,i. Afis, at,i numărul în zecimaldupă care afis, at,i pattern-ul de bit,i.

    Observat, ii:

    Operatorul sizeof() este folosit pentru a afla numărul de octet,i ocupat de variabilă.

    Folosit,i operatorii de deplasare s, i AND pe bit,i pentru a afla valoarea unui bit.

    Complicare:

    1) Afis, at,i s, i valoarea hexazecimală a numărului.

    2) Punet,i codul într-o funct,ie.

    3) Scriet,i o funct,ie (sau funct,ii) care să afis, eze CORECT pattern-ul de bit,i la valori de tip long double sau SIGNEDint

    3.4 Evaluarea laboratorului (muncă individuală)

    Se va verifica că s, tit,i să folosit,i conceptele de limbaj prezentate până în acest moment.

    3.4.1 Scrieri sofisticate

    Testat,i afis, area formatată. Vet,i afis, a nis, te numere în diverse formaturi

    Citit,i un număr n, întreg. Vet,i citi un alt număr a, în virgulă mobilă, de exemplu 342.34435 s, i vet,i afis, a pe rândnumărul a la puterea 1, apoi 2, s, i tot as, a până la n. Vet,i calcula s, i logaritm (în baza e) a rezultatului.

    La fiecare pas, afis, at,i rezultatul (pe un rând, fiecare rând va cont,ine câteva câmpuri):

    • Puterea

    • Rezultatul ca număr în virgulă mobilă

    • Rezultatul doar cu 3 zecimale

    • Rezultatul în format s, tiint,ific/exponent,ial (cu E)

    • Logaritmul, cu 2 zecimale.

    Fiecare câmp va avea un număr mai mare de caractere decât necesare. Numerele vor fi aliniate la dreapta. Întrecâmpuri se va scrie virgulă.

    Separat,i locul unde se fac calculele de locul unde se afis, ează (eg. nu efectuat,i înmult,iri în apelul la printf).

    3.4. Evaluarea laboratorului (muncă individuală) 11

  • Programarea Calculatoarelor. Laborator, Versiune 0.3

    12 Chapter 3. L3. Operatori s, i Expresii

  • L4.Tabele I

    4.1 Recapitulare

    În cursul anterior v-at,i familiarizat cu un tip de date structurate, tabelele de valori.

    Se declară tipul, urmat de numele variabilei urmat de numărul de elemente dorit:

    int tab[100];

    Tabelul se poate init,ializa la declarare, folosind acoladele: int tab[4] = {5, 4, 3, 2};

    Accesul se face tot cu operatorul paranteză dreaptă: tab[2] = 9. Atent,ie, în C, indexarea este zero based. Primulelement are indexul zero!

    Atent,ie s, i la alocarea de memorie multă, pe stivă. Limitat,i dimensiunile tablourilor locale. Dacă avet,i nevoie dememorie mai multă, rezervat,i pe heap, folosind malloc s, i pointeri.

    Un tablou se poate declara la compilare sau se poate aloca dinamic, folosind pointerii. Dacă vrem să rezervăm o zonăde memorie de 5000 valori de tip float trebuie să:

    • Declarăm o variabilă care să poată gestiona zona de memorie (un pointer de tip float*)

    • Cerem de la sistemul de operare numărul de octet, i dorit

    • Folosim memoria (putem scrie operat,ii de indexare ca s, i la tabele)

    • Dealocăm.

    Listing 4.1: Rezervarea memoriei pentru tabel, pe heap

    int *pi;pi = (int*) malloc(sizeof(int) * 1000000);if (pi == NULL){

    // Tratez eroarea legata de lipsa memoriei.}// Folosesc zona de memorie alocată, folosindu-ma de variabila pi.pi[10] = 32;printf("%d\n", pi[16]);

    free(pi); // Dealoc memoria cand am terminat de lucrat.

    13

  • Programarea Calculatoarelor. Laborator, Versiune 0.3

    4.2 Not, iuni noi introduse

    4.2.1 Constante s, i identificatori

    Numele variabilelor s, i a identificatorilor în C, pot fi compuse din litere mari, litere mici, cifre s, i caracterul underscore_. Obligatoriu identificatorul trebuie să înceapă cu o literă sau cu underscore. Dacă nu v-at,i dat seama până acum,limbajul C-ul este case sensitive. Variabila suma este diferită de variabila Suma. La fel s, i pentru instruct,iuni.

    Constantele numerice se specifică implicit în baza 10, tip intDacă adăugăm un l sau L la sfârs, it, obt,inem tipul longint. Litera u sau U va determina un tip fără semn.

    Constantele fără semn se pot specifica în hexazecimal punând prefixul 0x, în binar 0b iar pentru octal, prefixat,i cu un0 urmat de cifre între 0 s, i 7.

    Pentru constante în virgulă mobilă, avem notat,ia cu punct zecimal, 32.4 sau notat,ia exponent,ială: 0.324e2.

    Constantele de tip s, ir de caractere sunt păstrate între ghilimele ". Vom reveni asupra lor. Deocamdată le folosim laafis, area s, i citirea formatată.

    Constantele de tip caracter (UN SINGUR CARACTER) sunt păstrate între apostrof 'A'. Ele sunt interpretate ca întregifără semn. Se pot folosi fără probleme în operat,ii aritmetice.

    Caracterele speciale tab, newline, se specifică cu un backslash: \n pentru newline s, i \t pentru tab. În constante,pentru backslash trebuie puse două backslash-uri: \\. La fel, caracterul apostrof sau ghilimele, trebuie precedat debackslash: '\''. Avem apostrof (început de constantă caracter), backslash, apostrof, apoi apostroful de închidere aconstantei caracter. La fel s, i ghilimelele, dar DOAR în constantele de tip s, ir de caractere. Vice-versa, se poate s, i fărăbackslash: '"' respectiv: "un apostrof: '".

    4.3 Probleme propuse

    4.3.1 Numere pare

    Citit,i n numere întregi de la tastatură. Memorat,i-le.

    Afis, at,i pe ecran doar numerele pare din s, irul citit. Atent,ie, afis, area începe după ce s-au terminat de citit toate numerele.

    La primele iterat,ii ale problemei putet,i lua un tabel de aprox 100 elemente.

    La final, va trebui să avet,i s, i o variantă în care tabelul este alocat dinamic. Nu uitat,i să dealocat,i la final.

    4.3.2 Transformare carteziană - polară

    Citit,i două coordonate carteziene (x, y) s, i afis, at,i coordonate polare (unghi în grade s, i lungimea vectorului).

    Căutat,i s, i folosit,i funct,ia atan2 din biblioteca

    14 Chapter 4. L4.Tabele I

  • Programarea Calculatoarelor. Laborator, Versiune 0.3

    4.3.3 Afis, at, i valoarea binară a unui întreg fără semn II

    Reluat,i problema din Section 3.3.2 cu câteva modificări.

    Scopul exercit,iului este de a învăt,a să separat,i responsabilităt,ile codului. Există cod care generează s, i calculeazăreprezentarea binară s, i există cod responsabil de afis, are.

    Calculat,i rezultatul într-un tabel de 32 de elemente.

    Scriet,i funct,ii care să afis, eze tabelul:

    • cu toate cifrele binare continue

    • cu cifrele binare grupate câte 4

    Putet,i "uni" cele două funct,ii folosind doar un nou parametru?

    4.4 Evaluarea laboratorului (muncă individuală)

    Se va verifica că s, tit,i să folosit,i conceptele de limbaj prezentate până în acest moment.

    4.4.1 Evaluarea unui polinom

    Se cites, te un polinom de numere reale de la tastatură. Se cites, te s, i un punct x s, i se evaluează polinomul.

    Se cites, te n, numărul de coeficient,i. Apoi, fiecare coeficient pe rând. Ultima dată se cites, te valoarea x. Se va afis, afrumos polinomul s, i rezultatul.

    Observat,ie: Coeficient,ii se vor stoca într-un tabel. Pot fi cel mult 100 de coeficient,i. Dacă n are valoare mai mare, seva da un mesaj de eroare.

    4.4. Evaluarea laboratorului (muncă individuală) 15

  • Programarea Calculatoarelor. Laborator, Versiune 0.3

    16 Chapter 4. L4.Tabele I

  • L5. Tabele II

    5.1 Recapitulare

    În iterat,ia I am atins majoritatea elementelor din limbajul C. Ar trebui să fit,i familiari cu a scrie instruct,iuni, cu a afis, asau a citi date s, i cu a efectua operat,ii matematice mai complexe, cu variabile. Putet,i opera cu funct,ii simple.

    Din Iterat,ia II, deocamdată s, itt,i să creat,i structuri de date, manipula zone de memorie (tablouri, pointeri), aloca s, iruride caractere.

    5.2 Not, iuni noi introduse

    5.2.1 Citirea unui tablou de elemente

    Un pattern de programare des întâlnit este acela în care citim un număr (de ex n) apoi citim n valori.

    Deocamdată alocăm memorie static sau pe stivă, pentru tablou. Luăm o valoare maximă s, i validăm n să nu depăs, eascăaceastă valoare.

    Exemplu de citire a n valori:

    Listing 5.1: Citire de n valori într-un tabel

    1 #include 2 #define MAX_ELEM 1003 int main()4 {5 int n, i;6 int tab[MAX_ELEM];7 printf("Introduceti valoarea lui n ");8 scanf("%d", &n);9 if ((n = MAX_ELEM)){

    10 printf("Eroare, n trebuie sa fie intre 0 si 100.");11 printf(" Ati introdus %d.\nProgramul se termina", n);12 return -1;13 }14

    15 for(i = 0; i < n; i++){16 printf("tab[%3d]:", i);17 scanf("%d", &tab[i]);

    (continues on next page)

    17

  • Programarea Calculatoarelor. Laborator, Versiune 0.3

    (continuare din pagina precedentă)

    18 }19

    20

    21 // Optional, afisam ce am citit22 printf("Tabelul este:\n");23 for(i = 0; i < n; i++){24 printf("tab[%2d] = %5d\n", i, tab[i]);25 }26

    27 return 0;28 }

    Deosebit este la linia 2, am declarat o constantă simbolică. Deocamdată considerat,i că peste tot în cod unde apareconstruct,ia MAX_ELEM va fi înlocuită cu construct,ia 100. Evităm astfel folosirea repetată a numărului 100.

    La prima scriere, acest lucru pare mai laborios, tastăm mai mult. Dar atent,ie, dacă modificăm valoarea maximăstocată? S, i uităm să modificăm peste tot? Apar bug-uri! Evitat,i la maxim să vă repetat,i! Mai ales când vine vorba deconstante. Codul s, i constantele "magice" sunt o sursă mare de bug-uri.

    Atent,ie la citirea din tabel, am folosit sintagma &tab[i]!

    5.2.2 Tablouri în funct, ii.

    Funct,iile pot primi un tablou de elemente ca variabilă de intrare. Parametrul formal se scrie ca TIP NUME[]. Deobicei trebuie să trimitem s, i numărul de elemente:

    Listing 5.2: Exemplu de funct,ie ce acceptă un tabel.

    int CalculSuma(int tabel[], int nr_elemente){

    }

    // undeva in main

    rezultat = CalculSuma(tab, n);

    Sau, alternativ, cu pointeri:

    18 Chapter 5. L5. Tabele II

  • Programarea Calculatoarelor. Laborator, Versiune 0.3

    Listing 5.3: Exemplu de funct,ie ce acceptă un tabel.

    int CalculSuma(int *tabel, int nr_elemente){

    }

    // undeva in main

    rezultat = CalculSuma(tab, n);

    Folosirea lui tab/tabel în interiorul CalculSuma sau main este cvasiidentică între cele două exemple.

    5.2.3 Efecte secundare

    Din cauză că funct,ia primes, te direct zona de memorie a tabelului, aceasta POATE MODIFICA valorile! Mare atent,ie,să nu introducet,i efecte secundare, dacă nu există astfel de cerint,e.

    5.3 Probleme propuse

    5.3.1 Afis, at, i un tabel de numere

    Scriet,i funct, ii care acceptă (1) un tabel s, i (2) afis, ează cont,inutul, element cu element. Va trebui sa concepet,i douăfunct,ii, una pentru citire s, i alta pentru afis, are.

    Funct,iile ar trebui să accepte tabele alocate static sau dinamic. Demonstrat,i ambele posibilităt,i.

    Aflarea numărului de elemente s, i alocarea se fac în main().

    5.3.2 Calculul sumei unui s, ir de numere

    Folosindu-vă de exemplul dat anterior, scriet,i o funct, ie care să calculeze suma elementelor unui tabel. Afis, at,i.

    5.3.3 Efecte secundare

    Scriet,i o funct,ie care adaugă 10 la valoarea fiecărui element. Din main, apelat,i s, i funct,iile de citirea s, i afis, area. Afis, at,iînainte s, i după modificare!

    5.3.4 Evaluarea unui polinom

    Evaluat,i un polinom s, tiind coeficient,ii s, i un punct x.

    Citit,i un număr n s, i x. Citit,i n coeficient,i. Calculat,i s, i afis, at,i elegant.

    Ex:

    2x^2 + 5x + 1 = 1, pentru x = 0

    Coeficient,ii s, i punctul x sunt numere reale. Alocat,i doar memoria necesară pentru coeficient,i. Folosit,i alocareadinamică.

    5.3. Probleme propuse 19

  • Programarea Calculatoarelor. Laborator, Versiune 0.3

    Atent,ie! Facet,i funct,ii pentru fiecare etapă: Citire de polinom (s, i stocare într-o zonă prealocată), evaluare polinom(se vor da la funct,ie, zona de memorie unde sunt stocat,i coeficient,ii, numărul de coeficient,i s, i valoarea lui x). Facet,ifunct,ie s, i pentru afis, are.

    Ca s, i la alte probleme care se continuă din laboratoarele anterioare, vă putet,i folosi de codul de lalaboratoarele/problemele trecute!

    5.4 Evaluarea laboratorului (muncă individuală)

    Se va verifica că s, tit,i să folosit,i conceptele de limbaj prezentate până în acest moment.

    5.4.1 Produs cartezian

    Se citesc doi vectori de întregi de la tastatură. Se afis, ează produsul cartezian a celor doi vectori. Exemplu: Vectorii

    1 2 s, i 7 8 9 au produsul cartezian: (1 7) (1 8) (1 9) (2 7) (2 8) (2 9).

    Ambii vectori se citesc cu o funct,ie. Funct,ia va primi numărul de elemente s, i zona prealocată. Va fi o singură funct,iepentru ambele citiri! Aflarea numărului de elemente s, i alocarea, se poate face deocamdată cu cod dedicat pentrufiecare vector.

    Produsul se calculează de o altă funct,ie. Acea funct,ie va putea afis, a rezultatul direct pe ecran.

    Ordinea operat,iilor I/O:

    • Citire n1, n2, numărul de elemente din cei doi vectori

    • Citirea, pe rând, a elementelor celor doi vectori. Afis, at,i un mesaj când se trece la următorul vector

    • Afis, at,i produsul cartezian.

    Opt,ional, dacă modularizat,i s, i funct,ia de citire, putet,i citi pe rând vectorul 1 (n1, elementele), s, i 2 (n2 s, i elementele)

    Puncte bonus:

    Facet,i ca produsul cartezian să fie stocat într-un vector (va trebui să folosit,i s, i structuri, pentru a stoca, pentru fiecareelement, cele două valori ale produsului cartezian). Funct,ia de calcul va scrie rezultatul aici.

    Facet,i o funct,ie de afis, are care e capabilă să primească un pointer la o zonă cu elemente de produs cartezian s, i săafis, eze ce e acolo.

    20 Chapter 5. L5. Tabele II

  • L6. Structuri. S, iruri de caractere

    6.1 Recapitulare

    6.1.1 Structuri

    O structură se defines, te cu struct urmat opt,ional de numele structurii, apoi un bloc de declarat,ii.

    Pentru us, urint,a folosirii tipului structură, îl denumim:

    Listing 6.1: Rezumat al operat,iilor cu structuri

    typedef struct {int a, b;

    } Structura;

    //Declarare de variabila, tabel, pointeriStructura s;Structura tab_struct[10];Structura *tab_ptr_struct = (Structura*)malloc(sizeof(Structura) * 50000);

    tab_struct[2].b = 1;tab_ptr_struct->a = 44;

    Acum, în interiorul unei funct,ii, putem declara variabile de acest tip: Structura s. Pentru acces la membri scriems.a. Această expresie poate fi folosită peste tot unde putem pune o variabilă. Putem să stocăm ceva acolo, putem săîi luăm adresa (eg ca să o trimitem la scanf).

    La declararea structurii se alocă memorie pentru tot,i membrii.

    Putem declara tabele de structuri sau structuri care să cont,ină tabele.

    Putem avea pointeri spre structuri. S, i ei trebuie alocat,i. Pentru acces la elemente se foloses, te operatorul ->.

    21

  • Programarea Calculatoarelor. Laborator, Versiune 0.3

    6.1.2 S, iruri de caractere

    Sunt o zonă de memorie cu o convent,ie specială, ultimul caracter din s, ir are pattern-ul zero: '\0'. Funct,iile care"procesează" s, iruri de caractere se as, teaptă la această convent,ie. De aceea, ele nu necesită să trimitem la input s, i câtămemorie este alocată acolo.

    Putem stoca un s, ir de caractere într-un tabel sau o zonă alocată dinamic:

    char sir[100];

    char * str = (char*) malloc(sizeof(char) * 10000);

    Putem folosi sir sau str direct în operat,ii ce necesită tipul char * (eg funct,ii din )

    Listing 6.2: Exemplu de alocare statică (tabel) s, i citire de s, ir de caractere

    #define MAX_STR_LEN 100

    char sir[MAX_STR_LEN];fgets(sir, MAX_STR_LEN, stdin);

    Listing 6.3: Exemplu de alocare dinamică s, i citire.

    #define MAX_STR_LEN 100000

    char *sir = (char*)malloc(sizeof(char) * MAX_STR_LEN);fgets(sir, MAX_STR_LEN, stdin);

    Citit,i din materialul de curs câteva funct,ii utile din .

    Atent,ie, lungimea unui s, ir de caractere se calculează până când se întâlnes, te valoarea 0. (Null terminated string)

    Funct,iile de procesare a s, irurilor de caractere se găsesc în

    Observat,ie utiă în "parsarea" s, irurilor. Funct,ia sscanf poate fi folosită pentru a "extrage" valori numerice sau cuvintedintr-un s, ir de caractere deja aflat în memorie. Un comportament util al lui sscanf este că atunci când primes, temodificatorul %s va începe să acumuleze caractere până întâlnes, te un caracter alb. Comportament util când vrem să"despărt,im" în cuvinte un s, ir (cuvintele fiind separate de whitespaces). Mai încolo vet,i învăt,a s, i despre strtok.

    6.1.3 Citire din fis, ier

    Funct,ia fgets cites, te până întâles, te caracterul newline sau EOF. Acest lucru este util pentru a:

    • Citi o linie

    • Citi până când nu mai există nimic în fis, ier.

    După citirea unei linii este bine a o procesa s, i/sau muta ceea ce s-a citit într-o altă zonă de memorie. Zona de memorietrimisă la fgets se poate refolosi. Valoarea maximă care o trimitet,i la fgets include s, i octetul zero de la sfârs, it.

    Odată citită o linie, cu fgets, o putem "sparge" (parsa) în sigurant, ă folosind sscanf.

    Dacă s, tit,i că trebuie memorate n caractere alocat,i suficientă memorie pentru n+1 caractere! (s, i pentru terminareas, irului de caractere).

    Important: DIN ACEST MOMENT ESTE INTERZIS SĂ MAI FOLOSIT, I scanf SAU fscanf PENTRU ACITI S, IRURI DE CARACTERE!!

    Funct,ia sscanf se poate folosi însă, pentru că, avem control asupra lungimii a ceea ce se află în s, irul de intrare.

    22 Chapter 6. L6. Structuri. S, iruri de caractere

  • Programarea Calculatoarelor. Laborator, Versiune 0.3

    6.2 Probleme propuse

    6.2.1 Structuri simple

    Creat,i, citit,i s, i afis, at,i structuri pentru a t,ine minte date despre un student: Nume (un cuvânt) s, i nota.

    Numele îl păstrat,i într-un tabel de tip char, în interiorul structurii.

    Citirea o facet,i de la tastatură, folosind fgets!

    6.2.2 Numere complexe

    Definit,i o structură care poate memora numere complexe.

    Definit,i câteva funct,ii care pot citi numere complexe (s, i returnează o structură), funct,ii cre pot afis, a, care pot aduna,scădea, înmult,i numere complexe

    6.3 Evaluarea laboratorului (muncă individuală)

    Se va verifica că s, tit,i să folosit,i conceptele de limbaj prezentate până în acest moment.

    6.3.1 Operat, ii cu numere complexe

    Citit,i dintr-un fis, ier text, un s, ir de numere complexe s, i efectuat,i operat,ii cu ele. Numerele complexe se stochează înstructuri s, i în tabele (dinamice) de structuri. Facet,i funct,ii pentru diverse operat,ii.

    Într-un fis, ier avem un întreg n urmat pe următoarea linie de n perechi de float-uri. Fiecare pereche e un numărcomplex. Nu există separatori speciali, în afară de spatiu, între perechi sau elementele din pereche.

    Scriet,i o funct,ie care cites, te fis, ierul s, i returnează o structură care cont,ine

    • un tablou dinamic alocat (pointer) de tipul numărului complex:

    • numărul de elemente (perechi) citite din fis, ier, adică câte elemente sunt alocate în pointer.

    • Nu e necesar să returnat,i un pointer la structură.

    Să se facă o funct,ie care acceptă structura de mai sus s, i o afis, ează frumos.

    Să se calculeze suma numerelor complexe (folosind bineînt,eles o funct,ie care acceptă structura de mai sus)

    Să se calculeze s, i să se stocheze într-o altă structură, conjugata numerelor complexe citite. Să se afis, eze.

    Se vor folosi funct,ii, variabile locale, cod elegant, memorie alocată dinamic, etc.

    Notă Problema este relativ complexă, atingând multe concepte. Vă recomand să o abordat,i iterativ. Nu vă oprit,i pânăcând toate cerint,ele din laborator sunt îndeplinite. Putet,i, ca primă iterat,ie, să scriet,i tot codul în main(), fără alocaredinamică, doar tabele, structuri si doar o singură funct,ionalitate (ex citire s, i afis, are). Apoi, introducet,i, în fiecarenouă iterat,ie: Alocarea dinamică, funct,iile (pe rând), funct,ionalităt,i noi, etc. până îndeplinit,i cerint,ele. Atent,ie, cândcredet,i că totul e gata, mai facet,i o iterat,ie pentru curăt,at codul, verificat cazuri particulare sau cazuri mai complexe,verificarea respectării fiecărei cerint,e, formatare cod, etc.

    Succes!

    6.2. Probleme propuse 23

  • Programarea Calculatoarelor. Laborator, Versiune 0.3

    24 Chapter 6. L6. Structuri. S, iruri de caractere

  • L7. Operat, ii cu date compuse I

    7.1 Recapitulare

    Revizuit,i not,iunile introduse până acumm. Structuri, tabele, s, iruri de caractere, alocarea dinamică a lor folosindpointerii, citirea din fis, iere, instruct,iuni de control, expresii, variabile.

    7.1.1 S, iruri de caractere

    Putem stoca un s, ir de caractere, dinamic, într-un pointer: char * str = (char*) malloc(sizeof(char)* 10000).

    Dacă însă avem nevoie să stocăm mai multe s, iruri (eg lista de cuvinte) putem folosi tabel de pointeri (Tabele care sămemoreze adrese). Putem face asta static sau dinamic:

    Listing 7.1: Liste de s, iruri de caractere

    // alocare staticachar* lista_sir[30];// alocare dinamicachar** lista_sir_ptr = (char**)malloc(sizeof(char*) * 30);

    // Folosirea este identică. Trebuie să alocăm fiecare element, înainte de folosirelista_sir[3] = (char*)malloc(sizeof(char) * 1000);lista_sir_ptr[3] = (char*)malloc(sizeof(char) * 1000);strcpy(lista_sir_ptr[3], "Popescu are mere!");fgets(lista_sir[3], 1000, stdin);

    7.2 Probleme propuse

    7.2.1 Litere mari - mici

    Transformat,i din litere mici în litere mari un cuvânt. Atent,ie, literele mari s, i cifirele nu trebuie modificate

    25

  • Programarea Calculatoarelor. Laborator, Versiune 0.3

    7.2.2 Număr palindorm

    Folosind sprintf verificat,i dacă un număr este palindrom.

    7.2.3 Citire de s, iruri de caractere

    Deschidet,i un fis, ier în modul text s, i determinat,i câte linii are.

    7.2.4 Citire mod binar

    Deschidet,i un fis, ier în modul binar s, i determinat,i frecvent,a de aparit,ie a fiecărui octet.

    Observat,ii:

    S, tit,i din start câte valori posibile sunt pentru octet,i (256).

    Funct,ia fread returnează numărul de elemente citit. Util pentru "capătul" fis, ierului, când buffer-ul va fi umplut doarpart,ial.

    Putet,i procesa datele "on the fly" fără să le memorat,i.

    7.2.5 Frecvent, ă litere

    Deschidet,i un fis, ier în mod text s, i numărat,i frecvent,a de aparit,ie a fiecărei litere. Facet,i asta fără să t,inet,i seama delitere mici - litere mari.

    Afis, at,i ordonat alfabetic, caracterul s, i frecvent,a de aparit,ie.

    7.3 Evaluarea laboratorului (muncă individuală)

    Se va verifica că s, tit,i să folosit,i conceptele de limbaj prezentate până în acest moment.

    7.3.1 Propozit, ii s, i cuvinte

    Citit, i un text din fis, ier s, i despărt, it, i-l în cuvinte.

    Se cites, te un text din fis, ier. Numărul de linii nu este precizat. (dar pot fi maxim 10000). Se stochează textul.

    Se va "sparge" fiecare linie de text în cuvinte. Un cuvânt este un s, ir de caractere "non albe" despărt,ite de caracterealbe: spat,iu, newline sau line-feed (Restul separatorilor îi ignorat,i, adică îi considerat,i ca făcând parte dincuvinte.)

    Se va afis, a numărul total de linii s, i cuvinte.

    Se va afis, a, pe câte o linie pe ecran:

    • Numărul liniei

    • Numărul de cuvinte

    • Linia de text

    Se vor folosi funct,ii, variabile locale, cod elegant, memorie alocată dinamic, etc.

    26 Chapter 7. L7. Operat, ii cu date compuse I

  • L8. Operat, ii cu date compuse II

    Vom sedimenta instrumentele dobândite până acum, rezolvând nis, te exemple mai complexe, care acoperă o arie mailargă de mecanisme din limbajul C.

    Încercat,i să facet,i codul cât mai "frumos" s, i "elegant", după ce reusit,i să rezolvat,i cerint,ele.

    8.1 Probleme propuse

    8.1.1 Structuri cu pointeri

    Creat,i, citit,i s, i afis, at,i date despre student,i Nume, Prenume (câte un cuvânt) s, i nota. Citirea se face din fis, ier.

    Pe prima linie găsim numărul de student,i. Apoi, în fis, ier găsim:

    • mai multe perechi de linii care definesc studentul:

    • prima linie din pereche cont,ine numele s, i prenumele

    • a doua linie din pereche cont,ine nota, ca întreg.

    Pentru nume s, i prenume, folosit,i un pointer la char. În fis, ier avet,i numele s, i prenumele scris pe un rând. Aici trebuiepăstrat separat. Presupunet,i că nu sunt mai mult de două cuvinte pe linie. Atent,ie, după ce citit,i, stocat,i strict câtămemorie e nevoie!

    Păstrat,i datele într-un tabel de structuri.

    Trebuie rezervată memoria dinamic, cu pointeri la structuri.

    După ce at,i închis fis, ierul s, i at,i încărcat datele, facet,i o statistică:

    • Frecvent,a prenumelor (fiecare prenume, de câte ori apare)

    • Frecvent,a pe note, afis, ată descrescător (eg. cât,i de 10, cât,i de 9, etc).

    • Pentru fiecare notă, student,ii care au acea notă.

    27

  • Programarea Calculatoarelor. Laborator, Versiune 0.3

    8.2 Evaluarea laboratorului (muncă individuală)

    Se va verifica că s, tit,i să folosit,i conceptele de limbaj prezentate până în acest moment.

    8.2.1 Operat, ii cu numere

    Se dă un fis, ier cu mai multe linii. Pe prima linie din fisier este un număr N. Fiecare din cele N linii de după, cont,inenumere întregi. Numărul de numere de pe fiecare linie este dat ca primul întreg de pe linia respectivă si variaza de lao linie la alta.

    După ce se termină cele N linii, urmează un întreg M, pe o linie separată. După, vin M perechi, fiecare pereche pelinia ei. Perechile definesc operatii si au forma:

    operatie nr_linie numar_virgula_mobila

    Exemplu:

    * 3 34.2+ 4 99.5+ 1 -1e-3

    Operatiile sunt: adunare (+), inmultire (*), Operatiile se aplică pe fiecare număr din lista de linii definită de primulnumăr citit nr_linie. Operat,iile sunt clare, fiecare element din rând se va aduna/înmulti cu valoarea citită dupasemnul operatiei. (ex pentru * 3 34 se va înmult,i fiecare element din linia a 4-a cu 34).

    Să se citească fis, ierul s, i să se memoreze liniile de numere. Atent,ie fiecare linie poate avea număr diferit de elemente.Recomand un tabel de tabele, totul t,inut într-o structură:

    • pointer dublu la double1. Se stochează rândurile de date

    • pointer la s, ir de întregi, se stochează câte elemente sunt pe fiecare linie

    • numărul de linii

    Să se aplice operat,iile pe linii. Atent,ie, fiecare operat,ie este independentă s, i nu afectează rezultatul altor operat,ii

    Să se afis, eze rezultatul operat,iilor.

    Operat,iile se pot procesa "on the fly" adică pe măsură ce se citesc din fis, ier.

    Exemplu. In fisierul de intrare avem un sir de trei de 1 si o operatie de adunare:

    13 1 1 11+ 0 1

    Exemplu de afis, are:

    Randul 0, operatie + 1 rezultat: 2 2 2

    1 Pun intended

    28 Chapter 8. L8. Operat, ii cu date compuse II

  • L9. Structuri de date complexe I

    9.1 Recapitulare

    Pentru a aloca o matrice de elemente 2D putem apela la următoarea bucată de cod:

    Listing 9.1: Alocare s, i dealocare matrice 2D de tip double

    double** alocare_2d_double(int m, int n){double **matrice = (double**)malloc(sizeof(double*) * m);for(int i = 0; i < m; i++)

    matrice[i] = (double*)malloc(sizeof(double) * n);return matrice;

    }

    void dealocare_2d_double(double ** ptr, int m){for(int i = 0; i < m; i++)

    free(ptr[i]);free(ptr);

    }

    Putem grupa datele necesare unei matrici, într-o structură:

    typedef struct{double ** data;int m, n;

    } Matrice_double;

    Deasemenea, putem avea matrici continue a căror alocare este mai simplă: double *tab. Se vor aloca m * nelemente: tab = (double*) malloc(sizeof(double) * m * n);

    La accesare va trebui să calculăm adresa elementului dorit, la fiecare accesare. Exemplu: tab[i * n + j] = 0.

    29

  • Programarea Calculatoarelor. Laborator, Versiune 0.3

    9.2 Probleme propuse

    9.2.1 Alocare matrici în cele două formate

    Într-un fis, ier găsit,i o matrice specificată astfel: Pe prima linie, doi întregi, numărul de rânduri s, i numărul de coloane.Pe următoarele linii de text, rândurile matricii.

    Implementat,i cele două moduri de a stoca matricile. Scriet,i funct,ii care să aloce, citească, afis, eze în cele două formate.

    Atent,ie, grupat,i modul de stocare a matricii (eg în structură) cu modul de alocare (funct,ia de la curs, returnează unpointer). Facet,i astfel încât funct,ia de alocare să returneze o structură!

    S, i pentru formatul continuu, putet,i crea o structură de date!

    9.2.2 Citire date binare

    Deschidet,i în mod read-only s, i binar, fis, iere de pe disc. Citit,i primii 10-20 octet,i s, i afis, at,i primele caractere.

    Vânat,i s, i identificat,i "constantele magice". Cum începe un fis, ier .exe? Dar .jpg?

    9.2.3 Parsare de fis, iere

    Citit,i dintr-un fis, ier o matrice. Matricea NU are specificat numărul de linii s, i coloane. Putet,i presupune un maxim de100 linii s, i 100 coloane.

    Folosit,i fgets, sscanf s, i valorile returnate de ele, pentru a vă da seama câte linii sunt s, i câte valori sunt pe fiecarelinie.

    9.2.4 Bubble sort

    Citit,i n numere întregi dintr-un fis, ier s, i sortat,i-le folosind bubble sort (Căutat,i)

    9.2.5 Sortare cuvinte

    Citit,i cuvinte din fis, ier. Fiecare cuvânt este scris pe câte o linie.

    Păstrat,i cuvintele într-un tablou de pointeri la char.

    Sortat,i s, i afis, at,i cuvintele alfabetic.

    9.3 Evaluarea laboratorului (muncă individuală)

    Se va verifica că s, tit,i să folosit,i conceptele de limbaj prezentate până în acest moment.

    30 Chapter 9. L9. Structuri de date complexe I

  • Programarea Calculatoarelor. Laborator, Versiune 0.3

    9.3.1 Instrumente de lucru cu matrici

    Implementat,i câteva instrumente: alocare, citire, afis, are, adunare, transpusa, dealocare pentru matrici 2D de tip ints, i double, stocate discontinuu (liste de vectori), s, i a căror informat,ie este stocată în structuri.

    Trebuie să avet,i funct,ii pentru fiecare operat,ie s, i tip de dată stocată. Funct,iile s, i structura se păstrează în alt modul.Din modulul principal demonstrat,i folosirea instrumentelor.

    Operat,iile de transformare (eg adunarea) vor returna alte matrici, cele init,iale rămânând intacte.

    Atent,ie la denumirile funct,iilor. Vă recomand sa specificat,i s, i tipul elementelor în nume. Exemplu,aduna_double() ca nume de funct,ie care adună două matrici cu elemente de tip double.

    Facet,i-vă structura fis, ierului de intrare astfel încât să vă facă citirea us, oară (ex precizat,i de la început numărul de liniis, i coloane)

    9.3. Evaluarea laboratorului (muncă individuală) 31

  • Programarea Calculatoarelor. Laborator, Versiune 0.3

    32 Chapter 9. L9. Structuri de date complexe I

  • L10. Structuri complexe II

    10.1 Recapitulare

    Recitit,i din curs, declararea de matrici multidimensionale, alocarea matricilor, stocarea informat,iilor despre matrici înstructuri. Stocarea matricilor în format continuu.

    10.2 Probleme propuse

    10.2.1 Array-uri 2D

    Citit,i dintr-un fis, ier o matrice. Matricea NU are specificat numărul de linii s, i coloane. Putet,i însă presupune un maximde 100 linii s, i 10000 de caractere pe rând. Sunt maxim 100 de coloane.

    S, tit,i că fgets va returna NULL când nu se mai pot citi linii.

    Folosit,i fscanf, sscanf s, i valorile returnate de ele, pentru a vă da seama câte linii s, i câte valori sunt pe fiecarelinie.

    Funct,ia sscanf acceptă ca modificator %n care returnează în variabila corespunzătoare, numărul de caractere citit.Funct,ia returnează ca valoare, câte variabile din input a putut consuma. Împreună cu operat,iile pe pointeri, vet,i puteaparsa numărul de elemente din fiecare linie.

    Opt,ional, putet,i studia s, i strtok.

    După terminarea citirii, să rămână alocată strict câtă memorie e necesară stocării matricii.

    Stocat,i matricea într-o structură care să cont,ină dimensiunea matricii s, i pointer-ul la tabloul de pointeri.

    Implementat,i operat,ii pe o astfel de structură: Alocarea, Afis, area, Duplicarea, Transpusa unei matrici.

    33

  • Programarea Calculatoarelor. Laborator, Versiune 0.3

    10.3 Evaluarea laboratorului (muncă individuală)

    Se va verifica că s, tit,i să folosit,i conceptele de limbaj prezentate până în acest moment.

    10.3.1 Array-uri 2D. Operatii

    Într-un fis, ier avet,i două matrici de numere în virgulă mobilă. Fieare matrice e declarată astfel: Pe prima linie sunt2 întregi reprezentând numărul de rânduri s, i coloane a matricii. Pe următoarele linii sunt rândurile matricii. A douamatrice începe imediat după prima matrice.

    Scriet,i funct,ii care: alocă, citesc o matrice, afis, ează o matrice, adună două matrici stocând rezultatul în a treia.Implementat,i funct,iile pentru (1) metoda de stocare a matricilor ca liste discontinue (2) metoda continuă de stocare amatricilor.

    Nu este voie să avet,i variabile globale. Cele două metode trebuie să coexiste în acelas, i program. Opt,ional putet,i săfacet,i o conversie între cele două tipuri, sărind astfel funct,ia de citire.

    Vă putet,i folosi de cod deja implementat de voi în activităt,ile anterioare (recomandat, laboratorul 9).

    34 Chapter 10. L10. Structuri complexe II

  • L11. Recursivitate

    11.1 Recapitulare

    11.1.1 Apel recursiv

    O funct,ie se poate apela pe ea însăs, i. Variabilele locale se alocă la fiecare apel. Pentru a nu intra în ciclu infinit, esteimportant ca primul lucru la intrarea în funct,ie, să se verifice condit,ia de oprire.

    11.2 Probleme propuse

    11.2.1 Progresie aritmetică

    Scriet,i cod care să dea valorile funt,iei 𝑓(𝑥) = 𝑓(𝑥−1)+5, 𝑓(0) = 0. Rezolvat,i analitic problema 𝑓(𝑥) = 5* (𝑥−1)s, i verificat,i că, pentru mai multe valori ale lui x, calculul algoritmic se face corect.

    Rezolvat,i problema de laborator, recursiv!

    11.2.2 Seria Fibonacci

    Găsit,i valorile lui 𝑓(𝑥𝑛) = 𝑓(𝑥𝑛−1) + 𝑓(𝑥𝑛−2) unde 𝑓(0) = 0 s, i 𝑓(1) = 1.

    Rezolvat,i problema:

    • Folosind recursivitatea

    • Calculând totul de la 0 la n

    • Folosind formula analitică de mai jos.

    Analitic, termenul din progresia aritmetică se poate calcula:

    𝑓(𝑥𝑛) = ⌈𝜑𝑛−(1−𝜑)𝑛√

    5⌉

    unde

    𝜑 = 1+√5

    2 este rat,ia de aur.

    Pentru ultima variantă, folosit,i biblioteca matematică pentru rotunjirea rezultatului final. Verificat,i comparândrezultatele ultimelor două metode de rezolvare.

    35

  • Programarea Calculatoarelor. Laborator, Versiune 0.3

    11.2.3 Produs cartezian II

    Citit,i (din fis, ier) câteva rânduri de cifre întregi. Se dă s, i numărul de linii s, i numărul de elemente de pe fiecare linie.

    Calculat,i produsul cartezian între tot,i vectorii. Implementat,i recursiv. Se va afis, a fiecare tuplă generată.

    Exemplu:

    32 1 22 3 41 5

    Adică, la intrare sunt 3 vectori, primii doi vectori au câte 2 elemente iar ultimul un element. Ar trebui afis, at:

    (1 3 5)(1 4 5)(2 3 5)(2 4 5)

    Formatat,i elegant textul astfel încât valorile să fie aliniate.

    11.3 Evaluarea laboratorului (muncă individuală)

    Se va verifica că s, tit,i să folosit,i conceptele de limbaj prezentate până în acest moment.

    11.3.1 Căutări rapide în s, iruri sortate

    Fie s, irul de 16 de numere sortate:

    1, 3, 6, 7, 8, 9, 11, 13, 17, 19, 21, 22, 23, 24, 29, 31

    Citit,i un număr de la tastatură s, i căutat,i dacă numărul există sau nu în acest s, ir.

    Scriet,i o funct,ie care acceptă as, a:

    • s, irul

    • două numere reprezentând indecsi ai: capătului din stânga (inclusiv) s, i ai capătului din dreapta (exclusiv)

    • numărul căutat.

    Ca să căutat,i, luat,i o sect,iune din s, ir s, i găsit,i care ar fi pozit,ia de mijloc. Vedet,i dacă valoarea căutată este egală cuceea ce se află în mijloc. Dacă da, at,i terminat. Dacă valoarea din s, ir e mai mare sau mai mică decât cea căutată,apelat,i recursiv la stânga sau la dreapta valorii centrale. Dacă intervalul curent este vid (indexul capătului din stângaeste mai mare sau egal cu indexul capătului din dreapta), atunci numărul nu se află în s, ir. Dacă numărul căutat este pecapetele intervalului se declară numărul găsit.

    Exemplu: Caut valoarea 7.

    Indecs, ii capătului sunt 0 s, i 16. Primul apel al funct,iei compară valoarea de mijloc, sir[8] == 17 cu 7. Este mai mare.Apelul se va duce înspre stânga. Adică, se va apela recursiv cu indecs, ii capătului 0 s, i 8.

    Iarăs, i se va lua elementul de mijloc, sir[4] == 8. Este mai mare decât 7. Se va merge tot în stânga: Apel recursiv pe0, 4. Acum se va compara elementul sir[2] == 6. Este mai mic. Se va merge în dreapta. Apel recursiv de 2, 4. Se iamijlocul, sir[3] = 7. Este egal cu numărul căutat.

    Implementat,i s, i versiunea nerecursivă, clasică. Comparat,i metodele, căutând pentru toate numerele de la 0 la 32.

    36 Chapter 11. L11. Recursivitate

  • L12. Pointeri la funct, ii

    12.1 Recapitulare

    12.1.1 Variabile statice

    Cuvântul cheie static face ca variabila să fie alocată în zona de memorie statică. Această variabilă îs, i va păstravaloarea între două apeluri de funct,ie.

    Mai jos se arată o astfel de funct,ie, care păstrează intern, date între apelări.

    În biblioteca avem funct,ia strtok. Aceasta permite despărt,irea, "spargerea" (tokenizarea) unui s, irde caractere la nivelul unor separatori. De exemplu, un text spart în cuvinte, despărt,ite de spat,ii.

    char * strtok ( char * str, const char * delimiters );

    La primul apel, se init,ializează s, i se returnează adresa primului token. Următoarele apeluri as, teaptă un pointer NULLpentru str s, i va returna pe rând următoarele tokenuri. După ce s-au returnat toate tokenurile, se returnează NULL.

    Funct,ia stochează intern, între apeluri, într-un câmp static, ultima locat,ie returnată. As, a va s, ti să continue căutarea dinultimul loc returnat.

    Listing 12.1: Exemplu complet de tokenizare

    #include #include

    #define MAX_CHARS 1000

    int main(){

    char *sir = (char*)malloc(sizeof(char) * MAX_CHARS);const char* punctuatie = " ,.";char *subsir;

    fgets(sir, 100, stdin);

    subsir = strtok(sir, punctuatie);while (subsir != NULL) {printf("Cuvant: %s\n", subsir);

    subsir=strtok(NULL, punctuatie);}

    }

    37

  • Programarea Calculatoarelor. Laborator, Versiune 0.3

    12.1.2 Pointeri la funct, ii

    Codul unei funct,ii trăies, te în memorie la o anumită adresă. Această adresă poate fi manipulată cu variabile.

    Câteva exemple când folosim astfel de construct,ii:

    1) Interact,iunea cu sistemul de operare, când vrem să fim anunt,at,i de anumite evenimente

    2) Apelarea de algoritmi interni bibliotecii standard.

    Aici dăm un exemplu pentru (2). În biblioteca standard, avem funct,ia qsort:

    void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const→˓void*));

    Observat,i compar este un pointer la o funct,ie ce acceptă doi pointeri void s, i returnează un întreg.

    Citit,i cu atent,ie exemplul s, i documentat,ia de pe internet .

    12.2 Probleme propuse

    12.2.1 Fibonacci reinstant, iat

    Implementat,i recursiv funct,ia lui Fibonacci. Modificat,i funct,ia astfel încât să "numere" intern câte apelări au fost.Terminat,i calculul dacă se depăs, esc un anumit număr de apeluri (s, i eventual semnalizat,i rezultatul incorect)

    12.2.2 Tokenizare

    Citit,i un fis, ier de text s, i despărt,it,i textul în cuvinte. Memorat,i fiecare cuvânt din fis, ier într-un tabel. Afis, at,i cuvintele,în ordinea citirii, după ce at,i închis fis, ierul. Putet,i presupune că nu sunt mai mult de 1000 cuvinte în fis, ier.

    Alocat,i dinamic memoria pentru cuvinte! Doar strictul necesar!

    12.2.3 Sortat, i un s, ir de numere

    Citit,i un s, ir de numere dintr-un fis, ier text. (Se poate specifica numărul de numere, pe prima linie din fis, ier).

    Sortat,i folosind qsort

    12.2.4 Sortat, i un tablou de structuri

    Funct,ia de callback poate fi complicată. Trebuie să înt,eleget,i cum "circulă" pointerii la datele dvs din qsort încallback.

    Reluat,i exemplul cu citirea unei liste de student,i din fis, ier. În fis, ier găsit,i numărul de student,i (pe prima linie) urmatde n perechi de linii, nume s, i nota.

    Păstrat,i datele într-un tabel dinamic de structuri (pointer spre structuri). Numele student,ilor pot să fie stocate init,ial întabele statice (char nume[100])

    Sortat,i, folosind qsort:

    • Alfabetic, după nume

    • După notă.

    38 Chapter 12. L12. Pointeri la funct, ii

    http://www.cplusplus.com/reference/cstdlib/qsort/?kw=qsort

  • Programarea Calculatoarelor. Laborator, Versiune 0.3

    Atent,ie, trebuie să implementat,i două funct,ii de callback, câte una pentru fiecare tip de comparat,ie.

    Folosit,i debug-ul pentru a înt,elege s, i verifica dacă convertit,i bine pointerii.

    12.3 Evaluarea laboratorului (muncă individuală)

    Se va verifica că s, tit,i să folosit,i conceptele de limbaj prezentate până în acest moment.

    12.3.1 Sortat, i o listă de cuvinte

    Citit,i un fis, ier de text s, i despărt,it,i textul în cuvinte. Memorat,i fiecare cuvânt unic din fis, ier. Numărat,i de câte oriapare fiecare cuvânt. Închidet,i fis, ierul. Afis, at,i cuvintele, în ordinea primei aparit,ii. Sortat,i apoi cuvintele, în ordineadescrescătoare a numărului de aparit,ii. Afis, at,i cuvintele s, i numărul de aparit,ii.

    Putet,i presupune că nu sunt mai mult de 1000 cuvinte în fis, ier.

    Sortat,i folosind qsort. Creat,i-vă fis, ierul sau luat,i un text mai scurt de pe Wikipedia.

    Folosit,i structuri pentru a t,ine minte cuvintele. Căutarea după cuvinte existente NU trebuie să fie optimă. Un algoritmce verifică cuvânt cu cuvânt în lista de cuvinte deja existentă, este suficient.

    12.3. Evaluarea laboratorului (muncă individuală) 39

  • Programarea Calculatoarelor. Laborator, Versiune 0.3

    40 Chapter 12. L12. Pointeri la funct, ii

  • Bibliografie

    1. Ignat I., C.L. Ignat, "Programarea calculatoarelor – Descrierea algoritmilor s, i fundamentele limbajului C/C++",Ed. Albastră, Cluj-Napoca, 2005

    2. Liviu Negrescu, "Limbajele C şi C++ pentru începători. Limbajul C", Editura Albastră, Cluj-Napoca, 1994

    41

    L1. Setarea mediului de lucruBine Ați Venit!Setare mediu de lucruEvaluarea laboratorului (muncă individuală)

    L2. Instrucțiuni de control al execuției programuluiRecapitulareNoțiuni noi introduseProbleme rezolvateProbleme propuseEvaluarea laboratorului (muncă individuală)

    L3. Operatori și ExpresiiRecapitulareNoțiuni noi introduseProbleme propuseEvaluarea laboratorului (muncă individuală)

    L4.Tabele IRecapitulareNoțiuni noi introduseProbleme propuseEvaluarea laboratorului (muncă individuală)

    L5. Tabele IIRecapitulareNoțiuni noi introduseProbleme propuseEvaluarea laboratorului (muncă individuală)

    L6. Structuri. Șiruri de caractereRecapitulareProbleme propuseEvaluarea laboratorului (muncă individuală)

    L7. Operații cu date compuse IRecapitulareProbleme propuseEvaluarea laboratorului (muncă individuală)

    L8. Operații cu date compuse IIProbleme propuseEvaluarea laboratorului (muncă individuală)

    L9. Structuri de date complexe IRecapitulareProbleme propuseEvaluarea laboratorului (muncă individuală)

    L10. Structuri complexe IIRecapitulareProbleme propuseEvaluarea laboratorului (muncă individuală)

    L11. RecursivitateRecapitulareProbleme propuseEvaluarea laboratorului (muncă individuală)

    L12. Pointeri la funcțiiRecapitulareProbleme propuseEvaluarea laboratorului (muncă individuală)

    Bibliografie