Sunteți pe pagina 1din 7

Universitatea Tehnică a Moldovei

FCIM
Catedra Informatica Aplicativă

RAPORT
la lucrarea de laborator nr. 1
la Structuri de Date si Algoritmi

Tema: Analiza eficienţei prelucrării structurilor de date cu pointeri

Varianta : 22

A efectuat: st. gr. Ti-191 Leahu Vasile

A verificat: Marin Ştefan

Chişinău – 2020
Sarcina şi obiectivele:
1. De studiat şi însuşit materialul teoretic din lucrarea dată prin lansarea exerciţiilor la execuţie pentru analiza şi
evidenţierea esenţialului prelucrării structurilor de date cu pointeri în elaborarea modelelor soluţiei prin
explicaţii, argumentări şi organigrame.
2. In baza materialului teoretic la prima lucrare de laborator efectuati cate 2 exerciţii şi să se analizeze algoritmii şi
si specificul organizarii programelor cu fără pointeri (declarări şi parcurgeri cu pointeri). Pentru aprofundarea
înţelegerii implementarii pointeriilor in lucrarea de laborator nr. 2 să se dezvolte algoritmii şi programele cu
pointeri pentru condiţiile problemelor din Anexa1a şi să se elaboreze scenariile succinte de soluţionare prin
pointeri cu calculele de verificare şi explicaţii. Rularea programelor în limbajul C cu afişarea tuturor variabilor
de intrare, intermediare şi finale.
3. În raport să fie expuse toate programele şi calculele efectuate. Să se analizeze tehnica programării eficiente cu
pointeri în baza exerciţiilor şi variantelor problemelor efectuate pentru diverse situaţii cu argumentări.

