как описать функцию на С, которая по заданному году определит первый вторник ноября (именно ноября), если 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 шт):
Сдаётся мне, что у Вас алгоритм реализован не вполне корректно, по части учёта високосных лет. Посмотрите дискуссию по этому поводу тут:
https://www.cyberforum.ru/turbo-pascal/thread116209.html
Там в посте № 7 готовая С-программа.
По мотивам этой книжки через юлианскую дату:
#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);
}