/*------------------------*/
/*Correction Pb du Partiel*/
/*------ LG / 2004 ------ */

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

/*question a)*/
#define ANNEE 365
#define NB_SEMAINES 52
#define NB 4 /*nb eleves*/


/*tire un entier au hasard entre inf et sup */
int hasard(int inf,int sup)
{
  int rando = rand();

  return (inf + (rando % (sup - inf +1)));
}

/*question c) */
/*on remplit les cases avec des nombres tirés au hasard*/
/* on oublie la case 0*/
void initialise_anniv(int anniv[NB+1])
{
  int i;
  for (i=1;i<=NB;i=i+1)
    {
      anniv[i] = hasard(1,365);
    }
}

/*question d)*/
/*on parcourt le tableau en imprimant une phrase à chaque tour */
void imprime_anniv(int anniv[NB+1])
{
  int i;
  for (i=1;i<=NB;i=i+1)
    {
      if (anniv[i] == 1)
	{
	  printf("Eleve %d ne le 1er jour de l'annee\n",i);
	}
      else
	{
	  printf("Eleve %d ne le %deme jour de l'annee\n",i,anniv[i]);
	}
    }
}

/*question e)*/
/* on détecte les lundis en utilisant la fonction modulo*/
void affiche_lundis(int anniv[NB+1])
{
  int i;
  printf("Les eleves ");
  for (i=1;i<=NB;i=i+1)
    {
      if (anniv[i]%7 == 1)
	{
	  printf("%d,",i);
	}
    }
  printf("sont nes un lundi \n");
}

/*question f)*/
/*je parcours le tableau des anniv en augmentant les cases */
/*du tableau collision. on n'oublie pas d'initialiser*/
void remplit_coll(int anniv[NB+1], int collisions[ANNEE+1])
{
  int i;
  for (i=1;i<=ANNEE;i=i+1)
    {
      collisions[i] = 0;
    }
  for (i=1;i<=NB;i=i+1)
    {
      collisions[anniv[i]] = collisions[anniv[i]] + 1;
    }
}

/*question g)*/
/*on suppose que coll est bien rempli, donc on n'a pas besoin de anniv*/
/* une collision est obtenue pour les cases qui ont un chiffre >=2*/
void affiche_coll(int coll[ANNEE+1])
{
  int i;
  for (i=1;i<=ANNEE;i=i+1)
    {
      if (coll[i] >=2)
	{
	  printf("%d eleves fetent leur anniv le %deme jour \n",coll[i],i); 
	}
    }
}
/*question h)*/
/*on regarde si deux cases consecutives ont le meme nb*/
/* on fait attention aux bornes*/
void jours_conseq(int coll[ANNEE+1])
{
  int i;
  printf("Il y a des anniv consecutifs les jours :");
  coll[0] = 0; /*astuce */

  for (i=2 ; i<=ANNEE-1 ; i = i+1)
  {
    if ((coll[i]>0) && (coll[i-1]>0 || coll[i+1]>0))
      {
	printf("%d ,",i);
      };
  }
  printf("\n");
}

/*question i*/
/*le numero de la semaine est obtenue en divisant par 7*/
/*je n'utilise pas la constante NB_SEMAINES*/
void semaine_festive(int coll[ANNEE+1])
{
  int i = 1; /*compte les jours*/
  int semainebest ; 
  int nbannivmax = 0;
  int cptanniv = 0; /*compte le nb anniv de la semaine courante*/

  while(i<=ANNEE)
    {
      if (i%7 == 0 ) /*nouvelle semaine*/
	{cptanniv = 0;}
      else
	{
	  if (i%7 == 6) /*dernier jour de la semaine*/
	    {
	      cptanniv = cptanniv+coll[i];
	      if (cptanniv > nbannivmax)
		{
		  nbannivmax = cptanniv;
		  semainebest = (i / 7) + 1;
		}
	    }
	  else /*autres jours*/
	    {
	      cptanniv = cptanniv+coll[i];
	    }
	}
      i = i+1;
    }
  printf("C'est en semaine %d qu'il y a le + d'anniv : %d \n",semainebest,nbannivmax);
}

/*question j aux, remplissage du tableau nbjours, pas demande*/
void initialise_nbjours(int nbjours[13])
{
  nbjours[1] = 31;
  nbjours[2] = 28;
  nbjours[3] = 31;
  nbjours[4] = 30;
  nbjours[5] = 31;
  nbjours[6] = 30;
  nbjours[7] = 31;
  nbjours[8] = 31;
  nbjours[9] = 30;
  nbjours[10] = 31;
  nbjours[11] = 30;
  nbjours[12] = 31;
}

/*question j fonction aux 2*/
/*on suppose que le tableau nbjours est bien initialise*/
/*calcule le jour en fonction du mois/jour*/
/*attention, le 1er fevr = nb de jours de janvier +1*/
/*d'ou le strict dans la boucle for*/
int calcule_jour(int jour,int mois, int nbjours[13])
{
  int i;
  int decalage = 0;
  for(i=1;i<mois;i++)
    {
      decalage = decalage + nbjours[i];
    }
  return (jour+decalage);
}

