Напечатать список дней заданного месяца года - 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, что означает успешное завершение работы.