Sunteți pe pagina 1din 8

Ministerul Educaiei Republicii Moldova

Universitatea Tehnica a Moldovei


Facultatea Calculatoare, Informatica si Microelectronica.

Referat
Lucrare de laborator Nr.1 la Structuri de Date i Algoritmi
Analiza eficienei prelucrrii structurilor de date cu pointeri

A efectuat: st. gr. TI-103 A verificat:

Braga Teodor tefan Marin

Chisinau-2011

1.Teorie
Pointerul este o variabila care are ca valoare adresa unei zone de memorie. Pointerii sunt

variabile care contin adresa de memorie a unei alte variabile. Din aceste considerente, pointerii se numesc si variabile de adresa.Variabilele de tip pointer se declara la fel ca celelalte variabile , cu
deosebirea ca numele pointerului este precedat de caracterul *. Declaratia 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. 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. Valoarea unui pointer este fie o adresa, fie constanta 0 ( zero ) definita in fisierul antet stdio .h prin NULL, si de aici urmeaza ca un pointer este initializat prin atribuirea unei adrese ( un alt pointer ) sau a constantei simbolice NULL. Initializarea se poate face la declararea pointerului sau in decursul programului. Operatorii specifici pointerilor sunt: operatorul de dereferentiere * (pentru un pointer, returneaza entitatea referita de pointer) si operatorul de adresa & (pentru o entitate, returneaza adresa entitatii). Pentru a atribui unui pointer o adresa exista operatorul & , numit si de adresa , care aplicat unei variabile , unui element al unui masiv sau unei structuri furnizeaza adresa zonei de memorie unde este memorat respectivul obiect . Operatorul & este unar , are aceeasi prioritate cu a altor operatori unari ++, -- , ! , - (dupa paranteze) si se asociaza de la dreapta la stanga. Nu se aplica expresiilor intre paranteze , constantelor sau variabilelor de tip register si de aceea utilizarile : & (a + 2 * b ) sau & 13 sunt eronate. Operatiile aritmetice care pot fi efectuate cu pointeri sunt: atribuirea, adunarea cu un intreg, scaderea cu un intreg, scaderea a doi pointeri, comparatia unui pointer cu constanta simbolica NULL si compararea a doi pointeri. Rezultatul adunarii este un pointer de acelasi tip marit cu intregul de adunat inmultit cu numarul de octeti necesari pentru a memora o valoare de tipul pointerului. Efectul scaderii unui intreg dintr-un pointer este acela ca valoarea pointerului se micsoreaza cu intregul de scazut inmultit cu numarul de octeti necesari pentru a memora o valoare de tipul pointerului. Daca pointerii sunt de acelasi tip , in sensul ca se refera la obiecte de acelasi tip, ei se pot scade si rezultatul scaderii este un intreg int sau long ( functie de modelul de memorie) egal cu numarul de locatii de memorie capabile sa memoreze o valoare de tipul comun al pointerilor existente intre adresa primului si adresa celui de-al doilea. Rezultatul este pozitiv daca primul pointer este o adresa aflata la dreapta adresei din cel deal doilea pointer si negativ in caz contrar. Pentru ca operatia de comparare sa fie valida, cei doi pointeri trebuie sa indice catre doua elemente ale aceluiasi tablou si rezultatul comparatiei este egal cu rezultatul comparatiei celor doi indici.

Sarcina problemei:
Se genereaza toate sirurile de valori din multimea {0,1,2} in care 0 apare de m ori, 1 de p ori si 2 de q ori. Generarea tuturor sirurilor cu m+p+q valori presupune alegerea unei valori pentru primul termen si generarea tuturor sirurilor cu m+p+q valori din {0,1,2} in care 0 apare de m ori, 1 de p ori, 2 de qori, m, p sau q sint mai mici cu 1 decat m, p, q, dupa cum valoarea aleasa pentru primul termen este 0, 1 sau 2.

2. Lisingul programului
Fara pointeri:
#include<conio.h> #include<stdio.h> #include<time.h> #include<dos.h> int mpq[3],sol[50],n,i; void afisare() { int i; for(i=0;i<n;i++) printf("%d ",sol[i]); printf("\n"); } void generare(int k) { int i; for(i=0;i<3;i++) { if(mpq[i]>0) { sol[k]=i; --mpq[i]; if(k<n-1) generare(k+1); else afisare(); ++mpq[i]; } } } void main() { clrscr(); printf("Introduceti m,p,q: "); for(i=0;i<3;i++) scanf("%d",&mpq[i]); n=0; for(i=0;i<3;i++) n+=mpq[i]; generare(0); { clock_t start,end; start=clock(); delay(2000); end=clock(); printf("\n Timpul este %f \n", (end-start)/CLK_TCK); } getch(); }

