//(c)Jordi Binefa i Martínez // on January 28th, 2000 #include #include #define NAME_FILE "calend.txt" int isLeapYear(int number){ if(number > 1582){ if(number%100){ if(number%4) return 0; else return 1; }else if((number/100)%4) return 0; else return 1; }else return 0; } int numLeapYearsFrom98(int number){ int year, counter = 0; if(number < 1998){ for(year = number; year < 1998 ; year++) if(isLeapYear(year)) counter--; }else for(year = number; year > 1998 ; year--) if(isLeapYear(year)) counter++; return counter; } int incDay(int day){ day++; if(day > 7) day = 1; return day; } int decDay(int day){ day--; if(!day) day = 7; return day; } int day1January(int year){ int day = 4, leapYears, normalYears, defaultYear = 1998, i; leapYears = numLeapYearsFrom98(year); if(year > defaultYear){ //request year > 1998 normalYears = (year-defaultYear) - leapYears; for(i=0 ; i < normalYears ; i++) day = incDay(day); for(i=0 ; i < leapYears ; i++) day = incDay(incDay(day)); //in leap years it's increased two days if(isLeapYear(year)) //if the year is leap musn't to advance day = decDay(day); }else{ //request year <= 1998 normalYears = (defaultYear - year) + leapYears; for(i=normalYears ; i > 0 ; i--) day = decDay(day); for(i=leapYears ; i < 0 ; i++) day = decDay(decDay(day)); //in leap years it's decreased two days } return day; } int askYear(){ int number; cout << "\nTell me a year : "; cin >> number; cout << "\n\n"; return number; } void writeYear(int number, FILE *file){ char thousands, hundreds, tens, units; thousands = number / 1000 + '0'; hundreds = (number % 1000) / 100 + '0'; tens = (number % 100 ) / 10 + '0'; units = (number % 10) + '0'; fprintf(file,"%c%c%c%c\n", thousands, hundreds, tens, units); } void writeDay(int number, FILE *file){ char tens, units; tens = number / 10 + '0'; units = number % 10 + '0'; if(tens == '0'){ if(units == '0'){ fprintf(file," "); }else{ fprintf(file," %c",units); } }else fprintf(file," %c%c",tens,units); } int writeMonth(int number, int firstday, int year, FILE *file){ int i, numdays, dayWeek; switch(number){ case 1 : case 3 : case 5 : case 7 : case 8 : case 10: case 12: numdays = 31; break; case 2 : if (isLeapYear(year)) numdays = 29; else numdays = 28; break; default : numdays = 30; } fprintf(file,"\n\nMes %d\n",number); fprintf(file," DL DM DC DJ DV DS DG\n"); for(dayWeek = 1; dayWeek < firstday ; dayWeek++) writeDay(0,file); for (i = 1; i <= numdays ; i++){ writeDay(i,file); dayWeek++; if(dayWeek > 7){ dayWeek = 1; fprintf(file,"\n"); } } return(dayWeek); } void main(){ FILE *calFile; int first, month, year; if((calFile = fopen(NAME_FILE,"w")) != NULL){ year = askYear(); writeYear(year,calFile); first = day1January(year); for(month = 1; month <= 12 ; month++) first = writeMonth(month, first, year, calFile); fclose(calFile); }else perror(NAME_FILE); }