Fiecare temă conţine două probleme care vor fi rezolvare cu mijloacele limbajului C (diferite modele de date şi
obiecte). Temele se iau în conformitate compartimentele propuse.
Lucrarea se consideră efecutată după ce studenţii demonstrează profesorului funcţionarea corectă a programelor la
calculator şi apoi prezintă darea de seamă cu analiza rezultatelor. Darea de seamă include: foaia de titlu şi pentru
fiecare lucrare să se descrie algoritmul de rezolvare a problemei, listingul programului cu srinshot-urile, dotat cu
comentariile de rigoare, Datele de intrare şi rezultatele să fie folosite în simularea numerică şi să fie analizate în
comparaţie cu rezultatele obţinute, concluzia şi bibliografia studiată.
Consideraţii teoretice:
1. Noţiuni, exemple şi importanţa implementării pointelor
Variabile statice şi variabile dinamice. Variabilele pot fi statice sau dinamice. Cele statice au o zonă de memorie
bine definită. Structura, locul, tipul acestei zone nu poate fi schimbată în procesul execuţiei programului. Accesul la
variabilele statice se face direct, după nume. Structurile statice de date au un număr fix de elemente, care nu poate fi
modificat.
Alocarea memoriei se face într-un spaţiu strict determinat al memoriei, care permite adresarea directă.
O altă categorie de variabile, accesibile în limbaje este cea dinamică. Pentru acest tip de variabile poate fi modificat
volumul de memorie rezervat, ceea ce face mai flexibilă alocarea memoriei în procesul de lucru al programului.
Structurile dinamice pot acumula elemente în procesul de funcţionare al programului, sau pot lichida elementele ce
au devenit neutilizabile. Accesul la aceste variabile şi declararea lor se face în mod diferit de cel al variabilelor
statice. Accesarea (definirea) este indirectă, prin intermediul unui tip mediator de variabile – tipul referinţă.
Variabile de tip referinţă conţin referiri (adresări indirecte) la variabilele dinamice. Referirea se realizează prin
memorarea în variabila referinţă a adresei unde e stocată variabila dinamică.
Pentru variabilele tip referinţă se alocă un spaţiu de memorie de 4 octeţi, care conţin adresa variabilei dinamice.
Memoria pentru variabilele dinamice se alocă dintr-o zonă specială, care foloseşte adresarea indirectă, numită heap.
Această zonă este diferită de zona pentru variabilele statice.
Variabilele dinamice ocupă un spaţiu de memorie în corespundere cu tipul lor: întreg (int), float (real), şiruri de
caractere (string) etc.
Zona de memorie este o succesiune de 1 , 2 , 4 , 8 sau mai multe locaţii ( octeţi ) consecutive de memorie.
Adresa unei zone de memorie este numarul de ordine a primei locatii de memorie ( cea mai din stinga ) .
Pentru efectuarea eficienta se utilizeaza mecanismul de functionare a pointerilor,
Sunt doua mari categorii de pointeri : pointeri catre variabile si pointeri catre functii .
Mulţimea valorilor variabilelor tip referinţă este formată dintr-o mulţime de adrese, fiecare din ele identificînd o
variabilă dinamică. Mulţimea de valori mai e completată prin valoarea NULL, care nu conţine nici o adresă.
Mecanismul de functionare a pointerilor. Deci un pointer este o variabila care are ca valoare adresa unei zone
de memorie.
Pointerii sunt variabile care pot contine adresa de memorie a unei alte variabile. Din aceste considerente, pointerii se
numesc si variabile de adresa.
Presupunem ca avem o variabila de tip întreg numita entitate localizata la adresa de memorie 0x1000 (adresele sunt
automat asigante variabilelor de catre compilator). Daca dorim sa referim aceasta variabila prin intermediul unui
pointer entitate_ptr, atunci valoarea pointerului va fi 0x1000 (entitate_ptr = 0x1000), astfel spunem ca
entitate_ptr "arata" spre variabila entitate (Pentru a se evita confuziile, se recomanda ca numele pointerilor sa aiba
sufixul _ptr).
Pointerii se utilizeaza pentru a face referinţe ( a avea acces ) . la valoarea unei variabile atunci când se
cunoaste adresa ei . Dar o variabila se memoreaza intr - o zona de memorie de o anumita lungime ,
functie de tipul ei . De exemplu, o variabila de tip int se memoreaza pe doi octeti, pe când una de tip float
pe 4 octeti . De aici urmeaza ca un pointer nu reprezinta numai adresa unei variabile ci mai mult decit
atât, anume:
-adresa unei zone de memorie;
-tipul variabilei ( int , char , double etc . ) care este memorata in acea zona de memorie.
Notiunea de pointer face ca limbajul C sa fie un puternic instrument de programare , mai ales la
indemâna programatorilor avansaţi . Recomandam ca utilizarea pointerilor sa se faca numai dupa intelegerea
clara a mecanismului de lucru cu adrese, intrucât, folositi fara discernamint, ( pointerii neinitializati, distrugerea
unor zone de memorie etc.).
Totusi folosiţi cu economie si disciplina, ei dau nastere la programe clare si simple, si de cele mai multe ori mai
rapide decit in varianta fara pointeri.
DECLARAREA POINTERILOR Ca si in cazul oricaror tipuri de variabile si pointerii trebuie declarati. Ei se
declara la fel, cu deosebirea ca numele pointerului este precedat de caracterul *.
Declaraţia de pointer este: tip *nume; si prin aceasta se precizeaza ca nume este un pointer catre o zona de
memorie care contine valoarea unei variabile de tipul tip.
In declaratia de mai sus tip poate fi : int, unsigned, char, float, double etc. sau un sablon de structura. Deci
constructia tip * introduce un nou tip de date anume pointer la tip.
In afara de tipul int, long, float etc., exista si un pointer special, anume de tip void (mai precis fara tip). care se
refera la o zona de memorie ce poate contine orice tip de variabila.
Exemple :
long *pl ; /* pointer la long; */
char *pc; /* pointer la char; */
double *x; /* pointer la double; */
void *v ; /* pointer fara tip ; */
int *pi[ 8 ]; /* sir de 8 pointeri la int; */
unsigned *pm [ 5 ][ 2 ]; /*masiv bidimensional de pointer la unsigned. */
int *p; /* pointeri la int; */
*p++ operatorul ++ incrementeaza pointerul
(*p)++ operatorul ++ incrementeaza continutul pointerului
*++p operatorul ++ incrementeaza pointerul
++(*p) operatorul ++ incrementeaza continutul pointerului.
Un pointer poate fi utilizat pentru referirea diferitelor date si structuri de date. Schimband adresa memorata in
pointer, pot fi manipulate informatii situate la diferite locatii de memorie.
Sarcinile lucrarii :
Exercitiul 22: Da-ţi la execuţie şi analizaţi modul de organizare a parcurgerii şi obţinere a
rezultatelor prin pointeri şi indecşi, afişând toate valorile. Dacă sunt construcţii inadmesibile,
face-ţi corectări cu explicaţii şi rulaţi din nou. Comparaţi.
#include <stdio.h>
char *c[ ] = { "FIRST", "FOR", "WHILE", "DO" };
char ** cp[ ] = { c+3, c+2, c+1, c };
char ***cpp=cp;
main()
{ printf("%s", **++cpp );
printf("%s ", * -- *++cpp+3 );
printf("%s", *cpp[ -2 ]+3 );

printf("%s\n", cpp[ -1 ][ -1 ]+1 ); }

