Ayuda con la programación en C

Aquí podrás hablar de cualquier cosa relacionada con la tecnología y la informática: software, hardware, internet, problemas con tu PC, robótica, I+D+i, etc.

Moderator: Viento

Post Reply
User avatar
will-o-the-wisp
Panacea Definitiva
Panacea Definitiva
Posts: 2466
Joined: 20 Dec 2009, 14:00
PSN ID: oh_mike_dog
Twitter: @oh_mike_god
Location: Zaragoza

Ayuda con la programación en C

Post by will-o-the-wisp » 25 Jan 2010, 11:59

El examen de prácticas consistirá en desarrollar el siguiente programa y hacer sobre él las modificaciones que los profesor estimen oportunas.

Como no tenía mucha idea, le pedí a un compañero que me ayudara a hacer el programa. Él me asegura que funciona, pero (al menos tal y como intento ejecutarlo) a mí no. Aunque sea un ejercicio de física, realmente no se aplica ningún principio físico, por lo que si alguien de aquí sabe programar en C debería poder entenderlo.

Simular la desintegración de átomos en una serie radiactiva, es decir, una serie de núcleos A,B,C,D... en la que el núcleo A se desintegra en el B con una probabilidad p[1] (0<p[1]<1) por segundo, a su vez el B se desintegra en el C con probabilidad p[2] y así sucesivamente hasta el último que es estable y no se desintegra.

Los datos del programa deben darse en un fichero de texto que especifique el número n de núcleos de la serie, y luego tantas filas como núcleos distintos en la serie; cada una de las tres columnas conteniendo: tipo de núcleo (A, B, C...), número inicial de núcleos de ese tipo y probabilidad de desintegración.

La simulación de la desintegración debe hacerse sacando tantos números aleatorios entre 0 y 1 como núcleos hay presentes de un tipo y en un momento dado. Si el número aleatorio obtenido r<p[i], un núcleo se desintegra y por tanto el número de núcleos de ese tipo presentes disminuye en una cantidad igual al número de veces que ha ocurrido r<p[i] y se aumenta el número de núcleos del tipo siguiente en la misma cantidad.

El proceso debe repetirse para cada tipo de núcleo y luego todo ello se repite un número determinado de veces (cada vez representa el transcurso de un segundo).

El resultado del programa debe ser un fichero de texto con n+1 columnas que contengas:
1ª columna: tiempo
2ª, 3ª, etc: el número de núcleos de cada tipo presentes en ese instante.

Los resultado se analizarán con GNUplot (en realidad en esto no tengo duda, sólo indica que el fichero que se cree tenga formato ".dat")


Y aquí el programa, principalmente hecho por mi compañero, con unas cuantas modificaciones hechas por mí.

Code: Select all

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
time_t time(time_t *t);
FILE *p;
FILE *w;
extern void calcula (void);
char elemento[1000];
float prob,inf,probabilidad[1000];
int total,desintegrados[1000],t,i,parar,n,j,nucleos[1000];

main()
{         
srand(time(0));
inf=0;
p=fopen("elementos.txt","r");
if (p==NULL)
printf ("No se puede abrir el archivo.");

fscanf(p,"%i \n",&n);
for(i=1;i<=n;i++)
{
fscanf(p,"%c %d %f \n",&elemento[i],&nucleos[i],&probabilidad[i]);
}

for (i=1;i<=n;i++)
total+=nucleos[i];
printf("\n\n %i \n\n", total);
w=fopen("desintegraciones.dat","w");
//getch();
//getch();
while(inf==0)
{
             printf("\n");
             if (t==0)
             fprintf(w,"%i ",t);
             else
             fprintf(w,"\n%i ",t);
             for(i=1;i<=n;i++)
             fprintf(w,"%i ",nucleos[i]);
             for(i=1;i<=n;i++)
{
             
printf("%c %i %f \n",elemento[i],nucleos[i],probabilidad[i]);
}
calcula();
t++;

getch();
if (nucleos[n]==total) inf=1;
}
fclose(p);
fclose(w);
getch();
}
void calcula (void)
{
     for (j=1;j<=n;j++)
     {
     for (i=1;i<=nucleos[j];i++)
     {
     prob=((float)rand()/RAND_MAX);
     if (prob<probabilidad[j])
     desintegrados[j]++;
     }
     nucleos[j]=nucleos[j]-desintegrados[j];
     }
     for (i=1;i<=n;i++)
     {
         nucleos[i+1]+=desintegrados[i];
         desintegrados[i]=0;
         }
         
}


El error creo que lo tengo yo, pero no sé exactamente por qué. Creando un archivo de texto del estilo:

Code: Select all

A 10 0.98 
B 9 0.86
C 7 0.60
D 4 0

El programa me devuelve el valor "0", y "desintegraciones.dat" está vacío, por lo que no lo puedo representar. Por alguna razón no me lee el número de núcleos.

A ver si alguien me puede ayudar, que llevo unos días con un quebradero de cabeza...

User avatar
Black Flare
Plumaje Fénix
Plumaje Fénix
Posts: 796
Joined: 18 Jan 2010, 13:35
Location: Pitágoras.

Re: Ayuda con la programación en C

Post by Black Flare » 25 Jan 2010, 12:27

El error te viene al leer de fichero. No estoy acostumbrado a trabajar en C, pero si he estado en otras asignaturas en C++.

El problema creo que esta aqui:

Code: Select all

fscanf(p,"%i \n",&n);
for(i=1;i<=n;i++)
{
fscanf(p,"%c %d %f \n",&elemento[i],&nucleos[i],&probabilidad[i]);
}


No estoy seguro (yo no he usado fscanf sino su primera el scanf xd), pero en la declaración de los tipos no debería haber un \n, eso puede provocar que este buscando algo que no exista y por eso no lea nada.
Image

User avatar
will-o-the-wisp
Panacea Definitiva
Panacea Definitiva
Posts: 2466
Joined: 20 Dec 2009, 14:00
PSN ID: oh_mike_dog
Twitter: @oh_mike_god
Location: Zaragoza

Re: Ayuda con la programación en C

Post by will-o-the-wisp » 25 Jan 2010, 18:49

Vale, por alguna razón los char me daban problema, así que he pasado a llamar a los núcleos 1, 2, 3... (en vez de A, B, C...).

Ahora ya me interpreta bien el ".txt", pero no me calcula lo que debería calcular xD

Sigo trabajando en ello.

Haraz
Viera Perdida
Viera Perdida
Posts: 338
Joined: 18 Dec 2009, 09:20
Location: Golfo Ártabro

Re: Ayuda con la programación en C

Post by Haraz » 26 Jan 2010, 12:16

No tengo idea de C, pero le consultaré a un colega que se le da bien. Cuando me conteste publico aquí su respuesta.

reivajj
Preludio
Preludio
Posts: 2
Joined: 26 Jan 2010, 15:55

Re: Ayuda con la programación en C

Post by reivajj » 26 Jan 2010, 16:15

Haraz wrote:No tengo idea de C, pero le consultaré a un colega que se le da bien. Cuando me conteste publico aquí su respuesta.


Ese soy yo.

A ver, el problema es el archivo que estas creando. Si te fijas en el enunciado "Los datos del programa deben darse en un fichero de texto que especifique el número n de núcleos de la serie". Con lo cual el archivo deberia de quedar asi:

Code: Select all

4
A 10 0.98
B 9 0.86
C 7 0.60
D 4 0


La primera linea es el numero de atomos (lineas) que vas a tener.

Te daba 0 porque estabas intentando coger una linea que contiene un char, un entero y un float como un entero (fscanf(p,"%i \n",&n);) y si cambias la A,B,C....por numeros te cogera el primero, en este caso el 1

De todas formas, tal como tienes planteado el codigo creo que no va a ser funcional. Lo he compilado y ejecutado y el bucle while del final es infinito. He intentado plantearlo a mi manera pero hay una parte del enunciado que no entiendo "El proceso debe repetirse para cada tipo de núcleo y luego todo ello se repite un número determinado de veces (cada vez representa el transcurso de un segundo).". La parte final es lo que no acabo de entender, ¿durante cuanto tiempo se tiene que repetir?.

Si me aclaras esto ultimo lo acabaremos sacando ;)

Espero haberte servido de ayuda. Un saludo

User avatar
will-o-the-wisp
Panacea Definitiva
Panacea Definitiva
Posts: 2466
Joined: 20 Dec 2009, 14:00
PSN ID: oh_mike_dog
Twitter: @oh_mike_god
Location: Zaragoza

Re: Ayuda con la programación en C

Post by will-o-the-wisp » 26 Jan 2010, 20:56

Se tiene que repetir hasta que el proceso sea estable. Es decir, supongo que el último de los núcleos tendrá una probabilidad 0 de desintegrarse, por lo que al final todos los núcleos serán de ese tipo (aunque unos tardarán más que otros según el número aleatorio).

Lo del archivo de texto también lo arreglé, me di cuenta más tarde que la primera línea era para el número total de núcleos. Sin embargo sí me daba problema con los datos de tipo char, así que tuve que cambiarlo forzosamente a int. Y es curioso, porque me dejé un "%c" sin quitar y me salían caritas (ASCII correspondientes a 1, 2, 3, 4... ☺☻♥♦...) en el printf, así que poniendo el número correspondiente a las letras, quizá hubiera funcionado.

Muchísimas gracias ^^

reivajj
Preludio
Preludio
Posts: 2
Joined: 26 Jan 2010, 15:55

Re: Ayuda con la programación en C

Post by reivajj » 26 Jan 2010, 21:04

ok. A ver si le doy una vueltecilla a esto despues de cenar y te cuento algo. De todas formas, lo de los char es raro raro

Post Reply