In buona sostanza devi calcolare il giorno della settimana relativo al primo giorno del mese di gennaio dell'anno considerato e stampare tanti tab quanti ne occorrono per posizionare il giorno corrispondente nella colonna giusta:
codice:
...
dblDay = CalendarDateToJulianDay(anno, mese, giorno);
colonna = DayOfTheWeek(dblDay);
for ( x = 0; x < colonna; x++ )
printf("\t");
...
codice:
#include <stdio.h>
#define annoiniziale 1752
int myal_IsJulianDate(int year, int month, int day)
{
if ( year > 1582 )
return 0;
if ( month > 10 )
return 0;
if ( day > 4 )
return 0;
return 1;
}
double CalendarDateToJulianDay(int year, int month, int day)
{
double Y, M, D;
double A, B;
B = 0;
D = day;
if ( month <= 2 )
{
Y = year - 1;
M = month + 12;
}
else
{
Y = year;
M = month;
}
if ( !myal_IsJulianDate(year, month, day) )
{
A = (int)(Y/100);
B = 2 - A + (int)(A/4);
}
return ( (int)(365.25 * (Y + 4716)) + (int)(30.6001 * (M + 1)) + D + B - 1524.5 );
}
int DayOfTheWeek(double jd)
{
int num = (int)(jd + 1.5);
int retValue = num % 7;
return retValue;
}
int IsLeapYear(int year)
{
if ( year % 4 != 0 )
{
return 0;
}
else
{
if ( year % 100 != 0 )
return 1;
else if ( year % 400 != 0 )
return 0;
else
return 1;
}
}
void PrintCalendar(int year)
{
int anno = year;
int mese = 1;
int giorno = 1;
int colonna = 0;
double dblDay;
int x;
int giorniMese[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if ( IsLeapYear(anno) )
giorniMese[2] = 29;
while(mese <= 12)
{
giorno = 1;
switch ( mese )
{
case 1:
printf("GENNAIO\n");
break;
case 2:
printf("FRBBRAIO\n");
break;
case 3:
printf("MARZO\n");
break;
case 4:
printf("APRILE\n");
break;
case 5:
printf("MAGGIO\n");
break;
case 6:
printf("GIUGNO\n");
break;
case 7:
printf("LUGLIO\n");
break;
case 8:
printf("AGOSTO\n");
break;
case 9:
printf("SETTEMBRE\n");
break;
case 10:
printf("OTTOBRE\n");
break;
case 11:
printf("NOVEMBRE\n");
break;
case 12:
printf("DICEMBRE\n");
break;
}
printf("\n");
printf("DOM\tLUN\tMAR\tMER\tGIO\tVEN\tSAB\t\n");
dblDay = CalendarDateToJulianDay(anno, mese, giorno);
colonna = DayOfTheWeek(dblDay);
for ( x = 0; x < colonna; x++ )
printf("\t");
while( giorno <= giorniMese[mese]){
while( colonna <= 6){
if( giorno > giorniMese[mese] ){
break;
}
else{
printf("%d\t",giorno);
colonna++;
giorno++;
}
}
printf("\n");
colonna = 0;
}
printf("\n");
mese++;
}
}
int main()
{
int anno;
printf("inserire anno: ");
scanf("%d",&anno);
PrintCalendar(anno);
return 0;
}