文章目录
- 题目十九:编写一万年历系统
- 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;
}




















