当前位置:C++技术网 > 资讯 > 自己写的c语言万年历代码

自己写的c语言万年历代码

更新时间:2015-06-27 17:21:22浏览次数:1+次

   程序运行截图:

C语言万年历 万年历截图

以下是C语言写的万年历的源代码,有点小错误:


#include<stdio.h>
int year,month;
int emonth[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int isrun(int y)//判断是否是闰年的自定义函数,原谅我英文渣拼音也掺了。。
{
    if (y%4==0&&y%100!=0||y%400==0)
        return 1;
    else
        return 0;
}
int ydays(int y)//传递年数,判断该年有多少天
{
    if (isrun(y))
        return 366;
    else
        return 365;
}
int yfd(int a)//传递年数,计算出该年第一天是星期几的自定义函数
{
    int i,s=0;
    if (a>2015)
    {
        for (i=2015;i<a;i++)
            s+=ydays(i);
        s=(s+4)%7;
    }
    else if (a<2015)
    {
        for (i=2015;i<a;i--)
            s+=ydays(i);
        s=(s+4)%7;
    }
    else
        s=4;
    return s;
}
int mfd(int yf,int n)//传递该月当年第一天是星期几以及第几月,返回该月第一天是星期几的自定义函数
{
    int s=0,i;
    if (isrun(year)&&n>2)//如果该年是闰年并且月数是二月以上就会多出一天加上
        s=1;
    for (i=0;i<n-1;i++)
        s+=emonth[i];
    s=(s+yf)%7;
    return s;
}
void display(int f)//显示
{
    int a,b=f,i;
    a=emonth[month-1];
    if((isrun(year)&&month==2)//如果正好是2月就要多加一天
        a++;
    printf(" 日 一 二 三 四 五 六\n");
    while(b--)
        printf(" ");
    b=f;
    for (i=1;i<=a;i++,b++)
    {
        printf("%4d",i);
        if (b%7==6)
            printf("\n");
    }
    printf("\n");
}
int main()
{
    while (1)
    {
        printf("请输入年份,月数,空格隔开:");
        scanf("%d%d",&year,&month);
        display(mfd(yfd(year),month));
        printf("\n");
    }
    return 0;
}

下面是codexia帮我纠正过的代码,运行正确,请对比你参考学习

#include<stdio.h>
#include <time.h>
int year,month;
const int emonth[12]={31,28,31,30,31,30,31,31,30,31,30,31};
bool IsLeapYear(int iYear)//判断是否是闰年的自定义函数,原谅我英文渣拼音也掺了。。
{
    if (iYear%4==0 && iYear%100!=0 || iYear%400==0)
        return true;
    else
        return false;
}
int GetDayofYear(int iYear)//传递年数,判断该年有多少天
{
    if (IsLeapYear(iYear))
        return 366;
    else
        return 365;
}
int GetWeekofYearDay(int iYear)//传递年数,计算出该年第一天是星期几的自定义函数
{
    struct tm * ptmDateTime;
    time_t ttLocalTime;
    time( &ttLocalTime );   // - 获取long型时间
    ptmDateTime = localtime( &ttLocalTime ); // - 转换成本地时间
    // - tm的解释,见《时间日期结构体tm详细解释 http://www.cjjjs.com/cpp/235531571769.aspx》
    // - time和localtime的使用见《localtime函数(time_t转换tm)转换成本地时间 http://www.cjjjs.com/cpp/235142351873.aspx》
    int i,iDay=0;
    if (iYear > ptmDateTime->tm_year)
    {
        for (i=ptmDateTime->tm_year;i<iYear;i++)
            iDay +=GetDayofYear(i);
        iDay = (iDay+4)%7;
    }
    else if(iYear < ptmDateTime->tm_year)
    {
        for (i=ptmDateTime->tm_year;i<iYear;i--)
            iDay +=GetDayofYear(i);
        iDay=(iDay+4)%7;
    }
    else
    {
        iDay=4;
    }
    return iDay;
}
int GetWeekofMonthFirstDay(int iWeek,int iMonth)//传递该月当年第一天是星期几以及第几月,返回该月第一天是星期几
{
    int iDay=0,i;
    if(IsLeapYear(year)&&iMonth>2)//如果该年是闰年且月数大于二,会多出一天加上
        iDay=1;

    for(i=0;i<iMonth-1;i++)
        iDay+=emonth[i];

    int iRetWeek = (iDay+iWeek)%7;

    return iRetWeek;
}
void display(int iWeek)//显示
{
    int iDayOfMonth = emonth[month-1];
    int b=iWeek-2,i;

    if(IsLeapYear(year) && month==2)//如果正好是2月就要多加一天
        iDayOfMonth++;

    printf("  日\t  一\t  二\t  三\t  四\t  五\t  六\t\n");

    while(b--)
        printf("\t");

    for (i=1;i<=iDayOfMonth;i++,iWeek++)
    {
        
        if (iWeek%7==1)
        {
            printf("%4d\t\n",i);
        }
        else
        {
            printf("%4d\t",i);
        }
    }
    printf("\n");
}
int main()
{
    while (1)
    {
        printf("请输入年份,月数,空格隔开:");
        scanf("%d%d",&year,&month);
        display(GetWeekofMonthFirstDay(GetWeekofYearDay(year),month));
        printf("\n");
    }
    return 0;
}