Vabbe posto io. L'ho Testato e funziona (con 3 date)
#include <stdio.h>
char *ggSettimana(int gg, int mm, int aaaa)
{
int ngg[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; /* i gg di ogni mese */
/* LA data di riferimento è esatta: ho usato il giorno del compleanno di mio padre*/
int fGior = 20; // 20° gg del mese
int fMese = 2; // mese di rif Febbraio
int fSett = 7; // Domenica
int fAnno = 1955; // anno di riferimento
int fBise = 1956; // Primo anno bisestile (1956 è troppo presto)
// Anno corrente aaaa
// mese corrente mm
// gg corrente gg
int ggBise = (aaaa - fBise) / 4 ; /* sono i gg in + di ogni anno bisestile */
int anni = (aaaa - 1) - fAnno; /* anni trascorsi */
int ggAnno = 0;
for (int i = 0; i < mm - 1; i++)
ggAnno += ngg[i];
ggAnno += gg;
int ggAnnoBis = 0;
for (int i = 0; i < fMese -1; i++)
ggAnnoBis += ngg[i];
ggAnnoBis += fGior -1;
int ggTotali = ggAnno + 365*anni + ggBise - ggAnnoBis; // ecco tutti i gg trascorsi! (credo sia giusto)
// ora dobbiamo calcolare il giorno della settimana
int ggSettimana = (ggTotali % 7) + 1; // Il resto ci indica il giorno della settimana -1: oscilla tra 0-6
ggSettimana += fSett; // secondo il giorno di riferimento
if (ggSettimana > 7)
ggSettimana -=7; // eliminiamo eventuali avanzi...
switch(ggSettimana)
{
case 1: return "Lunedi'"; break;
case 2: return "Martedi'"; break;
case 3: return "Mercoledi'"; break;
case 4: return "Giovedi'"; break;
case 5: return "Venerdi'"; break;
case 6: return "Sabato"; break;
case 7: return "Domenica"; break;
deafult: return "ERRORE!";
}
}
void main()
{
printf("%s", ggSettimana(17, 5, 1985)); // esce venerdì: il mio compleanno -> GIUSTOOO OLLEEEE
getchar();
}
DITEMI GRAZIEEEEEE
Ah, gli ho messo il copyright. Così nessuno oltre me la può usare!
ahahahah sarebbe davvero una bastardata! Datela a chi volete... Ha una licenza GNU.
Muuuahahaha