Autor
|
Tema: Creando una función para hallar la media y la desviación (Leído 3,538 veces)
|
Schrödinger
Desconectado
Mensajes: 9
|
Quiero hacer un programa que genere N floats uniformemente distribuidos en un intervalo dado y que calcule la media y la dispersión mediante una función. El código es el siguiente: #include <stdio.h> #include <stdlib.h> #define DEBUG int N; FILE *fout;
void med_var(float *serie, int Numero, float *Media, float *Varianza) { int i; for(i=0;i<Numero;i++) { *Media+=serie[i]; } *Media=*Media/Numero; for(i=0;i<Numero;i++) { *Varianza+=serie[i]*serie[i]; } *Varianza=*Varianza/Numero; *Varianza=*Varianza-(*Media)*(*Media); printf("Media=%f, Varianza=%f\n",*Media,*Varianza); }
float frandom(double min, double max) { return min+(max-min)*(rand()/((double)RAND_MAX+1)); }
main(argc,argv) int argc; char **argv; { switch(argc) { case 2: sscanf(argv[1],"%d",&N); break; default: N=100; } int i; float med,var,data[N];
printf("%d\n",N); fout=fopen("datos.dat","wt");
for(i=0;i<N;i++) { data[i]=frandom(-2,5); }
#ifdef DEBUG for(i=0;i<N;i++) { printf("data[%d]=%f\n",i,data[i]); } #endif
med_var(data,N,&med,&var);
fprintf(fout,"\n%d %f %f",N,med,var); fclose(fout); }
Compila sin problemas pero los valores para la media y la varianza son incorrectos. El caso es que en una versión anterior del programa en la cual N no estaba pillado de la consola al menos la media funcionaba. ¿Alguna pista?
|
|
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
El problema se debe a la declaración de la variable "data": int N; /* ... */ float med,var,data[N];
Un array declarado en esa forma se conoce como array de longitud variable o VLA, los dolores de cabeza surgen por el soporte variado de estos en los distintos estándares de C: A) En C90 los VLAs no son validos. B) En C99 los VLAs son validos. C) En C11 los VLAs son validos pero su soporte es opcional. Para que el programa funcione correctamente debes verificar que tu compilador soporte el estándar C99 (y por supuesto que se compile en ese modo). Por ello es mejor, en mi opinión, reservar memoria de forma dinámica. Mas o menos así: int N; /* ... */ /* 1) Declaracion del puntero */ float med,var,*data; /* 2) Reserva de memoria */ data = malloc(N * sizeof *data ); /* ... */ /* Cuando ya no sea necesaria la memoria se libera */
Por ultimo tienes que cambiar la definicion de la funcion main. Un saludo
|
|
|
En línea
|
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
Quiero hacer un programa que genere N floats uniformemente distribuidos en un intervalo dado y que calcule la media y la dispersión mediante una función ...............................................................
Compila sin problemas pero los valores para la media y la varianza son incorrectos. El caso es que en una versión anterior del programa en la cual N no estaba pillado de la consola al menos la media funcionaba.
¿Alguna pista?
El problema radica, con permiso de rir, en que no inicializas las variables *media=0 y *varianza=0 antes de los correspondientes for. A mí, con esta pequeñísima corrección, me ha funcionado bien, creo.
Saluditos!. ......
|
|
« Última modificación: 14 Mayo 2013, 19:21 pm por leosansan »
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
El problema radica, con permiso de rir, en que no inicializar las variables *media=0 y *varianza=0 antes de los correspondientes for. Tienes razón, no era un problema sino dos (el uso del VLA y las dos variables sin inicializar). ¿O son tres? Lo menciono porque: 1) Debido a que la definición de la función main omite el tipo de retorno no se puede compilar como C99 (no seria valido). 2) La declaración del array "data" requiere compilar como C99. ... Un saludo
|
|
|
En línea
|
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
Tienes razón, no era un problema sino dos (el uso del VLA y las dos variables sin inicializar).
¿O son tres? Lo menciono porque:
1) Debido a que la definición de la función main omite el tipo de retorno no se puede compilar como C99 (no seria valido).
2) La declaración del array "data" requiere compilar como C99.
...
Ya sé que main debería ser declarado como int y que el uso de VLAs da problemas al no estar implementado en algunos compiladores, sin embargo en ese caso lo mejor es cambiar de compilador a uno más "funcional". En mi caso con Code::Blocks no he tenido problema alguno ni con main ni con los VLAs, que utilizo frecuentemente sin problemas.
Vamos que si el compilador "no tira" por falta de implementación de ciertas funcionalidades del C99 sencillamente cambiaría de compilador.
Saluditos!. .....
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
error en hallar media
Programación C/C++
|
kiara_luna
|
0
|
1,680
|
28 Agosto 2011, 17:54 pm
por kiara_luna
|
|
|
Escaneado el cerebro de estudiantes MBA para hallar los atributos de un líder
Noticias
|
wolfbcn
|
2
|
2,626
|
11 Mayo 2012, 22:18 pm
por Jenag
|
|
|
Ayuda en C++ Código que Calcule la Desviación Estándar?
Programación C/C++
|
sendwuk
|
2
|
15,309
|
28 Marzo 2015, 15:17 pm
por Usuario Invitado
|
|
|
calcular la desviacion estandar de un arreglo (problema)
Programación C/C++
|
Yamakasi_Jr
|
1
|
11,424
|
28 Agosto 2017, 04:50 am
por A.I.
|
|
|
Ayuda para sacar la desviación estándar
Programación C/C++
|
lonelym29
|
1
|
3,338
|
11 Febrero 2020, 09:13 am
por CalgaryCorpus
|
|