как описать функцию на С, которая по заданному году определит первый вторник ноября (именно ноября), если 1.1.2001 – понедельник

сперва я решила определять, каким днем недели является 1 ноября

воспользовававшись формулой Зеллера для расчета дня недели для любой даты получила, что после первого же високосного года сбивается вся нумерация на -2(то есть вместо выведения вторника (1 ноября 2005), он выводит воскресение

нужно как-то написать кусок, который в диапазоне от 2001 года до заданного определит количество високосных лет и будет прибавлять +2 дня недели, чтобы нумерация восстановилась

плюсом потом нужно сделать так, чтобы вместо понедельника уже выводились вторники, но с этим уже попроще будет

вот кусочек корявенького кода (простите, только учусь)

#include <stdio.h>
#include <iostream>
#include <math.h>


int get_election_date(int year)
{
    int month = 10, day = 1;

    int d = day;
    int m = month;
    int k = year % 100;
    int j = year / 100;

    int result = d + 13 * (m + 1) / 5 + k + k / 4 + j / 4 + 5 * j;
    result = result % 7;

    switch (result)

    {

    case 6: printf("Saturday \n");
        break;
    case 0: printf("Sunday \n");
        break;
    case 1: printf("Monday \n");
        break;
    case 2: printf("Tuesday \n");
        break;
    case 3: printf("Wednesday \n");
        break;
    case 4: printf("Thursday \n");
        break;
    case 5: printf("Friday \n");
        break;
    }
    return result;
}


int main()
{
    int year, month, day;
    printf("enter the year ");
    scanf_s("%d", &year);
    month = 10;
    day = 1;
    printf("%d", get_election_date(year));
    return 0;
}

Ответы (2 шт):

Автор решения: Sergey

Сдаётся мне, что у Вас алгоритм реализован не вполне корректно, по части учёта високосных лет. Посмотрите дискуссию по этому поводу тут:

https://www.cyberforum.ru/turbo-pascal/thread116209.html

Там в посте № 7 готовая С-программа.

→ Ссылка
Автор решения: Mikhailo

По мотивам этой книжки через юлианскую дату:

#include <stdlib.h>
#include <stdio.h>

long Jd(int year, int month, int day) {
    int Grig = 0;

    if (year > 1528) Grig = 0;
    else if (year < 1528) Grig = 1;
    else if (month > 10)  Grig = 0;
    else if (month < 10)  Grig = 1;
    else if (day >= 15)   Grig = 0;
    else
        Grig = 1;

    if (month <= 2) {
        year--;
        month += 12;
        };

    unsigned long J;

    int A;

    if (Grig == 0) {
        A = year / 100;
        A = 2 - A + (A / 4);
        }
    else A = 0;

    J = 1461L * (long)year;
    J /= 4;
    unsigned long K = 306001L * (long)(month + 1);
    K /= 10000L;
    J += K + day + 1720994L + A;
    return J;
    };

int main() {
    int y;
    printf("Year: ");
    scanf("%d", &y);
    int d = (Jd(y, 11, 1) + 2) % 7;
    d = 3 - d;

    if (d <= 0) d += 7;

    printf("%02d.11.%d\n", d, y);
    }
→ Ссылка