linux cal日历命令
效果图
思路是已知2000年1月1日的星期,然后当前日期减去它算出相差天数,计算出查询月的首天是星期几,最后将三个月份装入3个数组显示出来。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int Day[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
void print_head(int month)
{
printf(" %d月 %d月 %d月\n\
一 二 三 四 五 六 日 一 二 三 四 五 六 日 一 二 三 四 五 六 日\n",month-1, month,month+1);
}
//找到本月第一天是星期几
int first_day(int nowYear, int month)
{
int sum = 0;
int i = 0;
int j = 0;
//从2000至本年
for (i = 2000; i < nowYear; i++) {
//是闰年
if (is_leap_year(i)) {
sum += 1;
}
for (j = 1; j <= 12; j++) {
sum += Day[j];
}
}
//本年的天数
for (i = 1; i < month; i++) {
if (i == 2) {
if (is_leap_year(nowYear)) {
sum += 1;
}
}
sum += Day[i];
}
return (sum-2) % 7;
}
int is_leap_year(int year)
{
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
//将月份填进一个数组块里
void fill_day(int arr1[][7], int nowYear, int month)
{
int startDay = 0, i = 0, j = 0, flag = 0;
for (i = 0; i < 6; i++) {
for (j = 0; j < 7; j++) {
if (j == first_day(nowYear, month) && i == 0) {
flag = 1;
}
if (flag == 1) {
startDay += 1;
}
arr1[i][j] = startDay;
//达到月数截止日期,停止计数
if (arr1[i][j] > Day[month]) {
startDay = 0;
flag = 0;
if (!is_leap_year(nowYear)) {
arr1[i][j] = 0;
}
}
}
}
}
int main()
{
int month = 3;
printf("请输入需要查询月份:");
scanf("%d", &month);
int nowYear = 2018;
int fday = first_day(nowYear, month);
//printf("%d\n", fday);
int arr1[6][7] = { 0 };
int arr2[6][7] = { 0 };
int arr3[6][7] = { 0 };
print_head(month);
fill_day(arr1, nowYear, month-1);
fill_day(arr2, nowYear, month);
fill_day(arr3, nowYear, month+1);
int i = 0, j = 0;
//逐行打印
for (i = 0; i < 6; i++) {
for (j = 0; j < 7; j++) {
if (arr1[i][j]==0)
printf(" ");
else
printf("%2d ", arr1[i][j]);
}
printf(" ");
for (j = 0; j < 7; j++) {
if (!arr2[i][j])
printf(" ");
else
printf("%2d ", arr2[i][j]);
}
printf(" ");
for (j = 0; j < 7; j++) {
if (!arr3[i][j])
printf(" ");
else
printf("%2d ", arr3[i][j]);
}
printf("\n");
}
system("pause");
}