Создать календарь на год - C (СИ)
Формулировка задачи:
помогите пожалуйста составить календарь,так что бы при вводе года на экран выводился календарь на весь год.
Решение задачи: «Создать календарь на год»
textual
Листинг программы
#include <stdio.h>
#include <time.h>
int main()
{ time_t now;
struct tm * timeinfo;
int year, m, i, j;
char* month[] = { "January","February", "March","April", "May","June",
"July", "August","September","October", "November","December"};
printf ("YEAR: "); scanf ("%d",&year);
time (&now); //get current timeinfo and modify it to the user's choice
timeinfo = localtime (&now);
timeinfo->tm_year = year-1900; //years numerated from 1900
timeinfo->tm_mon = 0;
m =-1;
while(m<12)
{ for(i=1; i<33; i++) //year days with "overload"
{ timeinfo->tm_mday = i;
mktime (timeinfo); //call mktime: the whole timeinfo for the day will be set
if(timeinfo->tm_mon > m) //"end month" event, "overload" processing
{ printf("\n %s\n",month[timeinfo->tm_mon]);
printf("<br>\n");
printf(" Su Mo Tu We Th Fr Sa\n");
printf("<br>\n");
for(j=0;j<(timeinfo->tm_wday);j++)
printf(" ");
m++;
break;
}
if (m==11 && timeinfo->tm_mon ==0) //"end year" event
{ m++;
break;
}
printf("%4d",timeinfo->tm_mday); //routine
if(timeinfo->tm_wday==6)//"end week" event
printf("\n");
}
}
getchar();getchar();
return 0;
}
Объяснение кода листинга программы
Вот список действий, которые выполняются в коде:
- Подключение необходимых библиотек
- Инициализация переменных: year, m, i, j, timeinfo
- Создание массива month с названиями месяцев
- Ввод года с клавиатуры и сохранение его в переменной year
- Получение текущего времени и сохранение его в переменной now
- Приведение текущего времени к выбранному пользователем году
- Инициализация переменной m значением -1
- Запуск цикла while, который выполняется 12 раз
- Внутри цикла while запускается внутренний цикл for, который выполняется 32 раза
- Внутри внутреннего цикла for вычисляется день месяца и сохраняется в переменной timeinfo->tm_mday
- Вызов функции mktime для установки полного времени для текущего дня
- Проверка, если месяц в timeinfo больше текущего месяца m
- Если условие выполняется, то выполняется следующие действия: a. Вывод названия текущего месяца на экран b. Вывод пустой строки c. Вывод дня недели (времяinfo->tm_wday) в виде пробелов d. Увеличение значения m на 1 e. Выход из внутреннего цикла for с помощью оператора break
- Если условие выполняется (m==11 && timeinfo->tm_mon ==0), то выполняется следующие действия: a. Увеличение значения m на 1 b. Выход из внутреннего цикла for с помощью оператора break
- Вывод номера дня месяца в формате DD в виде пробелов
- Если времяinfo->tm_wday равно 6 (суббота), то выполняется вывод символа новой строки
- В конце программы добавлен вызов функции getchar() для обработки ввода пользователя, затем вызов функции getchar() и возврат 0, что означает успешное завершение программы