Programul corectat si rezultatele la compilare :


Exercitiul 22:
#include <stdio.h>
#include <string.h>
// introducem 3 pointeri de tip char
char *c[]={ "FIRST", "FOR", "WHILE", "DO" };
char **cp[]={ c+3, c+2, c+1, c };
char ***cpp=cp;
// Programul Principal
main(){
// afiseaza cuvantul while
printf("%s", **++cpp );
//afiseaza cuvantul first
printf("\n%s ", *--*++cpp );
//afiseaza cuvantul do
printf("\n%s", *cpp[-2] );
//afiseaza cuvantul for
printf("\n%s", cpp[-1][-1] );}

Rezultatul la compilare :
INTREBĂRI ŞI EXERCIŢII :

1. În ce constă operaţia de incrementare a pointerilor?


*p++ operatorul ++ incrementeaza pointerul
(*p)++ operatorul ++ incrementeaza continutul pointerului
*++p operatorul ++ incrementeaza pointerul
++(*p) operatorul ++ incrementeaza continutul pointerului.

2. Exemple de Tablouri de pointeri.

Fie declaraţia tip a[DIM1][DIM2]; Atunci &a[i] == a+i = adresa liniei i = constantă de tipul tip (*)[DIM2]
(adresă de tablou de DIM2 elem. tip)

3. Ce sunt pointerii generici?

Tipul void * e folosit ca tip de adresă generică (nu indică nimic)


– poate fi atribuit în ambele sensuri la orice alt pointer, fără ( )
– nu poate fi dereferenţiat fără conversie (nu ştim ce indică)

4. De ce numele unui pointer este rvalue?

Adresa zonei de memorie, unde se păstrează valoarea rvalue i x se poate obţine cu operatorul obţinerii adresei “&”.
Rezultatul operaţiei obţinerii adresei este adresa locaţiei de memorie ce a fost alocată pentru variabila respectivă.

5. Ce fel de variabile pot constitui operandul operatorului de deferenţiere?

Operatorul de referenţiere. Operand: pointer. Rezultat: referinţă la obiectul indicat de pointer >
operator de indirectare (dereferenţiere, referire indirectă prin adresă)
un lvalue = orice poate apare la stânga unei atribuiri (variabilă, element de tablou, funcţie; NU pentru expresii
oarecare

Exercitii rezolvate :
#include <stdio.h>
void main (){
int x=5;
int *q;
q=&x;
printf ("x=%d\n",x); // x=5;
*q=6;
printf ("x=%d\n",x); } // x= 6;

#include<stdio.h>
void main(void)
{ int sir[]={1,2,3,4,5,6,7,8,9}, aux;
int *p_init,*p_fin;
for(p_init=sir,p_fin=sir+sizeof(sir)/sizeof(sir[0])-1;
p_init<p_fin; p_init++,p_fin--){ aux=*p_init; *p_init=*p_fin; *p_fin=aux; }
for(p_init=sir; p_fin=sir+sizeof(sir)/sizeof(sir[0]);
p_init++) printf("\n %d",*p_init); }
#include<stdio.h>
void main(void)
{ char *psir[]={"unu","doi","trei","patru"}; char **ppsir[]={psir+3,psir+2,psir+1,psir};
char ***pppsir=ppsir;
printf("\n%s",**++pppsir);
printf("\n%s",*--*++pppsir);
printf("\n%s",*pppsir[-2]);
printf("\n%s",pppsir[-1][-1]);}

Concluzie :
Pointerii se utilizeaza pentru a face referinţe ( a avea acces ) . la valoarea unei variabile atunci când se
cunoaste adresa ei
Un pointer poate fi utilizat pentru referirea diferitelor date si structuri de date. Schimband adresa memorata in
pointer, pot fi manipulate informatii situate la diferite locatii de memorie.
Pointerii permit de asemenea crearea de noi variabile in timpul executiei programului, prin alocare dinamica.
In afara de tipul int, long, float etc., exista si un pointer special, anume de tip void (mai precis fara tip). care se refera
la o zona de memorie ce poate contine orice tip de variabila. Tipul void * e folosit ca tip de adresă generică (nu
indică nimic)
– poate fi atribuit în ambele sensuri la orice alt pointer, fără ( )
– nu poate fi dereferenţiat fără conversie (nu ştim ce indică)

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