栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

全部加起来不过50行代码

//万年历1600年1月1日--星期六
#include 

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("%dt", i);
        cnt++;
        if(cnt%7 == 0){
            printf("n");
        }
    }
    return 0;
}

出的空格

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/346958.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号