最近在通过 https://www.codewithc.com/mini-project-in-c-calendar/ 这个网站上的一些c语言小程序练习。这个日历就是其中的一个小练习。
目录
功能&效果图
这个日历📅主要可以实现以下几种功能:
游戏菜单
- 可以通过输入一个具体的日期,查询这一天是星期几
- 可以添加notes到一个指定的日期
- 通过输入一个月份,可以展示这个月的日历。存有notes的日期会用不同颜色显示。
- 用户可以选择查看这个月份里存有的笔记(暂时没有通过输入日期查询当天笔记的功能)
- 可以通过左右键,查看不同的月份
流程图
代码
实现功能1
功能1最主要的就是计算,根据一个日期,来计算那一天是星期几。
首先需要一个参照日期,这里我设的是2010-5-31,星期一。然后根据计算前后过去了多少天,来计算某一天是星期几。
⚠️不只是要计算过去了几天,还要分清楚是在参照日期之前还是之后。
计算流程图
先用一个流程图总结一下计算的逻辑
⚠️在计算输入日期与参照日期差了几天的时候,计算的结果是包括这两个日期在内的。这样做是因为在不同年的时候,会分别讨论其中的两个年份,如果不包括那么计算结果最后就会少一天。看图比较直接⬇️
为了简介,输入简写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 ||