用C语言编写程序打印任意年份的日历

已知2000年1月1日为星期六,输入任意年份后,打印该年份的年历。
谢谢了。。。

看要这样不? 下图:

#include <stdio.h>

#include <math.h>

#include <stdlib.h>

int qq(int x,int t)

{

 int i=0,p,s=365,y,j,b,k=1,h=1,u=0;

    int a[13];

    FILE *fp;

    fp=fopen("tai.txt","a+");

 i=0;k=1;h=1;u=0;

     printf("\t^^^^^^^^^^^^^\t%d年%d月份\t^^^^^^^^^^^^^^^^\n\n",x,t);

        fputs("\t^^^^^^^^^^^^^^^^",fp);

  fputc(x/1000+48,fp);

  fputc(x/100%10+48,fp);

  fputc(x/10%10+48,fp);

  fputc(x%10+48,fp);

  fputs("年",fp);

  fputc(t/10+48,fp);

  fputc(t%10+48,fp);

  fputs("月份^^^^^^^^^^^^^^^^^^^^^^^",fp);

  fputs("\n\n",fp);

    {for(p=1900;p<=x;p++)

        if(p%4==0&&p%100!=0||p%400==0) i++;

        if(x%4==0&&x%100!=0||x%400==0) s=i*366+(x-1900-i)*365;

        else s=i*366+(x-1900-i)*365+1;

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

   fputs("\t日\t一\t二\t三\t四\t五\t六\n",fp);

      for(i=1;i<=t;i++) 

     {if(i==2||i==4||i==6||i==8||i==9||i==11) u+=31;

      if(i==5||i==7||i==10||i==12) u+=30;

      if(i==3){if(x%4==0&&x%100!=0||x%400==0) u+=29;

        else u+=28;};

     };

      for(i=1;i<=12;i++) 

     {if(i==1||i==3||i==5||i==7||i==8||i==10||i==12) a[i]=31;

      if(i==4||i==6||i==9||i==11) a[i]=30;

      if(i==2){if(x%4==0&&x%100!=0||x%400==0) a[i]=29;

        else a[i]=28;};

     };

      b=a[t];

      y=(s%7+u)%7;

      for(i=1;i<=6;i++)

     {

    for(j=1;j<=7;j++)

    {

     if(h<=y) {printf("\t");fputc('\t',fp);};

     if(h>y)  {if(k<=b) {printf("\t%d",k); fputc('\t',fp); if (k>9) fputc(k/10+48,fp),fputc(k%10+48,fp) ; else fputc(k+48,fp) ; };

        if(k==b+1) {printf("\n");fputc('\n',fp);};

              k++;  };

           h++;

    };

      printf("\n");fputs("\n",fp);

     };

    };

    printf("\t***************************************************\n\n");

 fputs("\t***************************************************",fp);

 fputs("\n\n",fp);

 fclose(fp); 

 return (0);

}

main()

{

    int x,t,q,e,i,c,cc,xx,tt;

 float p,pp;

 FILE *fp; 

 if((fp=fopen("tai.txt","w"))==NULL)

 {printf("error!");

 exit(0);

 }

    fclose(fp);

do{

    printf("请输入你要查询的年份和月份,\n");

    printf("输入格式为:“年+空格+月+Enter”。(年份 >=1900)");

    printf("(若想显示全年,则输“年+空格+0+Enter”)。比如“2012+空格+0+Enter”)\n");

 printf("(若想输出XXXX到xxxx年的全年,则输“年+空格+年+Enter”)。比如“2010+空格+2012+Enter”)\n");

 printf("(若想显示xxxx年的前或后x年,则输“年+空格+.x+Enter”)。比如2010的前3年,则输入“2010+空格+“-.3”+Enter”)\n");

 printf("(若想显示xxxx年的m月前或后x个月,则输“年+空格+m.x+Enter”)。比如2010的5后3个月,则输入“2010+空格+“+5.3”+Enter”)\n");

    scanf("%d%f",&x,&p);

    pp=p*10;

 c=(int)pp;

 cc=c%10;

    xx=x;

 t=abs((int)p);

 tt=t;

 if(x<1900) {printf("输入不合要求,请重新输入!!");q=1;}

    

    else if(x>=1900&&(t>0&&t<=12)&&cc==0)//输出指定的年月份。

 { qq(x,t);}

    

    else if(x>=1900&&t==0&&cc==0)//输出指定的整年。

 { for(t=1;t<=12;t++)

      qq(x,t);}

    else if(x>=1900&&t>=1900)//输出xxxx年到xxxx年的整年。

 { for(i=xx;i<=tt;i++,x++)

           for(t=1;t<=12;t++)

      qq(x,t);}

    else if(x>=1900&&p<1.0&&tt==0)//输出xxxx年的前或后x年。

 {

     if(cc+x<1900&&tt==0)

   printf(" 输入的前年份过多。");

        else if(cc>0)

  {for(i=0;i<=cc;i++,x++)

         for(t=1;t<=12;t++)

        qq(x,t);}

     else {for(i=cc;i<=0;i++,x--)

           for(t=1;t<=12;t++)

     qq(x,t);}

 }

 else if(x>=1900&&t<=12&&t>=1&&cc!=0)//输出xxxx年的m月前或后x个月。“呵呵 你自己想象“让前或后x个月问任何数””

 { 

   if(cc>0)

   {for(tt=0;tt<=cc;tt++,t++)

   {  if(t>12) qq(x+1,t-12);

      else qq(x,t);}}

   else{for(tt=0;tt>=cc;tt--,t--)

   {  if(t<1) qq(x-1,t+12);

      else qq(x,t);}}

 }

  

}

    while(q==1);

scanf("%d",&e);

if(e)exit(0);

}

