Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Ayuda super urgente!

Estas en el tema de Ayuda super urgente! en el foro de C/C++ en Foros del Web. Necesito ayuda superurgente. Código: #include <stdio.h> #include <stdlib.h> int a,c,X,M,n,U; short i; char nombre_fichero[20]; FILE* pf; int main(int argc, char *argv[]) { printf(" Para generar ...
  #1 (permalink)  
Antiguo 29/05/2008, 11:10
 
Fecha de Ingreso: abril-2008
Mensajes: 19
Antigüedad: 16 años, 1 mes
Puntos: 0
Ayuda super urgente!

Necesito ayuda superurgente.

Código:
#include <stdio.h>
#include <stdlib.h>


   int a,c,X,M,n,U;
   short i;
   char nombre_fichero[20];
   FILE* pf;


int main(int argc, char *argv[])
{
    

printf("               Para generar n numeros aleatorios,\n");
printf("             por elmetodo de congruencial lineales\n\n\n");     
    
    // entrada de datos
    
    printf("Introduce a\n");
    printf("-> ");
    scanf("%d",&a);
    printf("Introduce c\n");
    printf("-> ");
    scanf("%d",&c);
    printf("Introduce M\n");
    printf("-> ");
    scanf("%d",&M);
    printf("Introduce semilla\n");
    printf("-> ");
    scanf("%d",&X);
    do{
    printf("Introduce cuantos numeros quieres obtener?\n");
    printf("-> ");
    scanf("%d",&n);
    }while(n>1000);
    printf("En que fichero lo guardo?\n");
    printf("-> ");
    scanf("%s", &nombre_fichero);
   
   // codigo 
   
    if((pf = fopen(nombre_fichero, "w+"))==NULL)
    {
    printf("Error en apertura de archivo");
    }
   
   
   	for(i=1; i<n; ++i)
    {
        X=(a * X + c)%M;      
        U=X/M;
        printf("Numero %i    %d\n",i,U);
        fprintf(pf,"%f\n",U);   
    }
    
  
      

    fclose(pf);  
    
    system("PAUSE");	
    return 0;
}
Mi problema viene ke cuando hace la division U=X/M, ke me da 0 para todo n (xke la funcion X=(a * X + c)%M; si ke me da los numeros correctos) y si cambio el tipo de variable por un float ( en vez de int ) me surge el siguiente problema.

