Sunteți pe pagina 1din 8

AN II ID

Lab 1 Algoritmi si structuri de date

Recapitulare limbajul C:
1. Siruri
Program 1. Sa se scrie un program C care citete de la tastatur un sir de intregi, il afiseaza si calculeaza si afiseaza media aritmetica a elementelor sirului. Program 1 optional. Sa se scrie un program C care citete de la tastatur rezultatele la examenul de programare ale celor o sut de studeni din anul II intr-un sir i afiseaza cea mai mare not, dup care s se afieze toate notele n ordinea invers a introducerii lor.

2. Alocare dinamica in C
Program 2. Modificati programul 1 astfel incat sirul de intregi sa fie alocat dinamic. Program 2 optional. Modificati programul 1 optional astfel incat sirul de intregi sa fie alocat dinamic.

3. Un pas spre C++. Folosirea functiilor de citire/scriere ale bibliotecii iostream.h (cin, cout)
Program 3. Scrieti varianta in C++ a programului 1. Program 3 optional. Scrieti varianta in C++ a programului 1 optional.

4. Alocare dinamica in C++


Program 4. Scrieti varianta in C++ a programului 2. Program 4 optional. Scrieti varianta in C++ a programului 2 optional.

5. Tipul struct in C/C++


Program 5. Folosind tipul struct, dai o definiie pentru un cont bancar ce conine informaiile: nr de cont, balana, suma minim din cont. Scriei un program care citeste de la tastatura informatiile unui cont si le afiseaza. Program 5 optional. Folosind tipul struct, dai o definiie pentru un cont bancar ce conine informaiile: nr de cont, balana, suma minim din cont. Scriei un program

AN II ID care simuleaz o operaiune bancar: extragere din sau depunere de bani n cont. Se vor afia informaiile contului nainte i dup efectuarea operaiunii. Program 6 optional. Sa se scrie un program C++ care afiseaza numele si prenumele studentului cu cea mai mare nota la examenul de programare dintre cei n studenti din anul II. Se va declara o struct care contine numele, prenumele si nota unui student si se va crea folosind alocarea dinamica un sir de struct ce contine informatiile tuturor studentilor. Informatiile se citesc de la tastatura.

Materiale ajutatoare
1) Declararea unui ir irurile sunt folosite pentru procesarea coleciilor de date de acelai tip. Colecia de date va fi referit printr-un singur nume, numele irului, iar fiecare membru al coleciei va avea un indice pentru identificarea sa. n C, un ir de 100 de variabile de tip int se poate declara n modul urmtor: int nota[100]; n care nota este numele irului, int este tipul de baz al irului care este tipul comun datelor din ir, iar 100 este dimensiunea irului, adic numrul de elemente ale irului. Elementele irului sunt indexate, ntotdeauna indicele ncepnd cu 0. Cele 100 de elemente ale irului nota sunt: nota[0], nota[1], ... , nota[99]. Indicele este ntotdeauna inclus ntre paranteze ptrate i poate fi orice expresie ntreag. O variabila indexat poate fi folosit n orice context n care o variabil de tip int poate fi folosit. Dimensiunea irului este de asemenea de tip int. Este permis i urmtoarea secven de program: int nr_studenti; scanf("%d", &nr_studenti); int nota[nr_studenti]; aceasta presupunnd c irul nota va avea alocat un numr de ntregi egal cu numrul introdus de la tastatur pentru variabila nr_studenti. Modificarea ulterioar a acestei variabile nu presupune, n schimb posibilitatea mririi sau micorrii spaiului ocupat de irul nota. O alternativ este folosirea aa numitor iruri pariale, adic iniial definim dimensiunea irului suficient de mare pentru a putea rula programul nostru pentru irurile de dimensiuni variabile dorite, iar n program i cerem utilizatorului s introduc de la tastatur dimensiunea exact a irului care urmeaz s fie prelucrat. 2) Cum sunt stocate irurile n memorie Elementele unui ir sunt stocate n memorie n ordine consecutiv: nti elementul de indice 0, acesta ocupnd un numr de octei corespunztor tipului irului, apoi elementul de indice 1, i aa mai departe. De exemplu, irul urmtor va fi memorat dup cum urmeaz: int a[4];

AN II ID

a[0]

a[1]

a[2]

a[3]

1079

1083

1087

1091

Adresa irului este adresa primului element al irului, deci adresa elementului de indice 0. Dac se cunoate adresa irului atunci se poate afla adresa oricrui element al irului. Astfel, adresa lui a[2] =adresa lui a[0] + 4 * 2 = 1079 + 8 = 1087 dimensiunea tipului irului indicele elementului Deci acum nelegem de ce referirea la un element ca a[5] (cu indice n afara domeniului) nu produce o eroare de compilare: calculatorul va face referirea la variabila int cu adresa 1079 + 4 * 5 = 1099 i o va modifica sau i va folosi valoarea. Sigur c dei nu obinem o eroare de compilare, vom obine o eroare la rulare (eroare run-time). 3) Pointeri i alocarea dinamic Limbajul C permite manipularea direct a memoriei. Sirurile declarate ca mai sus au dimensiune fix n momentul compilrii. Pentru o mai bun gestionare a memorie, limbajul C furnizeaz o modalitate de alocare a memoriei care se numete alocare dinamic, adic alocare a memoriei n momentul rulrii programului, permind programului s ii ajusteze capacitatea de memorare a datelor n funcie de necesitile utilizatorului. n C sunt disponibile patru funcii care pot aloca att spaiu ct este dorit, pot modifica dimensiunea unui ir existent sau pot elibera zone de memorie alocate anterior. Aceste funcii sunt: malloc calloc realloc free Toate aceste funcii aparin bibliotecii stdlib.h. Prototipul funciei malloc este: void *malloc(size_t dimensiune); Funcia malloc rezerv un numr de octei specificat de ctre parametrul dimensiune, n locaii de memorie consecutive returnnd un pointer la primul octet sau pointerul NULL (adic pointerul 0, care nu puncteaz nimic) dac nu poate aloca memoria solicitat. Funcia returneaz un pointer de tip void adic n momentul n care acest pointer este atribuit unui pointer de un anumit tip, valoarea pointerului returnat de ctre funcia malloc se va transforma n tipul corespunztor. (Unele compilatoare nu fac aceast conversie automat i atunci programatorul trebuie s foloseasc o conversie de tip cast). size_t corespunde tipului ntreg fr semn, fiind tipul rezultatului pe care l returneaz operatorul sizeof. Acest tip este definit n stddef.h. Exemplu: Considerm secvena de instruciuni:

AN II ID int *p; p = malloc(5 * sizeof (int) ); malloc va aloca 5*4=20 de octei (am presupus c dimensiunea int este de patru octei), va returna un pointer la primul octet, va transforma acest pointer n pointer la int, deoarece tipul membrului stng al atribuirii este pointer la int, valoarea acestui pointer fiind atribuit pointerului p. n cazul n care conversia nu se face automat, atunci instruciunea de atribuire de mai sus se nlocuiete cu instruciunea: p = (int *) malloc(5 * sizeof (int) ); Deci p este de fapt un pointer la un ir de 5 variabile int. Putem iniializa elementele irului, putem efectua orice prelucrare a elementelor irului ca i cum ele ar fi fost alocate n momentul compilrii. Prototipul funciei calloc este: void *calloc(size_t n, size_t dimensiune); Funcia calloc aloc spaiu de memorie pentru n elemente, fiecare de mrimea dimensiune. Fiecare element este iniializat cu zero. Funcia returneaz un pointer la spaiul alocat i NULL dac nu este suficient spaiu n memorie sau dac n = 0 sau dimensiune = 0. Exemplu: float *p; p = calloc(10, sizeof(float) ); Prototipul funciei realloc este: void *realloc(void *p, size_t dimensiune); Funcia realloc modific marimea unui spaiu pentru date deja existente. p este un pointer ctre o zon de memorie deja alocat. Dac p este NULL funcia realloc funcioneaz ca i funcia malloc, alocnd un bloc de atia octei ci sunt precizai de dimensiune. Dac p nu este NULL atunci p trebuie s fie un pointer returnat de un apel anterior al uneia din funciile malloc, calloc sau realloc. Parametrul dimensiune determin noua mrime, n octei, a blocului de memorie alocat. Acest proces are loc fr s se tearg datele existente. Dac zona de memorie existent nu poate fi extins fr s se suprapun cu alte date, ntreaga zona este copiat la o alt locaie, iar zona veche este eliberat. Funcia returneaz un pointer la noua zona de memorie alocat sau NULL. Exemplu: alocdinam.C #include<stdio.h> #include<stdlib.h> int main() { char *pc; pc = malloc(50 * sizeof(char)); if (pc == NULL) printf("Insuficient spatiu"); else

