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
| #include <gsl/gsl_rng.h>
#include <gsl/gsl_randist.h>
#include <gsl/gsl_statistics.h>
// gcc *.c -L/usr/local/lib -lgsl -lgslcblas -lm
// ./a.out 10 5 123
typedef struct Famille Famille;
struct Famille{
int nEnfant;
int* ageEnfant;
};
// Prototypes
void initializePopulation(gsl_rng *r, Famille* population, int nFamille, unsigned long int nMaxEnfant, int enfantParFamille[]);
void libererMemoirePopulation(Famille* population, int nFamille);
// Main
int main(int argc, char *argv[]){
// Recupere les parametres depuis la ligne de commande
const int nFamille = atoi(argv[1]); // nombre de familles
const unsigned long int nMaxEnfant = atoi(argv[2]); // nombre d'enfants maximum
const int seed = atoi(argv[3]); // graine pour le generateur de nombres aleatoires
int i = 0;
int j = 0;
int* enfantParFamille; // tableau qui contiendra le nombre d'enfants par familles
enfantParFamille = malloc(nFamille * sizeof(int));
// Configure le generateur de nombres aleatoires
const gsl_rng_type *T;
gsl_rng *r;
gsl_rng_env_setup();
T=gsl_rng_default;
r=gsl_rng_alloc(T);
gsl_rng_set(r, seed);
// Initialiser la population
Famille population[nFamille]; // Je défini ici une population de N familles, mais toutes les familles n'ont pas la même taille...
initializePopulation(r, population, nFamille, nMaxEnfant, enfantParFamille);
// afficher les contenus
for(i=0; i<nFamille; i++){
printf("La famille %d a %d enfants.\n", i+1, enfantParFamille[i]);
if(enfantParFamille[i] > 0){
for(j=0; j<enfantParFamille[i]; j++){
printf("\tL'enfant %d de la famille %d a %d ans.\n", j+1, i+1, population[i].ageEnfant[j]);
}
}
}
//libere la memoire
libererMemoirePopulation(population, nFamille);
free(enfantParFamille);
return(0);
}
// fonction qui génère n familles, avec chacune un nombre aléatoire d'enfants, eux mêmes avec des ages aléatoires
void initializePopulation(gsl_rng *r, Famille* population, int nFamille, unsigned long int nMaxEnfant, int enfantParFamille[]){
int i = 0;
int j = 0;
const unsigned long int ageMax = 100;
for(i=0; i<nFamille; i++){ // boucle le long des familles
enfantParFamille[i] = gsl_rng_uniform_int(r, nMaxEnfant); // la famille 'i' a entre 0 et (nMaxEnfant-1) enfants
if(enfantParFamille[i] == 0){ // si la famille 'i' a zéro enfant, je lui attribue un age de '-9' ans (ma façon de gérer les NA)
population[i].ageEnfant = malloc(1 * sizeof(int));
*population[i].ageEnfant = -9;
}else{
population[i].ageEnfant = malloc(enfantParFamille[i] * sizeof(int));// si la famille 'i' a plus que 0 enfant, je leur attribue des ages aléatoires
for(j=0; j<enfantParFamille[i]; j++){ // boucle le long des enfants
population[i].ageEnfant[j] = gsl_rng_uniform_int(r, ageMax) + 1;
}
}
}
}
void libererMemoirePopulation(Famille* population, int nFamille){
int i = 0;
for(i=0; i<nFamille; i++){
free(population[i].ageEnfant);
}
} |
Partager