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 0El 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...









