Sunteți pe pagina 1din 14

Ministеrul Еducаțiеi, Culturii și Cеrcеtării аl Rеpublicii Mоldоvа

Univеrsitаtеа Tеhnică а Mоldоvеi


Fаcultаtеа Cаlculаtоаrе, Infоrmаtică şi Micrоеlеctrоnică
Dеpаrtаmеntul Ingineria Software și Automatică

RAPORT

Lucrarea de laborator Nr.1


la disciplina Structuri de date și algoritmi

VARIANTA 1-73

A efectuat: st.gr.TI-194
Ciobanu Cristina
A verificat: asist.univ.
Ursu Adriana

CHIŞINĂU – 2020
Tema: Analiza eficienţei prelucrării structurilor de date cu pointeri

Scopul lucrării: 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.
Obiectivele lucrării: Aprecierea personală a nivelului de cunoaştere a următoarelor
compartimente:
- a analizei algoritmilor şi a specificului organizarii programelor cu si fără pointeri
(declarări şi parcurgeri cu pointeri).
- a tehnicilor de programare şi principiilor de elaborare a modelelor de calcul.
PARTEA PRACTICĂ
Exercițiul 1: Analizati efectele utilizarii pointerilor la inversarea ordinii de apariţie a
elementelor unui şir.
Listing-ul programului:
#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 <
p_fin; p_init++) {
printf("\n %d", *p_init);
}
}

Rezultatele obținute:
Exercițiul 11: Programul de mai jos citeste si afiseaza elementele a doua tablouri, la primul
accesul se face indexat, la al doilea prin pointeri.   Rulaţi, afişaţi şi analizaţi

Listing-ul programului:
#include <stdio.h>
#include <conio.h>
#define N 5
int tab1[N], tab2[N];
void citire1(void) /* citeste elementele lui tab1 prin accesarea indexata a
elementelor */
{
int i;
puts("Introduceti elementele lui tab1:");
for(i = 0; i < N; i++) {
putchar(':'); /* citire1 */
scanf("%d", &tab1[i]);
} /*for i*/
}
void tiparire1(void) /* tipareste elementele lui tab1 prin accesarea indexata
a elementelor */
{
int i;
puts("Elementele lui tab1:");
for(i = 0; i < N; i++) {
printf("%d ", tab1[i]); /* tiparire1 */
}
putchar('\n');
}
void citire2(void) /* citeste elementele lui tab2 - accesarea fiecarui
element se face printr-un pointer la el */
{
int *pi;
puts("Introduceti elementele lui tab2:");
for(pi = tab2; pi < tab2 + N; pi++) {
/* initializari echivalente sunt pi=&tab2

sau pi=&tab[0]; conditie echivalenta pi<=&tab2[N-1] */


putchar(':');
scanf("%d", pi);
} /*for pi*/
} /* citire2 */
void tiparire2(void) /* tipareste elementele lui tab2 prin accesare la
pointeri */
{
int *pi;
puts("Elementele lui tab2:");
for(pi = tab2; pi < tab2 + N; pi++) {
printf("%d ", *pi); /* tiparire2 */
}
putchar('\n');
}
void main(void) { citire1(); tiparire1(); citire2(); tiparire2();
getche(); }

Rezultatele obținute:

Exercițiul 57: Rulaţi, afişaţi şi analizaţi. Matrice alocata dinamic (cu dimensiuni cunoscute la
executie)

Listing-ul programului:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n, i, j;
int ** mat; // adresa matrice
// citire dimensiuni matrice<
printf("n=");
scanf("%d", &n);
// alocare memorie ptr matrice
mat = (int **) malloc(n * sizeof(int*));
for(i = 0; i < n; i++) {
mat[i] = (int*) calloc(n, sizeof(int));
}
// completare matrice
for(i = 0; i < n; i++)
for(j = 0; j < n; j++) {
mat[i][j] = n * i + j + 1;
}
// afisare matrice
for(i = 0; i < n; i++) {
for(j = 0; j < n; j++) {
printf("%6d ", mat[i][j]);
}
printf("\n");
}
return 0;
}

Rezultatele obținute:

Exercițiul 59: Modificaţi programul prin parcurgeri de pointeri şi cu pointeri la pointeri