/*question j*/
/*remplit le tableau en fonction des utilisateurs*/
/*je suis obligee avec ma methode de passer le tab nbjours en param*/
/*on suppose qu'il est bien initialise*/
void demande_utilisateurs(int anniv[NB+1], int nbjours[13])
{
  int id;int mois; int jour;
  int nb /*compte le nb d'eleves qui sont passes*/;
  nb = 1;
  while(nb <=NB)
    {
      printf("Quel est ton numero ?\n");
      scanf("%d",&id);
      printf("Donne ta date de naissance, mois de naissance ?\n");
      scanf("%d",&mois);
      printf("numero du jour?\n");
      scanf("%d",&jour);
      anniv[id] = calcule_jour(jour,mois, nbjours);
      nb = nb +1;
    }
}

/*question k aux, fonction aux qui va mettre des noms dans les cases */
/*on met 4 noms et on repete*/
/*cette fonction n'etait pas demandee*/
void initialise_noms(char* e[NB+1])
{
  int i;
  for (i=1;i<=NB;i=i+1)
    {
      if (i%4 == 0)
	{
	  e[i] = "Robert";
	}
      if (i%4 == 1)
	{
	  e[i] = "Gertrude";
	}
      if (i%4 == 2)
	{
	  e[i] = "Jean";
	}
      if (i%4 == 3)
	{
	  e[i] = "Therese";
	}
    } 
}

/*question k)*/
/* pour chacun des jours de l'annee, je recupere les numeros des gens */
/* qui sont nes ce jour-la, et j'imprime leur nom. J'ai donc besoin */
/* du tableau anniv et du tableau nom. */
/* Remarques :  */
/* 1- on pourrait mieux utiliser le tableau coll pour s'arreter  */
/* dans la recherche des gens dans le tab anniv (boucle while */
/* 2- si 0 personne, on le detecte avec le tabl coll  */
/* 3- pour le 1er jour ca ecrit 1ieme  */
void anniv_et_noms(int anniv[NB+1], int coll[ANNEE+1], char* noms[NB+1])
{
  int i; int j;
 
  for (i=1;i<=ANNEE;i++) /*pour chaque jour ...*/
    {
      if (coll[i] >1) /*si ya des collisions */
	{
	  for (j=1;j<=NB;j++) 
   /*parcours du tableau anniv pour trouver les numeros des gens concernes */
	    {
	      if (anniv[j] == i)
		{
		  printf("%s ",noms[j]);
		}
	    } 
	  printf("ont leur anniv le %d ieme jour de l'annee\n",i);
	}
    }
}


int main (void)
{
  /*question b)*/

  int anniv[NB+1];
  int collisions[ANNEE+1];
  /*fin question b) */

  char* noms[NB+1];
  int nbjours[13];

  srand(time(NULL));

  initialise_anniv(anniv);
  imprime_anniv(anniv);
  
  affiche_lundis(anniv); 
  remplit_coll(anniv, collisions);  
  affiche_coll(collisions); 
  jours_conseq(collisions); 
  semaine_festive(collisions); 

/* Essais avec n=30 */
/* Eleve 1 ne le 232eme jour de l'annee */
/* Eleve 2 ne le 87eme jour de l'annee */
/* Eleve 3 ne le 37eme jour de l'annee */
/* Eleve 4 ne le 345eme jour de l'annee */
/* [...] */
/* Eleve 16 ne le 37eme jour de l'annee */
/* Eleve 17 ne le 120eme jour de l'annee */
/* [...] */
/* Eleve 29 ne le 265eme jour de l'annee */
/* Eleve 30 ne le 201eme jour de l'annee */
/* Les eleves 1,5,12,17,sont nes un lundi */
/* 2 eleves fetent leur anniv le 16eme jour */
/* 2 eleves fetent leur anniv le 37eme jour */
/* Il y a des anniv consecutifs les jours :7 ,8 , */
/* C'est en semaine 3 qu'il y a le + d'anniv : 3 */

  initialise_noms(noms);

  initialise_nbjours(nbjours);
  demande_utilisateurs(anniv, nbjours);
  remplit_coll(anniv, collisions);   
  /*ne pas oublier de remplir le nouveau tab de collisions!!*/
  anniv_et_noms(anniv,collisions,noms);

/* Essais avec n=4 */
/* Quel est ton numero ? */
/* 1 */
/* Donne ta date de naissance, mois de naissance ? */
/* 12 */
/* numero du jour? */
/* 12 */
/* Quel est ton numero ? */
/* 2 */
/* Donne ta date de naissance, mois de naissance ? */
/* 12 */
/* numero du jour? */
/* 12 */
/* Quel est ton numero ? */
/* 3 */
/* Donne ta date de naissance, mois de naissance ? */
/* 5 */
/* numero du jour? */
/* 4 */
/* Quel est ton numero ? */
/* 4 */
/* Donne ta date de naissance, mois de naissance ? */
/* 7 */
/* numero du jour? */
/* 10 */
/* Gertrude Jean ont leur anniv le 346 ieme jour de l'annee */

  return 0;
}

