Напечатать список дней заданного месяца года - C (СИ)
Формулировка задачи:
(СИ)Вpач ведет пpием с 8.00 до 10.30 по понедельникам и четвеpгам. Напечатать список дней заданного месяца года, когда этот вpач ведет пpием в пеpвую смену (учитывать только pабочие дни).
Решение задачи: «Напечатать список дней заданного месяца года»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h> int is_leap_year(int year){ return ( ( year % 4 && ! ( year % 100 ) ) || year % 400 ); } int month_days[2][12] = { { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } }; int main(void){ int year, month, day, pos, delta[2] = {3, 4}; struct tm stm; time_t t; while ( printf("Year: ") && scanf("%d", &year) == 1 && printf("Month: ") && scanf("%d", &month) == 1 ){ if ( year < 1970 || year > 2020 || month < 1 || month > 12 ){ fprintf(stderr, "Wrong input!\n"); continue; } memset(&stm, 0, sizeof(struct tm)); stm.tm_year = year - 1900; stm.tm_mon = month - 1; stm.tm_mday = 1; stm.tm_min = 1; t = mktime(&stm); stm = *localtime(&t); day = 1; if ( stm.tm_wday < 1 ){ day += 1; pos = 0; } else if ( stm.tm_wday == 1 ){ pos = 0; } else if ( stm.tm_wday < 4 ){ day += 4 - stm.tm_wday; pos = 1; } else if ( stm.tm_wday == 4 ){ pos = 1; } else { day += 8 - stm.tm_wday; pos = 0; } printf("Visiting days:\n"); while ( day <= month_days[is_leap_year(year)][month - 1] ){ printf("%2d\n", day); day += delta[pos]; pos = ! pos; } printf("\n"); } return 0; }
Объяснение кода листинга программы
- Программа начинается с объявления функции is_leap_year, которая проверяет является ли год високосным.
- Затем объявляется массив month_days, который содержит количество дней в каждом месяце для обычного и високосного года.
- В функции main происходит запрос на ввод года и месяца с помощью функций scanf и printf.
- Если введенные значения не удовлетворяют условиям (год от 1970 до 2020, месяц от 1 до 12), то выводится сообщение об ошибке и выполнение программы продолжается с начала цикла.
- В цикле while происходит заполнение структуры tm значениями введенного года и месяца.
- Затем с помощью функции mktime создается объект tm, который содержит дату и время, и сохраняется в переменной t.
- Объект tm присваивается значению localtime(&t), которое возвращает объект tm с текущей датой и временем.
- Переменная day устанавливается равной 1, а переменная pos устанавливается равной 0.
- Если день недели (wday) меньше 1, то переменная day увеличивается на 1, а переменная pos устанавливается равной 0.
- Если день недели равен 1, то переменная pos устанавливается равной 0.
- Если день недели меньше 4, то переменная day увеличивается на 4 - wday, а переменная pos устанавливается равной 1.
- Если день недели равен 4, то переменная pos устанавливается равной 1.
- Если день недели больше или равен 8, то переменная day увеличивается на 8 - wday, а переменная pos устанавливается равной 0.
- Выводится сообщение
Visiting days:
и в цикле while выводятся числа от 1 до 31 с шагом 3 или 4 (в зависимости от значения переменной pos). - После окончания цикла выводится символ
\n
. - Программа возвращает 0, что означает успешное завершение работы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д