De ce nu-mi afiseaza programul media aritmetica ?
#include
#include
int* citire_vector(int *dim);
int* media_aritmetica(int *dim,int x[]);
int main()
{
char c;
int n,*v,*media;
printf("Aplicatii menu...\n");
do
{
system("cls");
printf("C. Citire vector (dinamic)\n");
printf("M. determinare medie aritmetică a elementelor din vector.\n");
c=getch();
c=toupper(c);
switch(c)
{
case 'C':
v=citire_vector(&n);
getch();
break;
case 'M':
media=media_aritmetica(n,v);
getch();
break;
}
}
while(1);
return 0;
}
int* citire_vector(int *dim)
{
int i, *x;
printf("Dati numarul de elemente:");
scanf("%d", dim);
x = (int*)malloc(sizeof(int)*(*dim));
if(x==NULL)
{
printf("Eroare la alocare memoriei...");
return;
}
printf("Introduceti elementele vectorului:\n");
for(i=0; i<*dim; i++)
{
printf("x[%d]=",i);
scanf("%d",&x[i]);
}
return x;
}
int* media_aritmetica(int *dim,int x[])
{
int i,s=0,nr=0,ma;
for(s=0,i=0;i
{
s+=x[i];
nr++;
}
ma=s/nr;
return ma;
}
Răspunsuri la întrebare
[-] De ce programul nu merge ?
In primul rand "for(s=0,i=0;i { " nu este cod valid C. Poate vrei sa spui "for (i = 0; i<dim; i++){".
In al doilea rand, in forma curenta, functia returneaza un pointer. Noi vrem sa returnam valoarea, nu pointer. Probabil dorim sa returnam chiar un float, media aritmetica e de cele mai multe ori o valoarea reala.
In al treilea rand, vrem sa primim dimensiunea vectorului dim ca valoare, nu prin pointer. In cazul de fata nu avem nevoie sa modificam dimensiunea ca sa transmitem ca pointer. Daca tot avem dimensiunea vectorului, putem sa o folosim pe aceasta in loc sa determinam cu for numarul de elemente.
In al patrulea rand, o sa avem memory leak, in nicun moment nu se realizeaza dealocarea vectorului. Ar trebui sa dealocam memoria atunci cand se citeste un vector nou si atunci cand se realizeaza iesirea din program.
In al cincilea rand, chiar daca se realizeaza media aritmetica nu e afisata nicaieri.
[-] Model functional (desi nerecomandat din cauza problemelor de memory leak)
#include <stdio.h>
int* citire_vector(int* dim);
float media_aritmetica(int dim, int x[]);
int main()
{
char c;
int n=0, *v=NULL;
float media;
printf("Aplicatii menu...\n");
do
{
system("cls");
printf("C. Citire vector (dinamic)\n");
printf("M. determinare medie aritmetica a elementelor din vector.\n");
c = getch();
c = toupper(c);
switch (c)
{
case 'C':
v = citire_vector(&n);
getch();
break;
case 'M':
media = media_aritmetica(n, v);
printf("\nMedia aritmetica este %f", media);
getch();
break;
}
} while (1);
return 0;
}
int* citire_vector(int* dim)
{
int i, * x;
printf("Dati numarul de elemente:");
scanf("%d", dim);
x = (int*)malloc(sizeof(int) * (*dim));
if (x == NULL)
{
printf("Eroare la alocare memoriei...");
return;
}
printf("Introduceti elementele vectorului:\n");
for (i = 0; i < *dim; i++)
{
printf("x[%d]=", i);
scanf("%d", &x[i]);
}
return x;
}
float media_aritmetica(int dim, int x[])
{
int i, s = 0;
float ma;
for (i = 0; i < dim; i++) {
s += x[i];
}
ma = (float)s / dim;
return ma;
}