Получить даты всех праздничных дней года, которые бы совпадали в заданном году с выходными - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Задние такое: Получить даты всех праздничных дней года, которые бы совпадали в заданном году с выходными (суббота или воскресенье). Помогите найти ошибку, не правильно вычисляются даты
#include "stdafx.h"
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
#include <windows.h>
#define KPD 11
struct struct_date
{
    int day;
    int month;
    int year;
};
 
int what_day(const struct struct_date* date) // Формула вечного календаря
{
    int a = (14 - date->month) / 12;
    int y = date->year - a;
    int m = date->month + 12 * a - 2;
    return (7000 + (date->day + y + y / 4 - y / 100 + y / 400 + (31 * m) / 12)) % 7;
}
void Holliday()
{
    int j=0;
    int M[12]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int mas_pr[2][KPD]={ {1,2,7,8,1,2,9,28,25,7,8},{1,1,1,3,5,5,5,6,8,11,11}}; // Праздничные даты( {день},{месяц})
    int Uyear=0,T=0;
    printf("Введите год:\n");
    while((!scanf("%d", &Uyear))||(Uyear<=0))
        {
            printf("Повторите ввод года:\n");
            fflush(stdin);
        }
    if((Uyear%4==0)&&(Uyear%100==0)&&(Uyear%400==0))
        M[1]=29;
    
    for(int i=mas_pr[1][0]; i<11;i++)
    {
        for( j=mas_pr[0][j]; j<=KPD; j++)
        {
            struct_date a={j, i+1, Uyear};
            T=what_day(&a);
            if((T==6)||(T==0)) printf("Праздник совпадает с выходным %d-го числа %d-го месяца\n", j,i+1);
        }
    }
}

int main()
{
    setlocale(LC_ALL, "rus");
    Holliday();
    _getch();
    return 0;
}

Решение задачи: «Получить даты всех праздничных дней года, которые бы совпадали в заданном году с выходными»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
#include <windows.h>
#define KPD 11 // Кол-во праздничных дней 
struct struct_date {
int day;
int month;
int year;
};
 
int what_day(const struct struct_date* date) // Готовая формула  вечного календаря, взятая из интернета 
{
//Положим год — год, месяц — номер месяца, день — день, тогда
int a = (14 - date->month) / 12;
int y = date->year - a;
int m = date->month + 12 * a - 2;
return (7000 + (date->day + y + y / 4 - y / 100 + y / 400 + (31 * m) / 12)) % 7;
//Все деления целочисленные (остаток отбрасывается).
//Результат: 0 — воскресенье, 1 — понедельник и т. д.
}
void Holliday()
{
int Uyear = 0, T = 0;
int mas_pr[2][KPD] = { { 1, 2, 7, 8, 1, 2, 9, 28, 25, 7, 8 }, { 1, 1, 1, 3, 5, 5, 5, 6, 8, 11, 11 } }; // Праздничные даты( {день},{месяц})
printf("Введите год:\n");
while ((!scanf_s("%d", &Uyear)) || (Uyear <= 0))
{
printf("Повторите ввод года:\n");
fflush(stdin);
}
for (int i = 0; i < 11; i++)
{
struct_date a = { mas_pr[0][i], mas_pr[1][i], Uyear };
T = what_day(&a);
if ((T == 6) || (T == 0))
printf("Праздник совпадает с выходным %d-го числа %d-го месяца\n", mas_pr[0][i], mas_pr[1][i]);
}
}
int main()
{
setlocale(LC_ALL, "rus");
Holliday();
return 0;
}

Объяснение кода листинга программы

  1. Включаем необходимые заголовочные файлы для работы с языком C
  2. Объявляем структуру struct_date, которая содержит поля day, month и year для хранения даты
  3. Определяем функцию what_day, которая принимает указатель на структуру struct_date и возвращает номер дня недели (0 - воскресенье, 1 - понедельник и т.д.)
  4. В функции what_day используем готовую формулу для вычисления дня недели в заданном году, месяце и дне
  5. Объявляем функцию Holliday, которая принимает введенный пользователем год и массив mas_pr с праздничными датами
  6. В функции Holliday используем цикл for для проверки каждого элемента массива mas_pr и вычисления дня недели с помощью функции what_day
  7. Если день недели равен 6 или 0 (это выходные дни), выводим сообщение о том, что праздник совпадает с выходным указанной даты
  8. В функции main устанавливаем локальную настройку на русский язык с помощью функции setlocale
  9. Вызываем функцию Holliday, чтобы начать выполнение программы
  10. Возвращаем 0, чтобы указать, что программа успешно завершилась

Оцени полезность:

5   голосов , оценка 4.2 из 5
Похожие ответы