C语言-实现简单万年历(考虑历法问题,设1600年为基准年)

难点在于找到距离设定的基准日期的天数
1600年1月1日是周六
因此距离这一天00:00的天数如果是7的倍数,那么这天也是周六
故统计目标年份月份的1号距离1600年1月1日00:00的天数days
(days+5)%7便是该月日历中需要先输出的空格

全部加起来不过50行代码

//万年历1600年1月1日--星期六
#include <stdio.h>

int main(){
    int year, month, day;
    int i, j, cnt = 0;               //cnt输出日历时用于计数
    int arr[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    char str[7][16] = {"一", "二", "三", "四", "五", "六", "日"};

    printf("请输入年/月/日(1600起):");
    scanf("%d/%d/%d", &year, &month, &day);

    while(year < 1600 || month < 1 || month > 12 || day < 1 || day > arr[month-1]){
        if(year%4 == 0 && year%100 != 0 || year%400 == 0){
            if(month == 2 && day == 29)  break;       //特殊日子一个退出循环条件
        }
        printf("输入日期有误,请重新输入:");
        scanf("%d/%d/%d", &year, &month, &day);
    }

    int days = 0;                    //以下两个for循环记录所有月份总天数days,其实闰年加2,平年加1就行了
    for(i = 1600; i < year; i++){
        if(i%4 == 0 && i%100 != 0 || i%400 == 0){
            days+=1;
        }
        days+=365;
    }
    if(year%4 == 0 && year%100 != 0 || year%400 == 0){
        arr[1]++;
    }
    for(i = 0; i < month-1; i++){
        days+=arr[i];
    }
    printf("%d年%d月%d日是星期%s.\n", year, month, day, str[(days+day+4)%7]);
    printf("%d年%d月\n", year, month);
    printf("一\t二\t三\t四\t五\t六\t日\n");   //输出开头

    for(i = 0; i < (days+5)%7; i++){
        printf(" \t");
        cnt++;
    }
    for(i = 1; i <= arr[month-1]; i++){
        printf("%d\t", i);
        cnt++;
        if(cnt%7 == 0){
            printf("\n");
        }
    }
    return 0;
}

出的空格

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值