您的位置:首页 > 编程语言 > C语言/C++

C语言实验:输入任意一个年份和月份,输出该月份的公历日历

2013-03-27 08:06 791 查看
利用吉姆拉尔森公式,详见初等数论,注意控制格式。

看不懂c++的童鞋,把所有cin理解为scanf,把cout理解为printf,这个程序是小时候写的,所有不想改了。

#include "iostream"

using namespace std;

int main()
{
    int m,d,monthmax,y;
    while(1)
    {
        cout<<"请输入年份:";
        cin>>y;

        cout<<"请输入月份:";
        cin>>m;

        cout<<endl;

        //判断年份和月份
        if(y%4==0||(y%100==0&&y%400==0))//闰年
        {
            if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
                monthmax=31;
            if(m==2)
                monthmax=29;
            if(m==4||m==6||m==9||m==11)
                monthmax=30;
        }
        if(y%4!=0)//平年
        {
            if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
                monthmax=31;
            if(m==2)
                monthmax=28;
            if(m==4||m==6||m==9||m==11)
                monthmax=30;
        }

        //基姆拉尔森计算公式取得一号周几
        if(m==1||m==2)
        {
            m+=12;    //一月算做上一年的十三月,二月算做上一年的十四月
            y--;
        }
        d=(2+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;//算出这月一号周几
        if(d==0)
        {
            d=7;
        }
        //输出日历
        {
            {
                //标题模块
                if(m==13)
                {
                    cout<<"   公元"<<y+1<<"年 第1月日历"<<endl;
                }
                if(m==14)
                {
                    cout<<"   公元"<<y+1<<"年 第2月日历"<<endl;
                }
                if(m!=13&&m!=14)
                {
                    cout<<"   公元"<<y<<"年 第"<<m<<"月日历"<<endl;
                }
            }
            cout<<" 1   2   3   4   5   6   7   "<<endl<<"==========================="<<endl;
            for(int i=1; i<=d-1; i++)
            {
                cout<<"    ";
            }
            for(int j=1; j<=monthmax; j++)
            {
                if(j<10)
                {
                    cout<<" "<<j<<"  ";
                }
                if(j>=10)
                {
                    cout<<" "<<j<<" ";
                }
                if((j+d-1)%7==0)
                {
                    cout<<endl;
                }
                if(j==monthmax)
                {
                    cout<<endl;
                }
            }
            cout<<endl;
        }
    }
}


the results:



另一版本:

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

#define SIGN_WEEK 6
#define SIGN_YEAR 2000

using namespace std;

void calendar(int week,int year)
{
    int month_day[14]= {31,31,0,31,30,31,30,31,31,30,31,30,31,31};
    char month_name[12][10]= {"January","February","March","Apirl","May","June","July","August","September","October","November","December"};
    int i,j,n,m,num0=0,num1=31,nweek0=week,nweek1;
    if(year%4==0)
    {
        if(year%100!=0) month_day[2]=29;
        else
        {
            if(year%400==0) month_day[2]=29;
            else month_day[2]=28;
        }
    }
    else month_day[2]=28;
    printf("The calendar of the year %d\n\n",year);
    for(m=0; m!=12; m+=2)
    {
        if(m-1<0)
        {
            nweek0=week;
            nweek1=(week+num1%7)>7?(week+num1%7)-7:(week+num1%7);
        }
        else
        {
            num0=num0+month_day[m-1]+month_day[m];
            nweek0=(week+num0%7)>7?(week+num0%7)-7:(week+num0%7);
            num1=num1+month_day[m]+month_day[m+1];
            nweek1=(week+num1%7)>7?(week+num1%7)-7:(week+num1%7);
        }
        printf("%-10s %2d               %-10s %2d\n=========================== ===========================\nSun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat\n",month_name[m],m+1,month_name[m+1],m+2);
        for(i=nweek0,j=nweek1,n=0; j!=nweek1-6*7; j--)
        {
            if(n<7)
            {
                if(i>0) printf("%3d ",month_day[m]-i+1);
                else if(i<=0)
                {
                    if(i>-month_day[m+1]) printf("%3d ",-i+1);
                    else printf("%3d ",-i-month_day[m+1]+1);
                }
                i--;
                j+=1;
                n++;
            }
            else
            {
                if(j>0) printf("%3d ",month_day[m+1]-j+1);
                else if(j<=0)
                {
                    if(j>-month_day[m+2]) printf("%3d ",-j+1);
                    else printf("%3d ",-j-month_day[m+2]+1);
                }
                n++;
            }
            if(n==14)
            {
                printf("\n");
                n=0;
            }
        }
        printf("=========================== ===========================\n\n");
    }

}
void startWeek(int year)
{
    int start_week,days;
    if(year>SIGN_YEAR)
    {
        days=(year-SIGN_YEAR)*365+(year-SIGN_YEAR)/4-(year-SIGN_YEAR)/100+(year-SIGN_YEAR)/400+(((year-SIGN_YEAR)%4)+3)/4+((year-SIGN_YEAR)%400==0?0:((year-SIGN_YEAR)%100==0?1:0));
        start_week=(SIGN_WEEK+days%7)>7?(SIGN_WEEK+days%7)-7:(SIGN_WEEK+days%7);
    }
    else
    {
        days=(SIGN_YEAR-year)*365+(SIGN_YEAR-year)/4-(SIGN_YEAR-year)/100+(SIGN_YEAR-year)/400;
        start_week=(SIGN_WEEK-days%7)>0?(SIGN_WEEK-days%7):(SIGN_WEEK-days%7+7);
    }
    calendar(start_week,year);
}
int main()
{
    int year;
    printf("Enter year:");
    scanf("%d",&year);
    startWeek(year);
    return 0;
}


the result:



再一个版本:

#include <stdio.h>
long int f(int year,int month)
{
    if(month<3) return year-1;
    else return year;
}
long int g(int month)
{
    if(month<3) return month+13;
    else return month+1;
}

long int n(int year,int month,int day)
{
    return 1461L*f(year,month)/4+153L*g(month)/5+day;
}

int w(int year,int month,int day)
{
    return(int) ((n(year,month,day)%7-621049L%7+7)%7);
}

int date[12][6][7];
int day_tbl[ ][12]= {{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}};

int main()
{
    int sw,leap,i,j,k,wd,day;
    int year;
    char title[]="SUM MON TUE WED THU FRI SAT";

    printf("Please input the year whose calendar you want to know:\n");
    scanf("%d%*c",&year);

    sw=w(year,1,1);
    leap=year%4==0&&year%100||year%400==0;
    for(i=0; i<12; i++)
        for(j=0; j<6; j++)
            for(k=0; k<7; k++)
                date[i][j][k]=0;
    for(i=0; i<12; i++)
        for(wd=0,day=1; day<=day_tbl[leap][i]; day++)
        {
            date[i][wd][sw]=day;
            sw=++sw%7;
            if(sw==0) wd++;
        }
    printf("\n|================== The Calendar of Year %d==================|\n|",year);
    for(i=0; i<6; i++)
    {
        for(wd=0,k=0; k<7; k++)
            wd+=date[i][5][k]+date[i+6][5][k];
        wd=wd?6:5;
        printf(" %2d %s %2d %s|\n|",i+1,title,i+7,title);
        for(j=0; j<wd; j++)
        {
            printf("   ");
            for(k=0; k<7; k++)
                if(date[i][j][k])
                    printf("%4d",date[i][j][k]);
                else printf("    ");
            printf("   ");
            for(k=0; k<7; k++)
                if(date[i+6][j][k])
                    printf("%4d",date[i+6][j][k]);
                else printf("    ");
            printf("|\n|");
        }
    }
    puts("==============================================================|");
}


the results:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