|
Mostrar Temas
|
Páginas: [1]
|
1
|
Programación / Programación C/C++ / Creando una función para hallar la media y la desviación
|
en: 13 Mayo 2013, 19:24 pm
|
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?
|
|
|
2
|
Programación / Programación C/C++ / Error al ejecutar un programa en C que he compilado [Windows 8]
|
en: 3 Abril 2013, 18:17 pm
|
Pues he repasado el código unas cuantas veces y creo que está perfecto, no obstante en cuanto ejecuto el programa ejecutable, bien desde consola o haciendo doble click, me sale la ventanita de "ha dejado de funcionar". Os dejo el código, pero yo creo que debe ser algún tema de compatibilidad o algo.. #include <stdio.h> #include <stdlib.h> //#define DEBUG void Lee_Iteraciones(int *NDat); void Histogram(double *data,double *Hist,int N_data,int N_Intervalos,double *d,double *m,double *M); double frandom(double min,double max); FILE *fout; main() { #define N_Inter 100 #define N_Datos_Max 1000000 double H[N_Inter],v[N_Datos_Max]; int Niter,i; double a,b,minimo,maximo,delta; a=-3;b=4; // Fijamos el rango de variación del generador plano Lee_Iteraciones(&Niter); //Leemos el numero de pasos if(Niter>N_Datos_Max) //Control { printf("La cantidad de numeros generados no puede ser superior a &d\n",N_Datos_Max ); } for (i=0;i<Niter;i++) //Generamos los dattos v[i]=frandom(a,b); Histogram(v,H,Niter,N_Inter,&delta,&minimo,&maximo); //Calculamos el histograma #ifdef DEBUG for(i=0;i>N_INter;i++) //Escribimos los datos en pantalla printf("%d %f %f\n",i ,i *delta +minimo ,H [i ]); #endif fout =fopen("hist.dat","wt"); for(i=0;i<N_Inter;i++) //Escrinimos en un archivo los datos fprintf(fout ,"%d %f %f\n",2,2*delta +minimo ,H [i ]); } double frandom(double min,double max) { /* Genera un número random plano double ne el intervalo [min,max] */ return min +(max -min )*(rand()/((double)RAND_MAX +1)); } void Histogram(double *data, double *Hist, int N_data, int N_Intervalos, double *d, double *m, double *M) /* Genera un histograma. Calcula el min y el max en funcion de dat para un mejor ajuste. *data input dat *hist output histdat n_data input nº de dat n_inter input nº de inter *d output ancho inter *m output min de dat *M output max de dat */ { int i,Indice; double del,min,max,Norm; for (i=0;i<N_Intervalos;i++) //Inicializo Hist[i]=0; min=-10000000; max=10000000; for (i=0;i<N_data;i++); //Calculo max y min { if (data[i]<min) min=data[i]; if (data[i]>max) max=data[i]; } del=(max-min)/N_Intervalos; //calculo el ancho de intervalo if (del==0) { printf("Error: No se pueden calcular los intervalos; max=%lf, min=%lf\n",max ,min ); } for(i=0;i<N_data;i++) //Calculo el histograma { Indice=(data[i]-min)/del; Hist[Indice]++; #ifdef DEBUG printf("x=%f, H[%d]=%f\n",Indice *del +min ,Indice ,Hist [Indice ]); #endif } *d=del; *m=min; *M=max; /* Normalizo */ Norm=1.0/(N_data*del); for (i=0;i<N_Intervalos;i++) Hist[i]*=Norm; } void Lee_Iteraciones(int *NDat) /* Lee de la consola el numero de datos a generar */ { printf("Introducir la cantidad de numeros a generar:\n"); if(*NDat<=0) { printf("El numero de datos a generar debe ser mayor que cero; leido=%d\n",*NDat ); } }
Editado: añadido el coloreado de código.
|
|
|
3
|
Programación / Programación C/C++ / Undefined reference to 'WinMain@16'
|
en: 26 Febrero 2013, 21:34 pm
|
Buenas a todos, estoy haciendo un programita en C y a la hora de compilar me da el error que da título al post. He estado buscando por la red y parece ser que ese error ocurre cuando está mal definido el main. El caso es que he repasado el codigo unas cuantas veces y no encuentro nada. Os lo pego a ver si podéis echarle un vistazo.
#include <stdio.h> #include <stdlib.h> //#define debug //saca datos por pantalla FILE *fout;
double frandom(double min, double max) //FUNCION GENERAR RANDOM { /*Genera un número double random en el intervalo [min,max] */
return min+(max-min)*rand()/((double)RAND_MAX+1)); }
// FIN DE FUNCION GENERAR RANDOM
void histogram(double *dat, double *hist, int n_dat, int n_inter, double *d, double *m, double *M) //FUNCION HISTOGRAMA { /* Genera un histograma. Calcula el min y el max en funcion de dat para un mejor ajuste.
*data input dat *hist output histdat n_data input nº de dat n_inter input nº de inter *d output ancho inter *m output min de dat *M output max de dat */
int i,k; double anch,min,max,norm;
for (i=0;i<n_inter;i++) //Inicializo hist=0;
min=-10000000; max=10000000;
for (i=0;i<n_dat;i++); //Calculo max y min { if (dat<min) min=dat; if (dat>max) max=dat; }
anch=(max-min)/n_inter; //calculo el ancho de intervalo
if (anch==0) //¿problemas de redondeo? { printf("Error: No se pueden calcular los intervalos; max=%lf, min=%lf\n",max,min); exit(1); }
for(i=0;i<n_dat;i++) //Calculo el histograma { k=(dat-min)/anch; hist[k]++; #ifdef DEBUG //Saca datos por pantalla printf("x=%f, H[%d]=%f\n",k*anch+min,k,hist[k]); #endif }
*d=anch; *m=min; *M=max;
norm=1,0/(n_dat*anch); for (i=0;i<n_inter;i++) hist*=norm; }
//FIN DE FUNCION HISTOGRAMA
void main(void) { #define PAS_MAX 100000 //defino nº de pasos máximo #define n_inter 100 //defino el numero de intervalos
float min, max, pas, epsilon, delta,ini; double dat[PAS_MAX+1], hist[ninter]; int i;
printf("Dame el min:\n"); //defino el rango y la posición inicial scanf("%f",&min); printf("Dame el max:\n"); scanf("%f",&max); printf("Dame el ini:\n"); scanf("%f",&ini);
if (ini>max) //compruebo que la posición inicial esté dentro del rango { printf("Demasiado grande.\n"); exit(0); } else if (ini<min) { printf("Demasiado pequeno.\n"); exit(0); }
dat[0]=ini; //¡La posición inicial es un dato válido! epsilon=(max-min)/100; //Preguntar dudas sobre el tamaño en relación al número de pasos, rango e histograma
printf("Dame el numero de pasos:\n"); scanf("%f",&pas);
if (pas>PAS_MAX) { printf("Demasiados pasos.\n"); exit(0); }
for (i=1;i<pas;i++) //genero número aleatorio, calculo la nueva posición y la mando a la función histograma { delta=frandom(-epsilon,epsilon); ini=ini+delta; if (ini>max) //Soluciono el problema de los bordes ini=ini-max+min; else if (ini<min) ini=ini-min+max; dat=ini; } /* for (i=0;i<pas;i++) printf("%f\n",dat); */
histogram(dat,hist,pas+1,ninter,&anch,&min,&max); //Calculo del histograma
#ifdef DEBUG //Escribo datos por pantalla en modo DEBUG for(i=o;i<n_inter;i++) printf("%d\t %f\t %f\n",i,i*anch+min,hist); #endif
fout=fopen("hist.dat","wt"); //Abro el archivo, escribo los datos y lo cierro for (i=0;i<n_inter;i++) fprintf(fout,"%d\t %f\t %f\n",i,i*anch+min,hist); fclose(fout);
}
|
|
|
4
|
Programación / Programación C/C++ / Problemas con MinGW-w64 en Windows 8 x64 (¿error en el PATH?)
|
en: 22 Febrero 2013, 14:08 pm
|
Saludos a todos,
He instalado MinGW-64 (mingw-w64-bin_i686-mingw_20111220) en mi Windows 8 x64 para programar en C utilizando Emacs (emacs-24.2-bin-i386). Está instalado en C:\mingw64 por lo que antes de utilizarlo he ido a panel de control:variables de entorno:avanzado y he modificado path añadiendo "....;C:\mingw64\bin;"
Luego entro en cmd.exe, voy al directorio donde tengo mi archivo.c y ejecuto gcc archivo.c -o archivo.exe Y me da el clásico error de gcc comando no reconocido. He probado a reinstalar, utilizar g++ como comando, modificar el path desde consola... y nada. Estoy ya bastante desesperado así que toda ayuda será bien recibida.
Un saludo y gracias!
|
|
|
|
|
|
|