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;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值