#include "Calendar.h"
int isLeapYear(int year)
{
if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
{
return IS_LEAP_YEAR;
}
return 0;
}
int inputLegal(int month, int day)
{
if (month > 12 || month < 1 || day > 31 || day < 1)
{
fprintf(stderr,"Input is error\n");
return -1;
}
return 0;
}
/*
* 记录一个月之中最大的天数
*/
int maxMonthDay(int year, int month)
{
int ret;
int m[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
ret = isLeapYear(year);
if (ret == IS_LEAP_YEAR)
{
m[1] = 29;
}
#ifdef DEBUG
printf("month %d has %d day\n",month,m[month - 1]);
#endif
return m[month - 1];
}
/*
* 从该年的第一天到这天的总天数
*/
int totalDay(int year, int month, int day)
{
int sum = 0;
for (int i = 1;i < month;i++)
{
sum += maxMonthDay(year,i);
}
sum += day;
#ifdef DEBUG
printf("Total has %d day %d month\n",sum,month);
#endif
return sum;
}
/*
* 计算给出日期是星期几
*/
int weekday(int year, int month, int day)
{
int d;
if (month == 1 || month == 2)
{
year -= 1;
month += 12;
}
//吉姆拉尔森日期计算公式
d = (day + 2*month + 3*(month+1)/5 + year + year/4 - year/100 + year/400 + 1) % 7;
return d;
}
int displayWeek(int year, int month, int day)
{
int d = weekday(year,month,day);
switch (d)
{
case 0:
printf("%d-%d-%d is Sunday\n",year,month,day);
break;
case 1:
printf("%d-%d-%d is Monday\n",year,month,day);
break;
case 2:
printf("%d-%d-%d is Tuesday\n",year,month,day);
break;
case 3:
printf("%d-%d-%d is Wednesday\n",year,month,day);
break;
case 4:
printf("%d-%d-%d is Thursday\n",year,month,day);
break;
case 5:
printf("%d-%d-%d is Friday\n",year,month,day);
break;
case 6:
printf("%d-%d-%d is Saturday\n",year,month,day);
break;
default:
return 0;
}
return 0;
}
int displayMonth(int year, int month, int day)
{
int spaceCount,maxDay;
printf("\033[44;32m\n\t\t%d 年 %d 月\033[0m\n",year,month);
printf("SUN\tMON\tTUE\tWED\tTHU\tFRI\tSTA\n");
spaceCount = weekday(year,month,1);
for (int i = 0;i < spaceCount;i++)
{
printf("\t");
}
maxDay = maxMonthDay(year,month);
for (int i = 1;i <= maxDay;i++)
{
if (i != day)
{
printf("%d\t",i);
} else
{
printf("\033[44;32m%d\t\033[0m",i);
}
if ((spaceCount + i) % 7 == 0)
{
printf("\n");
}
}
printf("\n");
return 0;
}
int run()
{
int year; int month; int day;
printf("Input [year month day]:\n");
scanf("%d%d%d",&year,&month,&day);
inputLegal(month,day);
totalDay(year,month,day);
displayWeek(year,month,day);
displayMonth(year,month,day);
return 0;
}
#ifndef CALENDAR_CALENDAR_H
#define CALENDAR_CALENDAR_H
/*
* C 的学习
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define IS_LEAP_YEAR 1
#define DEBUG
#undef DEBUG
extern int isLeapYear(int year);
extern int maxMonthDay(int year, int month);
extern int displayMonth(int year, int month, int day);
extern int weekday(int year, int month, int day);
extern int displayWeek(int year,int month, int day);
extern int totalDay(int year, int month, int day);
extern int inputLegal(int month, int day);
extern int run();
#endif
#include "Calendar.h"
int main() {
run();
return 0;
}