/* File: datasuN2.c */
/* Time-stamp: "2001-04-02 11:39:13 calvanes" */
/* Scopo: parametri passati per indirizzo */

/* Legge giorno, mese ed anno di una data, un intero n, e determina la data
   di n giorni dopo.  Versione ottimizzata che passa direttamente al primo
   giorno del mese successivo.
   La data finale deve essere del XX secolo.
*/

#include <stdio.h>


int giorniDelMese(int mm, int aa)
  /* Calcola il numero dei giorni del mese. */
{
  int giorni;

  switch (mm) {
  case 1: case 3: case 5: case 7: case 8: case 10: case 12:
    giorni = 31;
    break;
  case 4: case 6: case 9: case 11:
    giorni = 30;
    break;
  case 2:
    if (aa % 4 == 0 && aa != 1900)
      giorni = 29;
    else
      giorni = 28;
    break;
  }
  return giorni;
}  /* giorniDelMese */


void avanzaGiorni(int *giorno, int *mese, int *anno, int num_giorni)
  /* Aggiorna giorno, mese ed anno ai valori della data di num_giorni dopo. */
{
  int giorni_del_mese;   /* giorni del mese corrente */

  while (num_giorni != 0) {
    giorni_del_mese = giorniDelMese(*mese, *anno);
    if (*giorno + num_giorni <= giorni_del_mese) {   /* avanza di num_giorni */
      *giorno += num_giorni;
      num_giorni = 0;
    }
    else {                           /* portati al primo del mese successivo */
      num_giorni += *giorno - giorni_del_mese - 1;
      *giorno = 1;
      if (*mese == 12) {
        *mese = 1;
        (*anno)++;
      }
      else
        (*mese)++;
    }
  }
}  /* avanzaGiorni */


int main(void)
{
  int g, m, a;         /* rappresentano la data */
  int quanti_dopo;     /* numero di giorni di cui avanzare */
  int i;               /* indice per il ciclo */

  /* lettura della data */
  printf("Data (giorno, mese, anno) ? ");
  scanf("%d%d%d", &g, &m, &a);
  printf("Quanti giorni dopo ? ");
  scanf("%d", &quanti_dopo);

  printf("%d giorni successivi al %d/%d/%d e` ", quanti_dopo, g, m, a);

  avanzaGiorni(&g, &m, &a, quanti_dopo);

  /* stampa la data aggiornata */
  printf("%d/%d/%d\n", g, m, a);

  return 0;
}  /* main */