C语言万年历

示例1
示例2

示例3

示例4

示例5

示例6

示例7
完整代码如下:


#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
//非标准库控制台I/O
//平年月份表
const int mons[13]={
0,31,28,31,30,31,30,31,31,30,31,30,31}
;
//闰年月份表
const int mons2[13]={
0,31,29,31,30,31,30,31,31,30,31,30,31}
;
//中文星期列表
char *wd[]=
{
    "周日",
    "周一","周二",
    "周三","周四",
    "周五","周六",
    "unknown"
}
;
//系统当前日期时间
int *nowdatetime()
{
    char str1[200];
    char years[10];
    int *ym=(int*)malloc(2*sizeof(int));
    time_t dtime;
    time(&dtime);
    struct tm *tt;
    tt=localtime(&dtime);
    strftime(str1,200,"\n公元%Y年%m月%d日%H时%M分%S秒\n第%W周 第%j天\n",tt);
    printf(str1);
    printf("%s",wd[tt->tm_wday]);
    strftime(years,10,"%Y",tt);
    *(ym+1)=tt->tm_mon+1;
    *(ym+0)=atoi(years);
    return ym;
}
//获得星期几索引
int wday(int year,int mon,int mday)
{
    struct tm Timestr;
    Timestr.tm_year=year-1900;
    Timestr.tm_mon=mon-1;
    Timestr.tm_mday=mday;
    Timestr.tm_hour=0;
    Timestr.tm_min=0;
    Timestr.tm_sec=1;
    Timestr.tm_isdst=-1;
    if(mktime(&Timestr)==-1)
    return 7;
    return Timestr.tm_wday;
}
//判断是否闰年
int isleapyear(int year)
{
    int bool=0;
    if((year%4==0 && year%100!=0) || year%400==0)
    {
        bool=1;
    }
    return bool;
}
//输出月历明细  是2月判断平年还是闰年/判断1号是星期几
int showmon(int year ,int mon)
{
    int flag=0;
    //平闰年真假
    int index;
    //星期数组索引
    int mdays=mons[mon];
    //该月天数
    int m;
    //空格个数
    int k=0;
    //第一行个数
    if(mon==2)
    {
        //判断是否是2月,2月则判断平/闰年
        flag=isleapyear(year);
        mdays=mons[mon]+flag;
    }
    index=wday(year,mon,1);
    k=7-index;
    //获得该月1号是星期几索引
    printf("\n_________________________________________\n");
    printf("公元%d年%d月份\n",year,mon);
    printf("_________________________________________\n");
    printf(" 周日  周一  周二  周三  周四  周五  周六 \n");
    printf("_________________________________________\n");
    int i;
    for(i=0;i<6*index+3;i++)
    {
        printf(" ");
    }
    printf("1");
    for(i=2;i<=k;i++)
    {
        printf("%6d",i);
    }
    for(i=k+1;i<=mdays;i++)
    {
        if((i-k-1)%7==0)
        printf("\n%4d",i);
        else
        printf("%6d",i);
    }
    printf("\n_________________________________________\n");
    return 0;
}
int showmenu()
{
    int n;
    int year=2022;
    int mon=6;
    int day;
    int wdindex;
    int *p=NULL;
    printf("\n***************************************\n");
    printf("*                 万年历              *\n");
    printf("*          ___________________        *\n");
    printf("*            1–>系统日期时间          *\n");
    printf("*            2–>年月日查星期          *\n");
    printf("*            3–>输出整年月历          *\n");
    printf("*            4–>输出某月月历          *\n");
    printf("*            5–>判断闰年平年          *\n");
    printf("*            6–>某月最大天数          *\n");
    printf("*            7–>跳到今月月历          *\n");
    printf("*            0–>退出整个程序          *\n");
    printf("*                                     *\n");
    printf("***************************************\n");
    printf("请选择功能:");
    scanf("%d",&n);
    switch(n)
    {
        case 0:
        return 0;
        break;
        case 1:
        nowdatetime();
        break;
        case 2:
        printf("输入年份:");
        scanf("%d",&year);
        printf("输入月份:");
        scanf(" %d",&mon);
        printf("输入几日:");
        scanf(" %d",&day);
        wdindex=wday(year,mon,day);
        printf("\n公元%d年%d月%d日是%s\n",year,mon,day,wd[wdindex]);
        break;
        case 3:
        printf("输入年份:");
        scanf("%d",&year);
        for(int i=1;i<13;i++)
        showmon(year ,i);
        break;
        case 4:
        printf("输入年份:");
        scanf("%d",&year);
        printf("输入月份:");
        scanf(" %d",&mon);
        showmon(year ,mon);
        break;
        case 5:
        printf("输入年份:");
        scanf(" %d",&year);
        if(isleapyear(year))
        {
            printf("\n公元%d年是闰年\n",year);
        }
        else
        {
            printf("\n公元%d年平年\n",year);
        }
        break;
        case 6:
        printf("输入年份:");
        scanf(" %d",&year);
        printf("输入月份:");
        scanf(" %d",&mon);
        if(mon==2)
        {
            printf("\n公元%d年%d月,本月一共%d天\n",year,mon,mons[mon]+isleapyear(year));
        }
        else
        printf("\n公元%d年%d月,本月一共%d天\n",year,mon,mons[mon]);
        break;
        case 7:
        //int *p=NULL;
        p=nowdatetime();
        showmon(*p ,*(p+1));
        free(p);
        break;
        default:
        break;
    }
    getchar();
    return 0;
}
int main(int argc, char** argv)
{
    while(1)
    {
        showmenu();
        getchar();
        clrscr();
    }
    return 0;
}

  • 5
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

滴水不穿石

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值