Создание календаря в c - PullRequest
       30

Создание календаря в c

0 голосов
/ 26 апреля 2020

Я написал код для печати календаря по григорианскому календарю. Но у меня есть проблема, мне нужно вычислить текущее число недель, чтобы напечатать мой календарь с помощью массива [5] [7]. Мне нужна формула или программа, чтобы найти номер недели для отл. год: 2020 месяц: 4 день: 26 и я должен найти номер недели, и это 4. есть ли формула?

Ответы [ 2 ]

1 голос
/ 26 апреля 2020

Вы должны знать день недели первым!

Для этого используйте алгоритм Гаусса вариации Крайтчика:

https://en.wikipedia.org/wiki/Determination_of_the_day_of_the_week

    dayofweek(y, m, d)  /* 1 <= m <= 12,  y > 1752 (in the U.K.) */
    {
        static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
        y -= m < 3;
        int k = (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7;
        return k == 0 ? 6 : (k-1); // This will return 0 for monday...6 for sunday
    }

Затем номер вашей недели будет смещен относительно первого дня месяца:

w = (d - 1 + dayofweek(y, m, 1))/7 + 1;

вот пример кода, работающий на меня:

#include <stdio.h>
#include <stdint.h>

static const int days[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

static const char* dayofws[] = {"monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"};

static int dayofweek(int y, int m, int d)  /* 1 <= m <= 12,  y > 1752 (in the U.K.) */
{
    static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
    y -= m < 3;
    int k = (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7;
    return k == 0 ? 6 : (k-1); // This will return 0 for monday...6 for sunday
}

void main (void)
{
    int y = 2020;

    for (int m = 1; m <= 12; m++)
    {
        for (int d = 1; d <= days[m]; d++)
        {
            int w = (d - 1 + dayofweek(y, m, 1))/7 + 1;
            printf("%d    ", dayofweek(y, m, 1));
            printf("%d/%02d/%02d : %d  (%s)\n", y, m, d, w, dayofws[dayofweek(y, m, d)]);
        }
        printf("\n");
    }
}

0 голосов
/ 26 апреля 2020

Разве вы не можете просто получить количество дней с 1 января, разделите это число на 7 и добавьте 1 (чтобы оно начиналось с недели 1, а не с 0) Например:

17 января: 17 / 7 = 2 -> 2 + 1 = 3-я неделя

На 7-й, 14-й, 21-й, 28-й и т. Д. 1006 * день вы можете проверить остаток. Если остаток равен 0, неделя должна быть неделей-1. Таким образом, день 14 - это неделя 2, а не неделя 3.

...