文章目录
- 题目十九:编写一万年历系统
- calendar.h
- calendar.c
- test.c
题目十九:编写一万年历系统
要求: 模仿现实中的挂历,显示当前月的每一天及星期几,当系统日期变为下一个月时,自动翻页到下一个月。
calendar.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include"stdio.h"
#include"time.h"
#include"windows.h"
//判断闰年
int isLeapYear(int year);
//获取每个月的天数
int getDaysInMonth(int year, int month);
//获取某年某月某日的星期几 {星期日:0, 星期一 : 1星期二 : 2, 星期三 : 3, 星期四 : 4, 星期五 : 5, 星期六 : 6}
int getWeekday(int year, int month, int day);
//显示日历
void displayCalender(int year, int month);
// 运行年历系统
void runCalendar();
calendar.c
#include"calendar.h"
//判断闰年
int isLeapYear(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
//获取每个月的天数
int getDaysInMonth(int year, int month) {
switch (month)
{
case 1:case 3:case 5:case 7: case 8:case 10:case 12:
return 31;
case 4:case 6: case 9: case 11:
return 30;
case 2:
return isLeapYear(year) ? 29 : 28;
default:
return 0;
}
}
//获取某年某月某日的星期几
// {星期日:0, 星期一 : 1星期二 : 2,
// 星期三 : 3, 星期四 : 4, 星期五 : 5, 星期六 : 6}
int getWeekday(int year, int month, int day) {
struct tm time_in = { 0 };
//tm_year是从1900年开始算的
time_in.tm_year = year - 1900;
//tm_mon是0到11表示1月到12月
time_in.tm_mon = month - 1;
time_in.tm_mday = day;
//通过mktime函数计算星期几
mktime(&time_in);
return time_in.tm_wday;
}
//显示日历
void displayCalender(int year, int month) {
printf("===== %d年 %d月 =====\n", year, month);
printf("日 一 二 三 四 五 六\n");
//计算某年某月有多少天
int daysInMonth = getDaysInMonth(year, month);
//计算出某年某月的1号是星期几
int startDay = getWeekday(year, month, 1);
//打印空白,一个中文字符占2个空格,间隔是一个空格,所以打印三个空格
for (int i = 0; i < startDay; i++) {
printf(" ");
}
//打印日期
for (int j = 1; j <= daysInMonth; j++) {
printf("%2d ", j);
//一星期最后一天换行
if ((j + startDay) % 7 == 0) {
printf("\n");
}
}
printf("\n");
}
//运行日历
void runCalendar(){
time_t now = time(NULL);
struct tm* t = localtime(&now);
//获取当年年份
int currentYear = t->tm_year + 1900;
//获取当前月份
int currentMonth = t->tm_mon + 1;
displayCalender(currentYear, currentMonth);
while (1) {
time_t newNow = time(NULL);
struct tm* new_t = localtime(&newNow);
int newYear = new_t->tm_year + 1900;
int newMonth = new_t->tm_mon + 1;
//检查是否进入下一个月
if (newMonth != currentMonth || newYear != currentYear) {
currentYear = newYear;
currentMonth = newMonth;
displayCalender(currentYear, currentMonth);
}
//每隔一分钟检查一次
Sleep(60000);
}
}
test.c
获取当前系统时间
计算当前月的1号是星期几。
根据年份和月份,确定该月的天数。(闰年,一月到十二月天数)
显示该月的日历,按星期排列
进入下一个月时,更新日历(调试时间)
#include"calendar.h"
int main(){
/*
int test_1 = 0;
test_1= isLeapYear(2009);
//2009不是闰年 为0
printf("%d\n", test_1);
int test_2 = 0;
test_2=getDaysInMonth(2008, 2);
printf("%d\n", test_2);
int test_3 = 0;
//2024年9月26日是星期四
test_3 = getWeekday(2024, 9, 26);
printf("%d\n", test_3);
//输出是4
int test_4 = 0;
//2024年9月1日是星期日
test_4 = getWeekday(2024, 9, 1);
printf("%d\n", test_4);
//输出是0
displayCalender(2024, 9);
displayCalender(2024, 10);
*/
runCalendar();
return 0;
}