AN II ID { printf ("Bloc de 50 de caractere alocat cu succes \n"); realloc(pc , 100 * sizeof(char)); if (pc == NULL) printf ("Insucces al functiei realloc"); else printf ("Bloc de 100 de caractere alocat cu succes\n"); } return 0; } Prototipul funciei free este: void free(void *p); Funcia free elibereaz blocul de memorie indicat de pointerul p, unde p trebuie s fie un pointer returnat de un apel anterior al uneia din funciile malloc, calloc sau realloc. Funcia free nu poate fi utilizat pentru eliberarea memoriei alocate de variabile n momentul compilrii. Dup apelarea funciei free blocul eliberat este disponibil pentru alocare. Un pointer NULL ca argument este ignorat. 4) Un pas spre C++ Limbajul C++ este o extensie a limbajului C care a fost creat pentru programarea orientat pe obiecte i abstractizarea datelor n general. Dei conceptele cheie n C++ sunt clasa i obiectele, C++ a venit cu unele mbuntiri fa de C care nu sunt legate strict de programarea orientat pe obiecte. Voi prezenta n continuare cteva dintre aceste mbuntiri. Declaratiile de variabile pot apare oriunde este nevoie nu numai la nceputul funciilor. Astfel n C++ se obinuiete ca variabila de iniializare pentru o instruciune for s fie declarat chiar n interiorul instruciunii. Urmtoarea secven de program calculeaz suma 1 + 2 ++ n. S = 0; for ( int i = 1; i <= n; i ++) S += i; S-a definit un tip de date special pentru rezultatul unei expresii logice, tip de date denumit bool, care are doar dou valori true i false. Instruciune if a fost creat astfel nct s accepte expresii de tip bool. O conversie automat din int in bool a fost creat: orice valoare ntreag diferit de zero este convertit n valoarea true, iar 0 la false. A fost introdus apelarea prin referin. Aceast modalitate de apelare a unei funcii permite parametrilor sa fie modificai in funcie, modificare ce se reflect i asupra valorii variabilelor din funcia apelant. Un parametru apelat prin referin se declar astfel: nume_tip &nume_var. Astfel o funcie care interschimb valorile a dou variabile oarecare se poate scrie astfel (ca alternativ a funciei swap din Capitolul 8). void interschimba(int &a, int &b)

AN II ID { int c = a; a = b; b = c; } Funcia modific argumentele folosite la apelarea ei. Programul int main( ) { int x = 3, y = 4; printf("%d %d \n", x, y); interschimba(x, y); printf("%d %d \n", x, y); return 0; } va tipri 3 4 . 43 Alte mbuntiri ale limbajului C++ sunt legate de programarea orientat pe obiecte, dar le vom enuna, fr prea multe explicaii, pentru c ele simplific munca programatorului, dar mai ales pentru c studenii se pare c le prefer atunci cnd nva s programeze. Au fost create noi biblioteci de intrare i ieire: iostream.h pentru I/O standard (input de la tastatur, output la monitor) i fstream.h pentru I/O cu fiiere. Astfel pentru citire se poate folosi cin (un obiect al clasei iostream), iar pentru scriere cout. Exemple: cin >> v; asteapt introducerea de la tastatur a unei valori care este convertit la tipul variabilei v i atribuit variabilei v. Aceasta nlocuiete apelarea funciei: scanf("%d", &v); cout << "Hello world! "; tiprete mesajul Hello world! pe ecran. cout << endl; tiprete caracterul linie nou. cout << "v="<< v; tiprete v= urmat de valoarea lui v. cout << expresie; tiprete valoarea expresiei. Au fost introdui operatorii pentru managementul memoriei: new, delete. Operatorul new creeaz un obiect de un tip specificat i returneaz un pointer la acel obiect sau NULL dac obiectul nu a putut fi creat. Operatorul delete elibereaz locaia de memorie punctat de un pointer creat prin folosirea operatorului new. Acetia se folosesc n locul funciilor de alocare dinamica (malloc, calloc, realloc, free). Exemple: new int aloca spatiu pentru un int i returneaza un pointer la locaia de memorie i se poate folosi n locul apelrii: malloc(sizeof(int)), new int [n] aloca spaiu pentru un ir de n ntregi i returneaza un pointer la primul element al irului i se poate folosi n locul apelrii: malloc(n*sizeof(int)), sau calloc(n, sizeof(int))