(indirectare multipla). Apoi Rulaţi, afişaţi şi analizaţi
Listing-ul programului:
#include <conio.h>;
#include <stdio.h>;
#include <stdlib.h>;
void main()
{
int *p, *a, i, j, n, k, s, l;
char ch;
printf("Indicati dimensiunea matricei:");
scanf("%d", &n);
a = (int *) malloc(n * n); //Alocarea dinamica a memoriei
p = a; // pointu p se initializeaza cu pointu a
for(i = 0; i < n; i++)
for(j = 0; j < n; j++) {
printf("a[%d,%d]=", i + 1, j + 1);
scanf("%d", p++);
} //Se introduce valori in pointu p si pointu p intorudce valorile in
pointu a
while(1) {

printf("1 - afisarea elementelor prime\n");


printf("2 - suma elementelor impare\n");
printf("3 - frecventa elementului indicat\n");
printf("4 - iesire\n");
ch = getche();
switch(ch) {
case '1' :
printf("Elementele matricei sunt:\n");
p = a; //initializarea pointurului p cu a
for(i = 0; i < n; i++) {
for(j = 0; j < n; j++)
{ printf(" %d", *p++); }
printf("\n");
} // afisharea valorilor din point
printf("Elementele prime ale liniilor impare sunt:\n");
p = a; // Initializam pointu p cu pointu a
for(i = 0; i < n; i += 2) {
for(j = 0; j < n; j++) {
k = 1;
s = 0;
while(k <= *p && *p != 0) {
if(*p % k == 0) { s++; } //daca valoarea pointului p la
impartire cu k =0
k++;
}
if(s == 2 || *p == 1) //daca cointu p =1
{ printf(" %d", *p); }
p++;
} // afisharea valoarea pointului p
p += n;
}
getch();
break;
case '2' :

printf("Elementele maricei sunt:\n");


p = a; //initializam pointu p cu pointu a
for(i = 0; i < n; i++) {
for(j = 0; j < n; j++)
{ printf(" %d", *p++); }
printf("\n");
} // afisham valorile pointului p
printf("Suma elementele impare ale coloanelor pare sunt:\n");
s = 0;
p = a; //Initializam pointu cu poinru a
for(i = 0; i < n; i++)
for(j = 1; j < n; j += 2)
if(*(p + i * n + j) % 2 == 1) //daca valoarea p[i][j]/2==1
{ s += *(p + i * n + j); } //la s se adauga valoarea p[i][j]

printf("s=%d", s);
getch();
break;

case '3' :

printf("Elementele maricei sunt:\n");


p = a;
for(i = 0; i < n; i++) {
for(j = 0; j < n; j++)
{ printf(" %d", *p++); }
printf("\n");
}//afisez valoarea pointului
printf("Indicati numarul la care doriti sa aflati frecventa: ");
scanf("%d", &k);
s = 0;
p = a; // initializarea pointului p cu poitu a
if(n % 2 == 0)
{ l = n / 2 - 1; }
else {
l = n / 2;
}

for(i = 0; i < l; i++)


for(j = i + 1; j < n - i - 1; j++)
if(*(p + i * n + j) == k) {
s++; //daca pointu p[i][j]=k
}
printf("\n Frecventa in cadranul 1 este: %d", s);
s = 0;
for(i = n / 2 + 1; i < n; i++)
for(j = i - 1; j >= n - i; j--)
if(*(p + i * n + j) == k) {
s++; //daca pointu p[i][j]=k
}
printf("\n Frecventa in cadranul 3 este: %d", s);
getch();
break;
case '4' :
getch();
exit(1);
break;
default:
printf("\nTastati intre 1 si 3 !\n");
getch();
}
}
}

Rezultatele obținute:
Exercițiul 61: Analizati efectele utilizarii funcţiilor de caractere prin precizarea valorilor care
se afiseaza pe ecran la executia programului:

