Dúvida Tomohiko Sakamoto's Algoritimo


#1

Desculpem pela pergunta meus amigos membros do forum mas talvez tem alguem ai que manja dos paranaue e me ajuda com essa dúvida.

Por favor preciso de ajuda para compreender uma parte do código abaixo:

É um código para desenvolver calendários e na função abaixo:

int dayNumber(int day, int month, int year)
{
static int t[] = { 0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4 };
year -= month < 3;
return ( year + year/4 - year/100 +
year/400 + t[month-1] + day) % 7;
}

A minha dúvida é sobre os numeros desta linha:

static int t[] = { 0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4 };

Eu sei que os numeros se referem ao dia da semana mas o que eu não entendo é porque os números estão nessa ordem?

Abaixo está o códico completo:

// A C++ Program to Implement a Calendar
// of an year
#include<bits/stdc++.h>
using namespace std;

/*A Function that returns the index of the day
of the date- day/month/year
For e.g-

Index Day
0 Sunday
1 Monday
2 Tuesday
3 Wednesday
4 Thursday
5 Friday
6 Saturday*/
int dayNumber(int day, int month, int year)
{

static int t[] = { 0, 3, 2, 5, 0, 3, 5, 1,
                   4, 6, 2, 4 };
year -= month < 3;
return ( year + year/4 - year/100 +
         year/400 + t[month-1] + day) % 7;

}

/*
A Function that returns the name of the month
with a given month number

Month Number Name
0 January
1 February
2 March
3 April
4 May
5 June
6 July
7 August
8 September
9 October
10 November
11 December */
string getMonthName(int monthNumber)
{
string months[] = {“January”, “February”, “March”,
“April”, “May”, “June”,
“July”, “August”, “September”,
“October”, “November”, “December”
};

return (months[monthNumber]);

}

/* A Function to return the number of days in
a month

Month Number Name Number of Days
0 January 31
1 February 28 (non-leap) / 29 (leap)
2 March 31
3 April 30
4 May 31
5 June 30
6 July 31
7 August 31
8 September 30
9 October 31
10 November 30
11 December 31

*/
int numberOfDays (int monthNumber, int year)
{
// January
if (monthNumber == 0)
return (31);

// February
if (monthNumber == 1)
{
    // If the year is leap then February has
    // 29 days
    if (year % 400 == 0 ||
            (year % 4 == 0 && year % 100 != 0))
        return (29);
    else
        return (28);
}

// March
if (monthNumber == 2)
    return (31);

// April
if (monthNumber == 3)
    return (30);

// May
if (monthNumber == 4)
    return (31);

// June
if (monthNumber == 5)
    return (30);

// July
if (monthNumber == 6)
    return (31);

// August
if (monthNumber == 7)
    return (31);

// September
if (monthNumber == 8)
    return (30);

// October
if (monthNumber == 9)
    return (31);

// November
if (monthNumber == 10)
    return (30);

// December
if (monthNumber == 11)
    return (31);

}

// Function to print the calendar of the given year
void printCalendar(int year)
{
printf (" Calendar - %d\n\n", year);
int days;

// Index of the day from 0 to 6
int current = dayNumber (1, 1, year);

// i --> Iterate through all the months
// j --> Iterate through all the days of the
//       month - i
for (int i = 0; i < 12; i++)
{
    days = numberOfDays (i, year);

    // Print the current month name
    printf("\n  ------------%s-------------\n",
           getMonthName (i).c_str());

    // Print the columns
    printf("  Sun  Mon  Tue  Wed  Thu  Fri  Sat\n");

    // Print appropriate spaces
    int k;
    for (k = 0; k < current; k++)
        printf("     ");

    for (int j = 1; j <= days; j++)
    {
        printf("%5d", j);

        if (++k > 6)
        {
            k = 0;
            printf("\n");
        }
    }

    if (k)
        printf("\n");

    current = k;
}

return;

}

// Driver Program to check above funtions
int main()
{
int year = 2016;
printCalendar(year);

return (0);

}