AN II ID delete p elibereaz locaia de memorie punctat de p i se poate folosi n locul apelrii: free(p), delete [] p pentru p ce puncteaz un ir, elibereaz locaia de memorie ocupat de ntregul ir ctre care puncteaz p i se poate folosi n locul apelrii: free(p).

5) Tipul struct Gruparea mai multor elemente se face, n C, prin definirea unui nou tip de date, un tip de date care este definit de programator (deci nu este predefinit) i care se numete tipul struct. Descrierea unui punct n plan se va face atunci n felul urmtor: struct punct { double x; double y; }; iar o variabil de acest tip va putea fi declarat astfel: struct punct p1; in C iar in C++ doar punct p1; i va avea de fapt dou componente, la care se poate face referire n felul urmtor: coordonata x va fi p1.x, iar coordonata y va fi p1.y. Dar s vedem cum se definete acest tip struct n general: struct nume_tip { tip_membru1 var_membru1; tip_membru2 var_membru2; ... nu uitai ; }; n care struct este cuvnt cheie (keyword), nume_tip este numele pe care programatorul l da tipului de date nou creat, tip_membru1 var_membru1; tip_membru2 var_membru2; ... sunt declaraiile variabilelor componentelor tipului de date, cele care sunt grupate mpreun i sunt tratate ca i o singur entitate. var_membru1, var_membru2, ... se numesc numele membrilor tipului de date. Exemplu: struct info_student { char *nume; char *prenume; int note[10]; }; descrie un nou tip struct pentru reprezentarea informaiei unui student. Declararea variabilelor de tipul nou creat (de tip struct), variabile care se mai numesc i structuri, se poate face n felul urmtor: struct nume_tip nume_var_structura; in C iar in C++ doar nume_tip nume_var_structura; i deci o variabil de tip info_student poate fi declarat astfel: struct info_student student; in C iar in C++ doar info_student student;

AN II ID

Definiia unui tip struct este de obicei plasat n afara oricrei funcii (ca i declararea variabilelor globale), caz n care definiia este global i va fi valabil n fragmentul de program ce urmeaz definiiei. Dup declararea variabilei de tip struct, variabilele membru ale acesteia se pot accesa n felul urmtor: nume_var_structura.var_membru unde . este operatorul punct care are cea mai mare preceden i se asociaz de la stnga la dreapta. Aceste variabile reprezint i se comport ca orice alte variabile de tipul tip_membru corespunztor. Exemple: Cu definiiile de mai sus, putem scrie student.nume i are tipul char* origine.x i are tipul double pct.y i are tipul double student.note i are tipul ir de 10 ntregi. Elementele irului pot fi referite n felul urmtor: student.note[0], student.note[1], ..., student.note[9]. De asemenea, putem tipri coordonatele punctului p1 (variabila de tip struct punct): printf("(%6.2f,%6.2f)", p1.x, p1.y); sau iniializa variabila origine de tipul struct fr nume: origine.x = 0.0; origine.y = 0.0; origine.z = 0.0; sau putem prelucra informaia despre numele unui student (folosind variabila student de tip info_student): char s[50]; strcpy(s, student.nume); strcat(s," "); strcat(s, student.prenume); puts(s); care va tipri numele studentului urmat de un spaiu i de prenumele studentului.

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