C语言练手项目--C 语言编写万年历

一、需求

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");

}

3、运行结果

在这里插入图片描述

三、参考链接

1、万年历——C语言版本
2、算法系列之十七:日历生成算法-中国公历(格里历)(上)

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读