Sunteți pe pagina 1din 5

Alocare dinamică – exemple

1. Să se scrie programul pentru determinarea poziţiei tuturor apariţiilor unei valori date într-un vector
neordonat, de dimensiune n.

Atât vectorul iniţial, cât şi vectorul de poziţii vor fi alocaţi dinamic. Vectorul se parcurge secvenţial cu ajutorul
instrucţiunii for, reţinând valoarea curentă a indicelui în cazul identităţii elementului cu valoarea căutată, într-un
vector de poziţii.

#include<stdio.h>

#include<stdlib.h>

void main()

float *x, a; int n,i, *poz, nrpoz;

printf("Introduceti dimensiunea vectorului, n=");

scanf("%d",&n);

x=(float*)malloc(n*sizeof(float));

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

{printf("x[%d]=",i); scanf("%f", x+i);}

printf("Introduceti valoarea cautata:");scanf("%f", &a);

poz=(int*)malloc(n*sizeof(int));

nrpoz = 0;

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

if(x[i] == a) poz[nrpoz++] = i;

if(!nrpoz)printf("Valoarea %5.2f nu exista in vector.", a);

else

{printf("Valoarea %5.2f apare pe pozitiile: ",a);

for(i=0;i<nrpoz;i++)printf("%d; ", poz[i]);}

free(x);

free(poz);

2. Fie un masiv bidimensional de numere reale, reprezentând consumul de carburant înregistrat de m maşini
într-o perioadă de n zile. Să se scrie un program pentru determinarea numărului maşinilor care au
consumuri în ordine strict crescătoare. Masivul este alocat dinamic.
#include <stdio.h>

#include <stdlib.h>

void main()

{ int m,n,i,j,nr;

float **a;

printf("numarul de linii=");scanf("%d",&m);

printf("numarul de coloane=");scanf("%d",&n);

a=(float**)malloc(m*sizeof(float*));

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

a[i]=(float*)malloc(n*sizeof(float));

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

for (j=0;j<n;j++)

{printf("a[%d][%d]=",i,j);

scanf("%f",&a[i][j]);}

printf("Matricea este\n");

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

{ for (j=0;j<n;j++)printf("%5.2f ",a[i][j]);

printf("\n");

nr=0;

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

{ j=0;

while(j<n-1 && a[i][j]< a[i][j+1]) j++;

if (j==n-1) nr=nr+1;

printf("numarul liniilor cu elementele in ordine strict crescatoare este =


%d",nr);

for (i=0;i<m;i++) free(a[i]);

free(a);

}
Subprograme - exemple

1. Fie un vector reprezentând vânzările valorice înregistrate de o societate comercială într-o perioadă de n zile.
Să se scrie subprogramul C (precum şi programul apelator) care calculează valoarea medie a vânzărilor,
eliminând din calculul mediei zilele care nu au înregistrat vânzări.

Transferul datelor se va realiza exclusive prin parametri. Operaţia de citire şi afişare a unui vector se realizează prin
intermediul subprogramelor.

#include<stdio.h>

//citire vector cu returnarea numarului de elemente prin parametru

void citire(float x[], int *n){

int i;

printf("n="); scanf("%d", n); //scanf(“%d”, &*n);

for (i=0;i<*n;i++) {

printf("x[%d]=",i);scanf("%f", &x[i]);

//afisarea elementelor dintr-un vector

void afisare(float x[], int n){

int i;

for(i=0;i<n;i++)printf("%5.2f;", x[i]);

/*subprogramul are ca parametri adresa vectorului, numărul de elemente si


adresa unde se va scrie media*/

void medie(float x[], int n, float *med){

int i,k;

k=0; *med=0;

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

if(x[i]!=0){*med+=x[i];k++;}

if(k)*med/=k;

void main(){

float v[100], medv; int n;

citire(v,&n);

medie(v,n,&medv);

printf("Vanzarile zilnice sunt:");


afisare(v,n);

if(medv)printf("\nMedia vanzarilor este: %5.2f", medv);

else printf("\nSocietatea nu a inregistrat vanzari");

2. Fie un masiv bidimensional de numere reale reprezentând valoarea convorbirilor telefonice a m abonaţi
într-o perioadă de n luni. Să se scrie un subprogram pentru a determina numărul abonaţilor care au
înregistrat valori constante pentru cele n luni, precum și programul apelator.

#include <stdio.h>

void citire_mat(float a[][20], int *m, int *n)

{ int i,j;

printf("numarul de linii=");scanf("%d",m);

printf("numarul de coloane=");scanf("%d",n);

for (i=0;i<*m;i++)

for (j=0;j<*n;j++)

{ printf("a[%d][%d]=",i,j);

scanf("%f",&a[i][j]);

void afisare_mat(float a[][20], int m, int n)

{ int i,j;

printf("Matricea este\n");

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

{for (j=0;j<n;j++)printf("%5.2f ",a[i][j]);

printf("\n");

void nr_lin_const_var1(float a[][20], int m, int n, int *nr)

{ int i,j,ok;

*nr=0;

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

{ j=1;

while (j<n && a[i][0]==a[i][j])j++;

if (j==n) (*nr)++;

}
}

void main()

{ int m,n,i,j,numar1;

float a[30][20];

citire_mat(a,&m,&n);

afisare_mat(a,m,n);

nr_lin_const_var1(a,m,n,&numar1);

printf("numarul liniilor cu elementele constante este = %d",numar1);

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