简单万年历

功能:输入年份,输出全年十二个月份,输入年月,输出当年的当前月份,输入年月日,输出当年当前月份,并将日期高亮,输入“+”查看下月日历,“-”查看上月日历

就算某月某天是星期几用的公式是 “泽勒一致性”,也叫“蔡勒公式”

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

//判断每个月的第一天是星期几,
int judgeFirstDate(int year, int m, int q)
{
    if(m == 1 || m == 2)
    {
        m += 12;//如果月份为1,2,则表示为去年的13,14月,年份也改为去年
        --year;
    }
    int j = year / 100;//j表示世纪
    int k = year % 100;//k表示本世纪的第几年
    int h = (q + 26*(m+1)/10 + k + k/4 + j/4 + 5*j) % 7;//h=0为周六,h=1为周日,依次类推
    return h;
}

//处理周几,把h=0为周六改为h=0为周日,把h=1为周日改为h=1为周一,依次类推
int judgeWeek(int week)
{
    if(!week)
        return 6;
    else
        return --week;
}

//把输入的字符串转换为数字年份
void input(char* cTime, int* year, int* month, int* day)
{
    int len = strlen(cTime);
    if(cTime[0] == '+')
    {
        ++(*month);
        return;
    }
    else if(cTime[0] == '-')
    {
        --(*month);
        return ;
    }
    *year = *month = *day = 0;
    *year = atoi(cTime);
    if(len >= 6)
        *month = atoi(cTime+5);
    if(len >= 8)
        *day = atoi(cTime+7);
}

//判断是不是闰年
int isLeapYear(int year)
{
    if((year%400 == 0) || (year%4 == 0 && year%100 != 0))
        return 1;
    return 0;
}

//输出月份最上边的哪个导航
void outputWeek()
{
    printf("Sunday    Monday    Tuesday   Wednesday Thursday  Friday    Saturday\n");
}

//判断某年某个月份有几天
int monthDay(int year, int month)
{
    int judge = isLeapYear(year);
    switch(month)
    {
    case 1: case 3: case 5: case 7: case 8: case 10: case 12:
        return 31; break;
    case 4: case 6: case 9: case 11:
        return 30; break;
    case 2:
        return judge == 1 ? 29 : 28;
        break;
    }
    return 0;
}

//输出某年的某个月
void outputOneMonth(int year, int month, int day)
{
    int i;
    int dayNum = monthDay(year,month);
    int week = judgeFirstDate(year,month,1);
    week = judgeWeek(week);
    outputWeek();
    for(i = 0; i < week; ++i)
        printf("          ");
    for(i = 1; i <= dayNum; ++i)
    {
        if(day == i) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
                                             FOREGROUND_GREEN | FOREGROUND_INTENSITY);
        printf("%-10d",i);
        if(day == i) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
                        FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
        if((week+1)%7 == 0)
            printf("\n");
        ++week;
    }
    if(week %7 != 0)
        printf("\n");
}

//输出一年的所有月份
void outputAllMonth(int year)
{
    int i;
    for(i = 1; i <= 12; ++i)
    {
        outputOneMonth(year,i,0);
        printf("\n");
    }
}

int main()
{
    int year,month,day;
    char cTime[11];
    while(fgets(cTime,11,stdin))
    {
        //读入数据
        input(cTime,&year,&month,&day);
        printf("%d",year);
        if(month == 0)
        {
            printf("\n");
            //输出一年的所有月份
            outputAllMonth(year);
        }
        else
        {
            printf(".%d",month);
            if(day != 0)
                printf(".%d",day);
            printf("\n");
            //输出某个月份
            outputOneMonth(year,month,day);
        }
        printf("+:last month\n-:next month\n");
    }
    return 0;
}

结果:




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值