用c语言写日历--mac

本文介绍了使用C语言编写的一款多功能日历程序,包括计算日期对应星期、添加笔记、显示日历等功能。用户可以查询特定日期的星期,添加和查看笔记,并通过按键浏览不同月份。文章详细讲解了代码实现逻辑,涉及不同功能的函数如`differentYear`、`sameYear`等,并提供了完整的源代码。
摘要由CSDN通过智能技术生成

最近在通过 https://www.codewithc.com/mini-project-in-c-calendar/ 这个网站上的一些c语言小程序练习。这个日历就是其中的一个小练习。

功能&效果图

这个日历📅主要可以实现以下几种功能:

游戏菜单
菜单

  1. 可以通过输入一个具体的日期,查询这一天是星期几
    在这里插入图片描述
  2. 可以添加notes到一个指定的日期
    在这里插入图片描述
  3. 通过输入一个月份,可以展示这个月的日历。存有notes的日期会用不同颜色显示。
    在这里插入图片描述
  4. 用户可以选择查看这个月份里存有的笔记(暂时没有通过输入日期查询当天笔记的功能)
    在这里插入图片描述
  5. 可以通过左右键,查看不同的月份

流程图

收到1
收到2
收到左右键
收到3
收到m
收到其他
收到s
打印目录
让用户输入日期
输出星期几
说明
让用户输入月份
打印日历
输入日期&笔记
存到指定文件
退出
打印当月笔记

代码

实现功能1

功能1最主要的就是计算,根据一个日期,来计算那一天是星期几。
首先需要一个参照日期,这里我设的是2010-5-31,星期一。然后根据计算前后过去了多少天,来计算某一天是星期几。
⚠️不只是要计算过去了几天,还要分清楚是在参照日期之前还是之后。

计算流程图

先用一个流程图总结一下计算的逻辑
⚠️在计算输入日期与参照日期差了几天的时候,计算的结果是包括这两个日期在内的。这样做是因为在不同年的时候,会分别讨论其中的两个年份,如果不包括那么计算结果最后就会少一天。看图比较直接⬇️

为了简介,输入简写S,参照简写C

同月
不同月
S与C隔了多少天
同年
日之差+1
单独讨论S月和C月
加上中间月
不同年
单独讨论S年和C年
加上S和C的中间年份

函数:differentYear

typedef struct Date{
   
	int year;
	int month;
	int day;
	int whatDay;//星期几
}date;
//这个函数的参数依然是参照日期和输入日期,但是是两个事先确定好了先后的日期。
int differentYear(date smaller, date bigger){
   //不同年
	int sum = 0;
	
	//算出来中间的那些年
	for(int i = smaller.year + 1; i < bigger.year; i++){
   
		if( (i % 100 != 0 && i % 4 == 0) || i % 400 == 0 ) {
   //非整百,但能整除4,整百且能整除400为闰年
			sum += 366;
		}
		else{
   
			sum += 365;
		}
	}
	//单独计算参照年和输入年
	//其中较小的年份与同年12月31日做计算
	//较大的年份与同年1月1日计算
	
	date smallerLimit = {
   smaller.year, 12, 31, 0}; 
	date biggerLimit = {
   bigger.year, 1, 1, 0};
	
	
	sum += sameYear(smaller, smallerLimit );
	sum += sameYear( biggerLimit, bigger);

	return sum;
}

函数:sameYear

int sameYear(date smaller, date bigger){
   
	int sum = 0;
	
	if(smaller.month == bigger.month){
   //同年同月
	//注意这两个参数在比较先后的时候,只具体到了月份,而不是日期。所以同年同月的情况下,smaller不一定就是靠前的日期。所以采用绝对值
		sum += abs(smaller.day - bigger.day) + 1;
	}
	else{
   //同年不同月
		//单独算出那两个月
		//较小的月份
		if(smaller.month == 4 || smaller.month == 6 || 
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值