- In function `main':
- invalid operands to binary %


xke yo kiero conseguir numeros aleatorios por el metodo congruencial, ke es:

Xi+1=(a * Xi + c)%M;

U= X/M; (donde U son los numeros aleatorios).

porfavor necesito ayuda urgente!, es ke tengo ke entregar la practica dentro de 5h.... y llevo varios dias intentando areglar esto y estoy desesperado!

muxas gracias tios!!

Última edición por waneos; 29/05/2008 a las 12:47
  #2 (permalink)  
Antiguo 29/05/2008, 11:56
Avatar de javioreto  
Fecha de Ingreso: enero-2005
Ubicación: C:\España\Bilbao
Mensajes: 1.212
Antigüedad: 19 años, 3 meses
Puntos: 15
Respuesta: Ayuda super urgente!

Saludos, no se si funcionará, pero al ser U int, en el printf para mostrarlo pones %e yo pondría %d que es lo correcto en los int, pero de todas formas un número que es igual a una divisón, por lo que tendrá decimales no puede ser un entero, debe ser obligatoriamente un float.
  #3 (permalink)  
Antiguo 29/05/2008, 12:46
 
Fecha de Ingreso: abril-2008
Mensajes: 19
Antigüedad: 16 años, 1 mes
Puntos: 0
Respuesta: Ayuda super urgente!

sii declaro m como float me surge el error ke he puesto arriba :( el problema no viene de %e, porke he puesto eso en un momento de desasperacion :P porke a ser int tiene ke ser d :( muchas gracias por contestar, pero aun no he solucionado el problema :(
  #4 (permalink)  
Antiguo 29/05/2008, 15:24
Avatar de _Lucifer_  
Fecha de Ingreso: junio-2006
Mensajes: 1.662
Antigüedad: 17 años, 11 meses
Puntos: 28
Respuesta: Ayuda super urgente!

Si X es menor que M, al se una división entera el resultado siempre será cero. Puedes declarar a U como float y cambiar los especificadores de tipo donde corresponda por %f, luego hacer un type casting en la división para que haga la división real y no la entera:
Código:
...
for(i=1; i<n; ++i)
    {
        X=(a * X + c)%M;      
        U=float(X)/M;
        printf("Numero %i    %f\n",i,U);
        fprintf(pf,"%f\n",U);   
    }
...
Así podrás ver si el resultado es menor que uno.

Saludos
__________________
Si crees que no tiene sentido, etonces probablemente lo tenga... :arriba:
  #5 (permalink)  
Antiguo 29/05/2008, 15:50
 
Fecha de Ingreso: abril-2008
Mensajes: 19
Antigüedad: 16 años, 1 mes
Puntos: 0
Respuesta: Ayuda super urgente!

Muchas gracias tio! ya funciona, me has salvado la vida :)
  #6 (permalink)  
Antiguo 29/05/2008, 16:09
 
Fecha de Ingreso: abril-2008
Mensajes: 19
Antigüedad: 16 años, 1 mes
Puntos: 0
Respuesta: Ayuda super urgente!

Una ultima pregunta

Código:
 char elec,nombre_archivo[20]; 
 int vector[10000];
 int i,n,k,j;
 int M[10][10];
 FILE *pf; 
 double suma,suma2,suma3,suma4,teorico;

 //test de uniformidad
                  
           suma=0;
           for(i=0; i<=n; i++) 
           {
           suma += pow(vector[i],k);
           suma2=(suma);  
           suma3=(suma2)/n; 
           }
      
           teorico=(1.0/(k+1.0)); 
           printf("\nResultado del programa es %.12lf y valor teorico es %.4lf\n\n",suma3,teorico);
           
                  
         
         }
Esto es un segundo programa ke abre un archivo donde estan guardado los numeros generados aleatoriamente y hace una serie de test.

El test de uniformidad lo ke hace es elevar cada numero a k y hace un sumatorio y luego lo divide por el total de numeros. Pero tengo un problema, cuando los numeros son decimales por ejem: 0.34 , 0.43 , 0.23 etc etc el programa no me muestra los resultados y en cambio si los numeros son 23,43, 34 etc.. me lo hace correctamente. Sabeis ke pasa???

Las variables la tengo declaradas como double, aunke si las declaro como float tmp funciona... :(

muchas gracias tios!
  #7 (permalink)  
Antiguo 30/05/2008, 02:08
 
Fecha de Ingreso: abril-2008
Mensajes: 141
Antigüedad: 16 años
Puntos: 0
Respuesta: Ayuda super urgente!

Te recomiendo que en una linia de codigo solo pongas o float (en este caso double) o int, porque sino te va a dar mas de un dolor de cabeza, te lo digo por experiencia. Si teorico es double, k tambien ponlo a double, aunque nunca lo sea. Luego el 1.0 puedes quitarlo, el compilador ya reconoce que el 1 en realidad es 1.0000.
Luego haz lo mismo con la n. Si suma3 y suma2 son double pon la n tambien a double.

Si la n y la k las vas a utilizar para otra cosa y te resulta mas comodo trabajar con enteros, puedes hacer un cast. Justo antes de escribir la k y la n pon (double). Lo mismo con pow.

Ahora que me fijo en los printf has puesto lf... Sinceramente no se que es, prueba a poner solo una f.


El codigo quedaria asi:

Código:
char elec,nombre_archivo[20]; 
 int vector[10000];
 int i,n,k,j;
 int M[10][10];
 FILE *pf; 
 double suma,suma2,suma3,suma4,teorico;

 //test de uniformidad
                  
           suma=0;
           for(i=0; i<=n; i++) 
           {
                    suma += (double)pow(vector[i],k);
                    suma2=(suma);  
                    suma3=(suma2)/(double)n; 
           }
      
           teorico=(1/((double)k+1)); 
           printf("\nResultado del programa es %.12f y valor teorico es %.4f\n\n",suma3,teorico);
           
                  
         
         }

A ver si asi te funciona.

Última edición por GagleKas; 30/05/2008 a las 02:17
  #8 (permalink)  
Antiguo 30/05/2008, 07:29
Avatar de _Lucifer_  
Fecha de Ingreso: junio-2006
Mensajes: 1.662
Antigüedad: 17 años, 11 meses
Puntos: 28
Respuesta: Ayuda super urgente!

Si estás almacenando los números en el arreglo vector[], solo te va a guardar la parte entera de los números, por eso no te funciona para 0.24, pero si para 25. Declaralo de tipo float o double y verifica los especificadores de tipo en la sección que lees el archivo.

Saludos
__________________
Si crees que no tiene sentido, etonces probablemente lo tenga... :arriba:
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:48.