版权声明:本文为博主原创文章,如要转载,请注明地址,谢谢^...^ https://blog.csdn.net/qq_38880380/article/details/84938809
一、需求
C语言实现日历
二、实现
1、思路
(1)日历规则
重点一:2月的天数,对应是四年一闰,百年不闰,四百年再润
重点二:日期与周几的关系,依据是1900年1月1日是周一,之后根据天数差别计算就行
2、代码
#include <stdio.h>
#include <stdlib.h>
typedef enum {
false, true
} bool;
int leap(int);
int dayCount(char *);
void layout(char *, char *);
int main(int argc, char **argv)
{
if (argc != 3) {
printf("Please input %s year month like <%s 2018 11>\n", *argv, *argv);
return 0;
}
layout(argv[1], argv[2]);
return 0;
}
/* 判断闰年平年 */
int leap(int year)
{
if (year % 400 == 0) {
return 1;
}
if (year % 100 != 0 && year % 4 == 0) {
return 1;
}
return 0;
}
/* 统计之前年份的所有天数 */
int dayCount(char *str)
{
/* day count of the previous year */
int tmp = atoi(str);
int count = 365 * (tmp - 1900);
for (int i = 1900; i < tmp; i++) {
if (leap(i) == 1) {
count++;
}
}
return count;
}
/* 输出对应月份日历 */
void layout(char *str1, char *str2)
{
int mouth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
/* 统计输入年月前的所有天数 */
int tmp = atoi(str1);
int daySum = dayCount(str1);
int mouthNum = atoi(str2);
if (mouthNum == 2) {
daySum += 31;
}
if (mouthNum > 2) {
if (leap(tmp) == 1) {
daySum++;
}
for (int i = 0; i < (mouthNum - 1); i++) {
daySum += mouth[i];
}
}
printf("日 一 二 三 四 五 六\n");
bool flag = false; /* 区别weekday用空格或者日期表示的标志 */
int space = 0;
int number = 1;
daySum++; /* 先显示周日,故加上1 */
for (int i = 0; i < mouth[mouthNum - 1] + (daySum % 7); i++) {
if ((daySum % 7) == space) {
flag = true;
}
if (!flag) {
printf(" ");
} else {
printf("%d", number);
if (number < 10) printf(" ");
number++;
}
printf(" ");
space++;
if (space % 7 == 0) {
printf("\n");
}
}
printf("\n");
}