这是我的一个朋友写的!

参考一下!

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-03-19
#include <stdio.h>
#include <conio.h>
int main()
{
int year=0;
int month=0;
int dw=0;
int sumDays=0;
int currMonthDays=0;
int i,flag=0,temp;
//scanf("%d%d",&year,&month);
printf("输入年份:\n");
scanf("%d",&year);

for(i=1900;i<year;i++)
if((i%4==0&&i%100!=0)||i%400==0)
sumDays+=366;
else
sumDays+=365;

if((year%4==0&&year%100!=0)||year%400==0)
flag=1;//闰年置1

temp=sumDays;
for(month=1;month<13;month++)

{
for( i=1;i<=month;i++)
{
switch(i)
{

case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:

if(i<month)
sumDays+=31;
else
currMonthDays=31;

break;

case 4:
case 6:
case 9:
case 11:

if(i<month)
sumDays+=30;
else
currMonthDays=30;

break;

case 2:
if(flag==1)//是闰年
{ if(i<month)
sumDays+=29;
else
currMonthDays=29;
}
else
{
if(i<month)
sumDays+=28;
else
currMonthDays=28;
}

break;

}

}

printf("%d月\n",month);
//dw=(sumDays+1)%7;//星期日在前
dw=(sumDays)%7;//这里调整星期,星期日在后

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

for(i=1;i<=dw;i++){

printf("\t");

}

for(i=1;i<=currMonthDays;i++){

printf("%d\t",i);

if((i+dw)%7==0){
printf("\n");
}
}
printf("\n\n");
//重新清零
dw=0;
sumDays=temp;
currMonthDays=0;

}
getch();
return 0;
}
第2个回答  2011-03-19
#include <stdio.h>

int JgYr(int yr)
{
if (yr%4==0&&yr%100!=0||yr%100==0&&yr%400==0)
return 1;
else
return 0;
}

int CalWkd(int yr,int mth)
{
int ds=0,i,rst,wkd;
int mthd[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
if (JgYr(yr))
mthd[2]=29;
for (i=1;i<mth;i++)
ds+=mthd[i];
ds+=1;
rst=yr-1+(int)((yr-1)/4)-(int)((yr-1)/100)+(int)((yr-1)/400)+ds;
wkd=rst%7;
return wkd;
}

showcld(int wkd,int mtd)
{
int dt=1,i,j=0;
printf("Sun\tMon\tTue\tWed\tThu\tFri\tSat\n");
for (i=0;i<wkd;i++)
{
printf("\t");
j++;
}
while (j!=7)
{
printf("%d",dt);
if (j<6)
printf("\t");
else
printf("\n");
dt++;
j++;
}
while (1)
{
for (j=0;j<7;j++)
{
printf("%d",dt);
if (j!=6)
printf("\t");
else
printf("\n");
if (dt!=mtd)
dt++;
else
return 0;
}
}
}

int main()
{
int yr,mth,mtd,wkd,mthd[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
printf("Input the Year and Month(Year-Month):");
scanf("%d-%d",&yr,&mth);
if (yr<0||mth<1||mth>12)
return 0;
if (JgYr(yr))
mthd[2]=29;
mtd=mthd[mth];
wkd=CalWkd(yr,mth);
showcld(wkd,mtd);
return 0;
}