Dev - C++ - No entiendo en que falla mi programa

 
Vista:

No entiendo en que falla mi programa

Publicado por evolve (5 intervenciones) el 16/07/2021 11:30:11
Hola tengo que realizar un trabajo que consiste en la desintegración nuclear. Si alguien tiene tiempo de echarle un vistazo a mi código, estaría muy agradecido ya que me da error desde hace semanas y no entiendo por que.

El programa consiste en que empiezas con un determinado numero de nucleos activos, y en cada paso del codigo se elige un nucleo aleatorio y se desintegra (pasa de 1 a 0), el objetivo es realizar un determinado numero de simulaciones y hacer la media de nucleos desintegrados cada cierto numero de pasos. Pero no entiendo porque me salen numeros aleatorios a veces y otras veces solo funciona con un numero de simulaciones bajo (por ejemplo 10), y tengo que lograr hacerlo con hasta 10000 simulaciones. Pero supongo que a medida que avanza tiene mas probabilidades de producirse un error en el codigo.

Bueno dejo el codigo aqui, si alguien tiene tiempo de echarle un vistazo estaría muy agradecido ya que me da error desde hace semanas y no entiendo por que.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
//Ejercicio 1
 
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#define lambda 0.13
 
int main(){
	int anos,k,x,suma,h,i,j,N,Aj;
	long int M;
 
	//Pedimos variables
 
	printf("Numero de nucleos (N): ");
	scanf("%d", &N);
	fflush(stdin);
	printf("Numero de simulaciones (M): ");
	scanf("%i", &M);
	fflush(stdin);
	printf("Intervalo de pasos (Aj): ");
	scanf("%d", &Aj);
	fflush(stdin);
	printf("Limite de años: ");
	scanf("%d", &anos);
	fflush(stdin);
 
	//Definimos el numero de pasos necesarios
 
	int pasos=anos*(lambda*N);
	int limite = pasos/Aj;
 
//Definimos estos dos arrays
 	int promedio[limite];
 		float intervalo[limite][M],t[limite];
 
//La variable intervalo contiene el numero de nucleos activos al cabo de [pasos][simulación]
 for(i=0;i<limite;i++){
		for (k=0;k<M;k++){
			intervalo[i][k]=0;
			}
 
 
//Randomizamos mediante el tiempo que marca el ordenador
	srand(time(NULL));
 
	int n[N];
 
	//Aqui empieza el bucle para M simulaciones
	for(k=0;k<M;k++){
		printf("\n\nSimulacion numero %d\n\n",k+1);
 
		j=0;
		x=0;
	for(i=0;i<N;i++){
		n[i]=1;
	}
	suma=0;
	for(i=0;i<N;i++){
			suma += n[i];
		}
 
	do{
		if (j%Aj==0){
			printf("\nNucleos activos en %i pasos: %i\n",x*Aj,suma);
 
		intervalo[x][k]=suma;
		x++;
		}
		suma=0;
		j++;
		i=rand()%(N+1);
		if(n[i]==1){
			n[i]=0;
		}
		for(i=0;i<N;i++){
			suma += n[i];
 
		}
		}while(suma!=0);
	//Queremos que nos de valores hasta que la suma del total sea 0, es decir que no quede ningun nucleo
 
	}
	//Declaramos el fichero donde almacenaremos los datos
	FILE *fichero;
	fichero= fopen("datos15.dat","w");
	printf("\n\n");
 
	int f=0;
	for (x=0;x<=limite;x++){
		int suma1=0;
//Hacemos el promedio de los datos obtenidos en cada intervalo de tiempo
 
	for(k=0;k<M;k++){
		suma1=suma1+intervalo[x][k];
	}
	promedio[x]=suma1/M;
	t[x]=(x*Aj)/(N*lambda);
	fprintf(fichero,"%f		%i\n",t[x],promedio[x]);
	f++;
	}
 
	fclose(fichero);
		printf("Tu archivo con los datos ha sido creado.\n");
 
	system("pause");
	return 0;
}
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 1.440
Bronce
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

No entiendo en que falla mi programa

Publicado por dario (718 intervenciones) el 16/07/2021 15:57:37
Hola, te dire algunas cosas, no se como uses tus variables pero he visto algunas cosas.
En la linea 7 defines una variable lambda que es real (lambda 0.13).
En la linea 30, declaras la variable pasos como entera (int pasos) pero el resultado de la operacion es real (anos*(lambda*N)).
La variable limite (int limite) tambien da resultado real.
Bueno eso es lo que vi.
Salu2.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar