Newsgroup: it.comp.lang.c++
Titolo: Date

Ciao,
 dato un intervallo di date
  inizio               fine
 
  15/01/2002           15/02/2002  
 
esiste in c++ la possibilità di determinare la differenza?
Ultima cosa nel caso voglia che il calcolo dei giorni (data finale)sia
sempre a fine mese?
Vi ringrazio x ogni dritta che mi darete
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 wrote in message
news:07873cc763198b04f2...@mygate.mailgate.org...



qualche giorno fa ho scritto la funzione:
long int num_days(int giorno1, int mese1, int anno1, 
                  int giorno2, int mese2, int anno2)
proprio per risolvere tale problema (avrei intenzione di scrivere un
programma che mi calcola gli interessi dei versamenti di un conto
corrente e non mi sgarri di un giorno)
naturalmente NON SO SE FUNZIONA
                    -------------------------------------
inoltre (giorno1, mese1, anno1)<=(giorno1, mese1, anno1)
perchè se no risulterebbe il numero di giorni in negativo (questo mi
serve per il calendario perpetuo)
A proposito: io sono nato di Giovedì e attraveso tale funzione si può
fare un calendario perpetuo (o quasi dal -5000 al 5000) :)
#include <stdio.h>
int getint( FILE* f, int* i)
{int c, d;
 while( (d=fscanf(f,"%d", i)) == 0 ) 
              {fprintf(stderr , "Errore> ");
               while((c=fgetc(f))!='\n' && c!=EOF);
               if(c==EOF) return -1;
              }
 if(d==EOF) return -1;
 while((c=fgetc(f))!='\n' && c!=EOF);
 return 0;
}
int day_of_year(int , int , int );
void month(int , int , int* , int* );
long int num_days(int , int , int ,
                  int  , int , int);
char* monthname(int n);
char* giorno_settimana(int giorno, int mese, int anno);
int  main()
{int anno, mese, giorno;
 int anno1, mese1, giorno1;
do{printf("\nInserisci anno>");
   getint(stdin, &anno);
   printf("\nInserisci mese>");
   getint(stdin, &mese);
   printf("\nInserisci giorno>");
   getint(stdin, &giorno);
   printf("\ngiorno=%s \n", 
           giorno_settimana(giorno, mese, anno) );
   printf("\nInserisci anno1>");
   getint(stdin, &anno1);
   printf("\nInserisci mese1>");
   getint(stdin, &mese1);
   printf("\nInserisci giorno1>");
   getint(stdin, &giorno1);
   printf("\ngiorni=%d \n", (int)
           num_days(giorno, mese, anno,
                  giorno1, mese1, anno1 ) );
  }while(anno!=1);
return 0;
}
void swap(int* i, int* j)
{int temp; temp=*i; *i = *j; *j=temp;}
static char daytab[][13]={
 {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
 {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
int is_data(int day, int month, int year)
{int leap;
 if(year<-5000 || year>5000 )
   {fprintf(stderr, 
       "\nErrore: valore degli anni fuori range\n");
    return 0;
   }
 leap = year%4==0 && year%100!=0 || year%400==0;
 if(month<1 || month>12 || day<1 || 
              day>daytab[leap][month] )
      {fprintf(stderr, "\nErrore mese o giorno errato\n");
       return 0;
      }
 return 1;
}
/* day_of_year: calcola il giorno dell'anno */
int day_of_year(int day, int month, int year)
{int leap;
 char *i;
 if(!is_data(day, month, year)) return 0;
 leap = year%4==0 && year%100!=0 || year%400==0;
 for(i=daytab[leap]+1; i < (daytab[leap]+month) ; ++i)
           day += *i;
 return day;
}
/* month_day: calcola il giorno del mese */
void month(int year, int yearday, int* pmonth, int* pday)
{int leap;
 char * i;
 leap = year%4==0 && year%100!=0 || year%400==0;
 if( yearday<1 || (leap==1 && yearday>366) 
               || (leap==0 && yearday>365) )
              {fprintf(stderr,"\nErrore giorno errato\n");
               return;
              }
 for(i=daytab[leap]+1; yearday > *i; ++i)
       yearday -= *i;
 *pmonth= i-daytab[leap];
 *pday= yearday;
}
long int numero_giorni(int giorno1, int mese1, int anno1,
                       int giorno2, int mese2, int anno2)
{long int risultato;
 int temp, j;
 for(temp=0, risultato=0;(j=anno1+temp)< anno2; ++temp)
     risultato += 
       (j%4==0 && j%100!=0 || j%400==0) ? 366 : 365;
 risultato -= day_of_year(giorno1, mese1, anno1);
 risultato += day_of_year(giorno2, mese2, anno2);
 return risultato;
}
/*Calcola la differenza in giorni con eventuale segno*/
long int num_days(int giorno1, int mese1, int anno1, 
                  int giorno2, int mese2, int anno2)
{int sign=1;
 if(!is_data(giorno1, mese1, anno1) ||
    !is_data(giorno2, mese2, anno2)) return 0;
 if(giorno1==giorno2 && mese1==mese2 && anno1==anno2)
                                     return 0;
 if(anno2<anno1 || (anno2==anno1 && mese2<mese1) ||
   (anno2==anno1 && mese2==mese1 && giorno2<giorno1) )
                {swap(&giorno1, &giorno2);
                 swap(&mese1, &mese2);
                 swap(&anno1, &anno2);
                 sign=-1;
                }
 return sign * numero_giorni(giorno1, mese1, anno1, 
                             giorno2, mese2, anno2 );
}
char* monthname(int n)
{static char * name[]={
    "Mese sconosciuto",
    "Gennaio", "Febbraio", "Marzo",
    "Aprile", "Maggio", "Giugnio",
    "Luglio", "Agosto", "Settembre",
    "Ottobre", "Novembre", "Dicembre"
   };
 return (n<1 || n>12) ? name[0]: name[n];
}
char* gio(int n)
{static char * nomi[]={
    "Lunedi", "Martedi", "Mercoledi",
    "Giovedi", "Venerdi", "Sabato", 
    "Domenica",
    "Giorno sconosciuto"
    };
 return (n<0 || n>6) ? nomi[7]: nomi[n];
}
char* giorno_settimana(int giorno, int mese, int anno)
{long int g;
 char * p="";
 if(!is_data(giorno, mese, anno)) return p;
 g=num_days(1, 1, 1900, giorno, mese, anno );
 printf("giorni==%d", (int) g);
 g= (g >= 0) ? g%7 : (7-((-g)%7))%7;
 return gio(g);
}

Grazie ragazzi,
 con in Vs. due esempi mi avete illuminato
