PDA

Visualizza la versione completa : [C] Programma calendario


luci89
11-03-2008, 14:45
Ciao a tutti vorrei fare in C un semplice programmino che mi ricorda un appuntamento ogni tot giorni. Per esempio io decido che l'appuntamento è ogni 60 giorni. Inizialmente inserisco la data di oggi e quella dell'ultimo appuntamento e poi il programma automaticamente mi calcola quando sarà il prossimo appuntamento (gg/mm/aa). Sembra semplice ma i mesi non hanno tutti lo stesso numero di giorni. Come si potrebbe fare?

mondobimbi
16-03-2008, 12:00
ci sono innumerevoli sistemi per fare quello che desideri.
Prova tu a buttare giù qualcosa e a proporlo (tip: vettore con numeri di giorni per mese; funzione che calcola se l'anno è bisestile)
ciao
sergio

luci89
16-03-2008, 14:17
Quindi potrei fare un vettore per ogni mese dell'anno con i rispettivi giorni. Ma se per esempio devo inserire una data (es. 16/03/08) e l'appuntamento deve essere 20 giorni dopo questa data (cioè il 5 aprile), come si fa a spiegare al programma che alla fine del vettore marzo i 5 giorni che avanzano vanno contati in aprile?

mondobimbi
16-03-2008, 17:48
no, un vettore unico di 12 elementi che contenga per ogni elemento il numero di giorni che ha quel mese, vettore che chiamo giorniNelMese, che avrà 31,28,31,30 ......, rispettivamente per gennaio, febbraio ....
Se tu sei al 15/3/08 e devi andare avanti di 20 giorni devi fare 15+20 -i giorni del mese che ci sono a marzo.
Tieni presente che questo lo puoi fare come esercizio perchè le funzioni che cerchi già esistono.
Comunque ti potresti scrivere due funzioni, una che ti calcola i giorni che sono trascorsi da una tua data di riferimento (se le tue date sono tutte maggiori del 1/1/2008) potresti partire da questa data. Questa funzione deve iterare su tutti i mesi dell'anno, tenendo conto dell'anno bisestile.
Poi dovrai scrivere una funzione che, dato il numero di giorni trascorso dall'1/1/2008 ti ritorni una data.
Per calcolarti la data trascorso un certo numero di giorni da una data prefisata ti calcoli prima il numero di giorni dall'1/1/2008 di questa data prefissata, ci sommi i giorni che vuoi che trascorrano, e decodifichi il tutto trovando la data.
Per esempio la funzione che ti ritorna il numero di giorni trascorsi dal 1/1/2008 potrebbe essere del tipo


int giorniDa2008 (int giorno, int mese, int anno)
{
int giorni = 0;
for (int i = 2008; i < anno; i++) {
giorni += 365 + bisestile(i);
}
for (int j = 0; j < mese; j++)
giorni += giorniNelMese[i] + (j==1) ? bisestile(anno)) ;
return (giorni + giorno);
}

la funzione
int bisestile(int anno) ;
ritorna 1 se l'anno è bisestile, altrimenti 0.
spero che ti serva
ciao
sergio

Vincenzo1968
16-03-2008, 19:27
Questa serie di funzioni dovrebbe esserti utile:



typedef struct tagData
{
short Giorno;
short Mese;
short Anno;
} Data;

/*Restituisce 1 se l'anno è bisestile, 0 altrimenti*/
int IsAnnoBisestile(short nAnno)
{
if ( nAnno % 4 != 0 )
{
return 0;
}
else
{
if ( nAnno % 100 != 0 )
return 1;
else if ( nAnno % 400 != 0 )
return 0;
else
return 1;
}
}

int GiorniNelMese(short nMese, short nAnno)
{
switch ( nMese )
{
case 2:
if ( IsAnnoBisestile(nAnno) )
return 29;
else
return 28;

case 4:
case 6:
case 9:
case 11:
return 30;

default:
return 31;
}
}

/* Somma nGiorni alla data dt e restituisce la data corrispondente*/
Data SommaGiorni(Data dt, unsigned int nGiorni)
{
Data dtRet;

dtRet.Giorno = dt.Giorno;
dtRet.Mese = dt.Mese;
dtRet.Anno = dt.Anno;

for ( int i = 0; i < nGiorni; i++ )
{
if ( dtRet.Giorno < GiorniNelMese(dtRet.Mese, dtRet.Anno) )
{
dtRet.Giorno++;
}
else
{
dtRet.Giorno = 1;
if ( dtRet.Mese != 12 )
{
dtRet.Mese++;
}
else
{
dtRet.Mese = 1;
dtRet.Anno++;
}
}
}

return dtRet;
}

/* Sottrae nGiorni alla data dt e restituisce la data corrisponente*/
Data SottraiGiorni(Data dt, unsigned int nGiorni)
{
Data dtRet;

dtRet.Giorno = dt.Giorno;
dtRet.Mese = dt.Mese;
dtRet.Anno = dt.Anno;

for ( int i = 0; i < nGiorni; i++ )
{
if ( dtRet.Giorno > 1 )
{
dtRet.Giorno--;
}
else
{
if ( dtRet.Mese > 1 )
{
dtRet.Mese--;
dtRet.Giorno = GiorniNelMese(dtRet.Mese, dtRet.Anno);
}
else
{
dtRet.Giorno = 31;
dtRet.Mese = 12;
dtRet.Anno--;
}
}
}

return dtRet;
}

/*
ConfrontaDate restituisce:
zero se le due date sono uguali;
un valore maggiore di zero se dt1 > dt2;
un valore minore di zero se dt1 < dt2.
*/
int ConfrontaDate(Data dt1, Data dt2)
{
if ( dt1.Anno == dt2.Anno && dt1.Mese == dt2.Mese && dt1.Giorno == dt2.Giorno )
return 0;
else if (dt1.Anno == dt2.Anno ?
dt1.Mese == dt2.Mese ?
dt1.Giorno > dt2.Giorno :
dt1.Mese > dt2.Mese :
dt1.Anno > dt2.Anno)
return 1;
else
return -1;
}

/* Calcola la differenza in giorni tra due date */
int Differenza(Data dt1, Data dt2)
{
int nRet = 0;
Data d1;
Data d2;

if ( ConfrontaDate(dt1, dt2) == 0 )
return 0;
else if ( ConfrontaDate(dt1, dt2) > 0 )
{
d1 = dt2;
d2 = dt1;
}
else
{
d1 = dt1;
d2 = dt2;
}

do
{
nRet++;
d1 = SommaGiorni(d1, 1);
} while ( ConfrontaDate(d1, d2) != 0 );

return nRet;
}

Loading