Listing-ul programului:
#include <stdio.h>
int a[5][5]; int b[25]; int i, j;
void f1(void)
{
int q = 0, w = 0;
printf("introduceti vectorul");
while(i < 25) {
scanf("%d", &b[i]);
i++;
}
for(i = 0; i < 25; i++) {
a[q][w] = b[i];
if(w < 4) {
w++;
} else if(q < 4) {
q++;
w = 0;
}
}
printf("matricea obtinută din vector este:");
for(i = 0; i < 5; i++) {
printf("\n");
for(j = 0; j < 5; j++) {
printf(" %d ", a[i][j]);
}
}
exit(1);
}
void f2(void)
{
int k = 0;
char t = 0;
for(i = 0; i < 5; i++)
for(j = 0; j < 5; j++) {
scanf("%d", &a[i][j]);
}
for(i = 0; i < 5; i++)
for(j = 0; j < 5; j++) {
b[k] = a[i][j];
k++;
}
printf("vectorul primit din matrice e:");
for(i = 0; i < k; i++) {
printf(" %d \n", b[i]);
}
}
main()
{
printf("1:matrice->vector\t2:vector->matrice\n");
if(getchar() == '2') {
f1();
} else {
f2();
}
}

Rezultatele obținute:

Exercițiul 65: Da-ţi la execuţie şi analizaţi modul de organizare şi obţinere a rezultatelor ,


afisind fiecare pas (linie)
Listing-ul programului:
#include<stdio.h>
#include<conio.h>
int a;
int *pa;
int **ppa;
int ***pppa;
int ****ppppa;
int *****pppppa;
void main()
{

a = 33;
pa = &a;
ppa = &pa;
pppa = &ppa;
ppppa = &pppa;
pppppa = &ppppa;
printf("\n%d", *****pppppa);
getch();
}
Rezultatele obținute:

Exercițiul 67: : Da-ţi la execuţie şi analizaţi modul de organizare şi obţinere a rezultatelor .


Listing-ul programului:
#include<stdio.h>
#include<conio.h>
typedef char* f();
f *a[2][2];//o matrice de pointeri spre functii
char *s;
char *f1() { return "functia1"; }
char* f2() { return "functia2"; }
char* f3() { return "functia3"; }
char* f4() { return "functia4"; }
void main()
{
a[0][0] = f1;
a[0][1] = f2;
a[1][0] = f3;
a[1][1] = f4;
for(unsigned char i = 0; i < 2; i++)
for(unsigned char j = 0; j < 2; j++) {
s = a[i][j]();
printf("\n %s", s);
}
getch();
}

Rezultatele obținute:
Exercițiul 69: : Da-ţi la elaboraţi şi analizaţi modul de organizare a parcurgerii şi obţinere a
rezultatelor, afişând toate valorile. Face-ţi îmbunătăţiri şi rulaţi din nou. Comparaţi.

Listing-ul programului:
#include <stdio.h>
#include <math.h>
#define N 50
double f(double x);
double SumaPatrateFunctii(double (*f)(double), double x[], int n);
void main()
{
double x, tab[50], pas = 2 * M_PI / N, s1, s2;
int i;
for(i = x = 0; i < N ; x += pas) {
tab[i++] = x;
}
s1 = SumaPatrateFunctii(sin, tab, N);
s2 = SumaPatrateFunctii(f, tab, N);
printf("\nS1=%lf \nS2=%lf", s1, s2);
}
//---------------------------------------------------------------
double SumaPatrateFunctii(double (*f)(double), double x[], int n)
{
double sumap = 0;
for(n--; n >= 0; n--) {
sumap += f(x[n]) * (*f)(x[n]);
}
return sumap;
}
//----------------------------------------------------------------
double f(double x) { return 1. / (x + 1); }

Rezultatele obținute:
CONCLUZIE
Lucrarea de laborator nr.1 reprezintă o apreciere personală a nivelului de cunoaștere a analizei
algoritmilor și a specificului organizării programelor cu și fără pointeri. În timpul efectuări sarcinilor
propuse, am rulat mai multe programe pentru a înțelege cum declarăm sau parcurgem pointeii, însă
nu toate programele puteau fi rulate din cauza erorilor multiple. Spre exemplu itemii 3, 11 care are
33 erori, 21-10 erori, ,23-25 erori, 25-3 erori, 27-7erori, 37-erori, 39-erori, 41- cod nefinalizat, 45,
47, 49, 51, 53,55, 63, 71, 73, la fel au o multime de erori.. Am introdus datele inițiale de la tastatură
și am afișat rezultatele obținute pe ecran. Am căpătat cunoștințe asupra tehnicilor de programare şi
principiilor de elaborare a modelelor de calcul.

BIBLIOGRAFIE:
1. Lucrari de laborator nr 1. Ștefan Marin.

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