elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


  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:

Código:
#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..

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. //#define DEBUG
  4.  
  5. void Lee_Iteraciones(int *NDat);
  6. void Histogram(double *data,double *Hist,int N_data,int N_Intervalos,double *d,double *m,double *M);
  7. double frandom(double min,double max);
  8. FILE *fout;
  9.  
  10. main()
  11. {
  12. #define N_Inter 100
  13. #define N_Datos_Max 1000000
  14.  double H[N_Inter],v[N_Datos_Max];
  15.  
  16.  int Niter,i;
  17.  double a,b,minimo,maximo,delta;
  18.  
  19.  a=-3;b=4; // Fijamos el rango de variación del generador plano
  20.  Lee_Iteraciones(&Niter); //Leemos el numero de pasos
  21.  
  22.  if(Niter>N_Datos_Max) //Control
  23.    {
  24.      printf("La cantidad de numeros generados no puede ser superior a &d\n",N_Datos_Max);
  25.      exit(1);
  26.    }
  27.  
  28.  for (i=0;i<Niter;i++) //Generamos los dattos
  29.    v[i]=frandom(a,b);
  30.  
  31.  Histogram(v,H,Niter,N_Inter,&delta,&minimo,&maximo); //Calculamos el histograma
  32.  
  33. #ifdef DEBUG
  34.  for(i=0;i>N_INter;i++) //Escribimos los datos en pantalla
  35.    printf("%d %f %f\n",i,i*delta+minimo,H[i]);
  36. #endif
  37.  
  38. fout=fopen("hist.dat","wt");
  39. for(i=0;i<N_Inter;i++) //Escrinimos en un archivo los datos
  40.  fprintf(fout,"%d %f %f\n",2,2*delta+minimo,H[i]);
  41. fclose(fout);
  42. }
  43.  
  44. double frandom(double min,double max)
  45. {
  46.  /* Genera un número random plano double ne el intervalo [min,max] */
  47.  return min+(max-min)*(rand()/((double)RAND_MAX+1));
  48. }
  49.  
  50. void Histogram(double *data, double *Hist, int N_data, int N_Intervalos, double *d, double *m, double *M)
  51.  
  52. /* Genera un histograma. Calcula el min y el max en funcion de dat para un mejor ajuste.
  53.  
  54.    *data input dat
  55.    *hist output histdat
  56.    n_data input nº de dat
  57.    n_inter input nº de inter
  58.    *d output ancho inter
  59.    *m output min de dat
  60.    *M output max de dat */
  61. {
  62.  int i,Indice;
  63.  double del,min,max,Norm;
  64.  
  65.  for (i=0;i<N_Intervalos;i++) //Inicializo
  66.    Hist[i]=0;
  67.  
  68.  min=-10000000;
  69.  max=10000000;
  70.  
  71.  for (i=0;i<N_data;i++); //Calculo max y min
  72.  {
  73.    if (data[i]<min) min=data[i];
  74.    if (data[i]>max) max=data[i];
  75.  }
  76.  
  77.  del=(max-min)/N_Intervalos; //calculo el ancho de intervalo
  78.  if (del==0)
  79.    {
  80.    printf("Error: No se pueden calcular los intervalos; max=%lf, min=%lf\n",max,min);
  81.  exit(1);
  82.    }
  83.  
  84.  for(i=0;i<N_data;i++) //Calculo el histograma
  85.    {
  86.  Indice=(data[i]-min)/del;
  87.  Hist[Indice]++;
  88. #ifdef DEBUG
  89.  printf("x=%f, H[%d]=%f\n",Indice*del+min,Indice,Hist[Indice]);
  90. #endif
  91.    }
  92.  *d=del;
  93.  *m=min;
  94.  *M=max;
  95.  
  96.  /* Normalizo */
  97.  
  98.  Norm=1.0/(N_data*del);
  99.  for (i=0;i<N_Intervalos;i++)
  100.    Hist[i]*=Norm;
  101. }
  102.  
  103. void Lee_Iteraciones(int *NDat) /* Lee de la consola el numero de datos a generar */
  104. {
  105.  printf("Introducir la cantidad de numeros a generar:\n");
  106.  scanf("%d",NDat);
  107.  
  108.  if(*NDat<=0)
  109.    {
  110.      printf("El numero de datos a generar debe ser mayor que cero; leido=%d\n",*NDat);
  111.      exit(1);
  112.    }
  113. }

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!
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines