//cal01.cpp //This program determines the number of the 1st January //of any year. Specificly the routine // int day1January(int year) //(c)Jordi Binefa i Martínez // on January 28th, 2000 #include #include 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 main(){ int year; while(year = askYear()) //You can get out writing 0 if (year < 2001) //I do this to write "was" or "will" cout << "On day 1st January " << year << " was " << day1January(year) << "\n\n"; else cout << "On day 1st January " << year << " will " << day1January(year) << "\n\n"; }