Cu pointeri:
#include<conio.h> #include<stdio.h> #include<time.h> #include<dos.h> int mpq[3],sol[50],n,*p; void afisare() { int *p; for(p=sol;p<sol+n;p++) printf("%d ",*p); printf("\n");}

void generare(int *psol) { int *p; for(p=mpq;p<mpq+3;p++) { if(*p>0) { *psol=p-mpq; --(*p); if(psol<sol+n-1) generare(psol+1); else afisare(); ++(*p); } } } void main() { clrscr(); printf("Introduceti m,p,q: "); for(p=mpq;p<mpq+3;p++) scanf("%d",p); n=0; for(p=mpq;p<mpq+3;p++) n+=*p; generare(sol); { clock_t start,end; start=clock(); delay(2000); end=clock(); printf("\n Timpul este %f \n", (end-start)/CLK_TCK); } getch();

3.Schema bloc
Afisare i i=0 i<n
sol[i]

Generare i, i=0
i<3 mpq[i ]>0 sol[k]=i k<n-1 generare(k+1) ++mpq[i] i++ afisare

i++

\n Sfarsit

Sfarsit

Void main

A n=0 i=0

m,p,q

i=0 i<3 i<3 n+=mpq[i] &mpq[i] i++

i++

generare(0);

Sfarsit

4.Rezultatul programului
Fara pointeri:

Cu pointeri:

5.Sarcina suplimentara:
Listingul programului:
#include <stdio.h> #include <conio.h> #include <ctype.h> char x[50],y[50]; // Sa se scrie o functie care concateneaza // sirul de caractere x la sfarsitul sirului // de caractere y, folosind pointeri void concat(char *x, char *y) { while (*y) y++; //parcurge sirul y pana la '0' while (*y++=*x++); //adauga sirul x la sfarsitul lui y } // Sa se scrie o functie care verifica // daca un sir de caractere x este sau nu // palindrom (citit de la stanga la dreapta // sau de la dreapta la stanga este acelasi lucru: ex. capac, cuc ) int palindrom(char *x) { char *p1,*p2; p1=x; for(p2=x;*p2;p2++); --p2; while(p1<p2) if(*p1!=*p2) return 0; else ++p1,--p2; return 1; } // Sa se scrie o functie care inlocuieste ultimul // caracter din sirul de caractere x cu primul // caracter din sirul de caractere y. void inlocuire(char *x, char *y) { while (*x)

x++; // parcurge sirul x pana la '\0' *(x-1)=*y; // inlocuieste ultimul caracter din x // cu primul caracter din y *x='\0'; // pune caracterul terminal in x } void main() {clrscr(); char *y,*x; printf("Introduceti sirul x: "); gets(x); printf("Introduceti sirul y: "); gets(y); printf("\nSirul x si sirul y concatenate:"); concat(x, y); printf("\n%s", y); if(palindrom(x)) printf("\nSirul x este palindrom"); else printf ("\nSirul x nu este palindrom"); if(palindrom(y)) printf("\nSirul y este palindrom"); else printf ("\nSirul y nu este palindrom"); printf("\nSir x in care ultimul caracter este inlocuit cu primul caracter din sirul y"); inlocuire(x, y); printf("\n%s", x); { clock_t start,end; start=clock(); delay(2000); end=clock(); printf("\n Timpul este %f \n", (end-start)/CLK_TCK); } getch(); }

Rezultatul executiei:

6.Concluzii:
Realizand lucrarea de laborator nr.1 am studiat notiunea de pointer, am realizat in mod traditional un program recursiv care permite sa se genereza toate sirurile de valori din multimea {0,1,2} in care 0 apare de m ori, 1 de p ori si 2 de q ori., unde m,p,q sunt valori introduse de la tastatura, apoi acelasi proggram l-am transcris utilizand pointeri. Am luat cunostinta despre modalitatile de declarare a pointerilor, despre operatiile care pot fi efectuate asupra variabilelor de tip pointer si despre modul de atribuire unui pointer o adresa si citrea unei valori din adresa pointerului.