Получить даты всех праздничных дней года, которые бы совпадали в заданном году с выходными - 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; }
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы для работы с языком C
- Объявляем структуру struct_date, которая содержит поля day, month и year для хранения даты
- Определяем функцию what_day, которая принимает указатель на структуру struct_date и возвращает номер дня недели (0 - воскресенье, 1 - понедельник и т.д.)
- В функции what_day используем готовую формулу для вычисления дня недели в заданном году, месяце и дне
- Объявляем функцию Holliday, которая принимает введенный пользователем год и массив mas_pr с праздничными датами
- В функции Holliday используем цикл for для проверки каждого элемента массива mas_pr и вычисления дня недели с помощью функции what_day
- Если день недели равен 6 или 0 (это выходные дни), выводим сообщение о том, что праздник совпадает с выходным указанной даты
- В функции main устанавливаем локальную настройку на русский язык с помощью функции setlocale
- Вызываем функцию Holliday, чтобы начать выполнение программы
- Возвращаем 0, чтобы указать, что программа успешно завершилась
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д