Напечатать список дней заданного месяца года - 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;
}

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

  1. Программа начинается с объявления функции is_leap_year, которая проверяет является ли год високосным.
  2. Затем объявляется массив month_days, который содержит количество дней в каждом месяце для обычного и високосного года.
  3. В функции main происходит запрос на ввод года и месяца с помощью функций scanf и printf.
  4. Если введенные значения не удовлетворяют условиям (год от 1970 до 2020, месяц от 1 до 12), то выводится сообщение об ошибке и выполнение программы продолжается с начала цикла.
  5. В цикле while происходит заполнение структуры tm значениями введенного года и месяца.
  6. Затем с помощью функции mktime создается объект tm, который содержит дату и время, и сохраняется в переменной t.
  7. Объект tm присваивается значению localtime(&t), которое возвращает объект tm с текущей датой и временем.
  8. Переменная day устанавливается равной 1, а переменная pos устанавливается равной 0.
  9. Если день недели (wday) меньше 1, то переменная day увеличивается на 1, а переменная pos устанавливается равной 0.
  10. Если день недели равен 1, то переменная pos устанавливается равной 0.
  11. Если день недели меньше 4, то переменная day увеличивается на 4 - wday, а переменная pos устанавливается равной 1.
  12. Если день недели равен 4, то переменная pos устанавливается равной 1.
  13. Если день недели больше или равен 8, то переменная day увеличивается на 8 - wday, а переменная pos устанавливается равной 0.
  14. Выводится сообщение Visiting days: и в цикле while выводятся числа от 1 до 31 с шагом 3 или 4 (в зависимости от значения переменной pos).
  15. После окончания цикла выводится символ \n.
  16. Программа возвращает 0, что означает успешное завершение работы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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