笔者提示:初学C语言,了解for,if,函数初步就可写下面的效果出来了!
效果
代码
//本程序旨在制作分三列显示的万年历
#include<stdio.h>
void printblank(int n) //本函数用来控制每月的一号是星期n的时候,输出不同的格式,使输出规范
{
if(n==1)printf("");
if(n==2)printf(" ");
if(n==3)printf(" ");
if(n==4)printf(" ");
if(n==5)printf(" ");
if(n==6)printf(" ");
if(n==7)printf(" ");
}
int wek(int yea) //本函数用来计算每年的一月一号是周几
{
int a[10005];
int k=1;
int i;
a[1]=1;
for(i=2;i<10001;i++)
{
if(k%400==0 || (k%4==0 && k%100!=0))
{
if(a[i-1]==7)a[i]=2;
else if(a[i-1]==6)a[i]=1;
else
a[i]=a[i-1]+2;
}
else
{
if(a[i-1]==7)a[i]=1;
else a[i]=a[i-1]+1;
}
k++;
}
return a[yea];
}
void main()
{
int i1;
int week,year; //year表示某年,week表示该年的一月一号是星期几
int week1,week2,week3,week4,week5,week6,week7,week8,week9,week10,week11,week12; //week1表示一月份最后一天是星期几,依次类推
int wee2,wee3,wee4,wee5,wee6,wee7,wee8,wee9,wee10,wee11,wee12;//wee2表示二月1号是星期几,下面类同
printf("Please input any year between 1 and 10000,such as 1,152,1689,2017 and so on, then you will see the year's calendar\n");
scanf("%d",&year);
if(year>10000 || year<0)printf("You input a wrong year!!! Please input a correct year according to the hint above.\n");
else
{
week=wek(year);
//本程序分四层显示,下面对日历逐层完成输出
printf("\n\n *************%04d年日历*************************%04d年日历*************\n\n",year,year,year);
//第一层实现输出如下(本程序共分四层实现万年历分三列打印)
printf("*********************************** ******************************** ***********************************\n");
printf("%19d年1月%30d年2月%30d年3月\n",year,year,year);
printf(" 一 二 三 四 五 六 日***一 二 三 四 五 六 日***一 二 三 四 五 六 日\n");
//显示日历本层核心行第1行(本日历每层核心行共六行)
printf(" ");
printblank(week);
for(i1=1;i1<=8-week;i1++)printf("%2d ",i1); //输出一月份的第1行
if(week<6)week1=week+2; //确定一月份的最后
else week1=week-5; //一天是星期几,下面类同
if(week1==7)wee2=1; //确定二月1号是星期几,下面类同
else wee2=week1+1;
printblank(wee2);
for(i1=1;i1<=8-wee2;i1++)printf("%2d ",i1); //输出二月份的第1行
if((year%400==0) || (year%4==0 && (year%100!=0))){week2=wee2;}
else
{
if(wee2==1)week2=7;
else
week2=wee2-1;
}
if(week2==7)wee3=1; //确定三月1号是周几
else
wee3=week2+1;
printblank(wee3);
for(i1=1;i1<=8-wee3;i1++)printf("%2d ",i1); //输出三月份的第1行
if(wee2<6)week3=wee2+2;
else
week3=wee2-5;
if(week3==7)wee4=7;
else
wee4=week3+1; //确定四月1号是周几
printf("\n");
//显示日历本层核心行第2行(本日历每层核心行共六行)
printf(" ");
for(i1=9-week;i1<=15-week;i1++)printf("%2d ",i1); //输出一月份第2行
for(i1=9-wee2;i1<=15-wee2;i1++)printf("%2d ",i1); //输出二月份第2行
for(i1=9-wee3;i1<=15-wee3;i1++)printf("%2d ",i1); //输出三月份第2行
printf("\n");
//显示日历本层核心行第3行(本日历每层核心行共六行)
printf(" ");
for(i1=16-week;i1<=22-week;i1++)printf("%2d ",i1); //输出一月份第3行
for(i1=16-wee2;i1<=22-wee2;i1++)printf("%2d ",i1); //输出二月份第3行
for(i1=16-wee3;i1<=22-wee3;i1++)printf("%2d ",i1); //输出三月份第3行
printf("\n");
//显示日历本层核心行第4行(本日历每层核心行共六行)
printf(" ");
for(i1=23-week;i1<=29-week;i1++)printf("%2d ",i1); //输出一月份第4行
for(i1=23-wee2;i1<=29-wee2;i1++)printf("%2d ",i1); //输出二月份第4行
for(i1=23-wee3;i1<=29-wee3;i1++)printf("%2d ",i1); //输出三月份第4行
printf("\n");
//显示日历本层核心行第5行(本日历每层核心行共六行)
printf(" ");
if(31-(29-week)==7){for(i1=25;i1<=31;i1++)printf("%2d ",i1);} //输出一月份第5行
else if(week+2==8){{for(i1=24;i1<=30;i1++)printf("%2d ",i1);}}
else if(week+2==9){{for(i1=23;i1<=29;i1++)printf("%2d ",i1);}}
else if(week+2==6){{for(i1=26;i1<=31;i1++)printf("%2d ",i1);}printf(" ");}
else if(week+2==5){{for(i1=27;i1<=31;i1++)printf("%2d ",i1);}printf(" ");}
else if(week+2==4){{for(i1=28;i1<=31;i1++)printf("%2d ",i1);}printf(" ");}
else{for(i1=29;i1<=31;i1++)printf("%2d ",i1);printf(" ");}
if((year%400==0) || (year%4==0 && (year%100!=0))) //输出二月份第5行
{
if(29-(29-wee2)==1)printf("%2d ",29);
else if(wee2==2)printf("%2d %2d ",28,29);
else if(wee2==3)printf("%2d %2d %2d ",27,28,29);
else if(wee2==4){for(i1=26;i1<=29;i1++)printf("%2d ",i1);printf(" ");}
else if(wee2==5){for(i1=25;i1<=29;i1++)printf("%2d ",i1);printf(" ");}
else if(wee2==6){for(i1=24;i1<=29;i1++)printf("%2d ",i1);printf(" ");}
else{for(i1=23;i1<=29;i1++)printf("%2d ",i1);}
}
else
{
if(28-(29-wee2)==0)printf(" ");
else if(wee2-1==1)printf("%2d ",28);
else if(wee2==3)printf("%2d %2d ",27,28);
else if(wee2==4)printf("%2d %2d %2d ",26,27,28);
else if(wee2==5)printf("%2d %2d %2d %2d ",25,26,27,28);
else if(wee2==6)printf("%2d %2d %2d %2d %2d ",24,25,26,27,28);
else{for(i1=23;i1<=28;i1++)printf("%2d ",i1);printf(" ");}
}
if(31-(29-wee3)==7){for(i1=25;i1<=31;i1++)printf("%2d ",i1);} //输出三月份第5行
else if(wee3+2==8){{for(i1=24;i1<=30;i1++)printf("%2d ",i1);}}
else if(wee3+2==9){{for(i1=23;i1<=29;i1++)printf("%2d ",i1);}}
else if(wee3+2==6){{for(i1=26;i1<=31;i1++)printf("%2d ",i1);}printf(" ");}
else if(wee3+2==5){{for(i1=27;i1<=31;i1++)printf("%2d ",i1);}printf(" ");}
else if(wee3+2==4){{for(i1=28;i1<=31;i1++)printf("%2d ",i1);}printf(" ");}
else{for(i1=29;i1<=31;i1++)printf("%2d ",i1);printf(" ");}
printf("\n");
//显示日历本层核心行第6行(本日历每层核心行共六行)
printf(" ");
if(week+2==8)printf("%2d ",31); //输出一月份第6行
else if(week+2==9)printf("%2d %2d ",30,31);
else
printf(" ");
printf(" "); //输出二月份第6行
if(wee3+2==8)printf("%2d ",31); //输出三月份第6行
else if(wee3+2==9)printf("%2d %2d ",30,31);
else
printf(" ");
printf("\n");
//第二层实现输出如下(本程序共分四层实现万年历分三列打印)
printf("*********************************** ******************************** ***********************************\n");
printf("%19d年4月%30d年5月%30d年6月\n",year,year,year);
printf(" 一 二 三 四 五 六 日***一 二 三 四 五 六 日***一 二 三 四 五 六 日\n");
//显示日历本层核心行第1行(本日历每层核心行共六行)
printf(" ");
printblank(wee4);
for(i1=1;i1<=8-wee4;i1++)printf("%2d ",i1); //输出四月份的第1行
if(wee4<=6)week4=wee4+1; //确定四月份的最后
else week4=1; //一天是星期几,下面类同
if(week4==7)wee5=1; //确定五月1号是星期几,下面类同
else wee5=week4+1;
printblank(wee5);
for(i1=1;i1<=8-wee5;i1++)printf("%2d ",i1); //输出五月份的第1行
if(wee5<6)week5=wee5+2;
else week5=wee5-5;
if(week5==7)wee6=7;
else wee6=week5+1; //确定六月1号是周几
printblank(wee6);
for(i1=1;i1<=8-wee6;i1++)printf("%2d ",i1); //输出六月份的第1行
if(wee6<=6)week6=wee6+1;
else week6=1;
if(week6==7)wee7=7;
else
wee7=week6+1; //确定七月1号是周几
printf("\n");
//显示日历本层核心行第2行(本日历每层核心行共六行)
printf(" ");
for(i1=9-wee4;i1<=15-wee4;i1++)printf("%2d ",i1); //输出四月份第2行
for(i1=9-wee5;i1<=15-wee5;i1++)printf("%2d ",i1); //输出五月份第2行
for(i1=9-wee6;i1<=15-wee6;i1++)printf("%2d ",i1); //输出六月份第2行
printf("\n");
//显示日历本层核心行第3行(本日历每层核心行共六行)
printf(" ");
for(i1=16-wee4;i1<=22-wee4;i1++)printf("%2d ",i1); //输出四月份第3行
for(i1=16-wee5;i1<=22-wee5;i1++)printf("%2d ",i1); //输出五月份第3行
for(i1=16-wee6;i1<=22-wee6;i1++)printf("%2d ",i1); //输出六月份第3行
printf("\n");
//显示日历本层核心行第4行(本日历每层核心行共六行)
printf(" ");
for(i1=23-wee4;i1<=29-wee4;i1++)printf("%2d ",i1); //输出四月份第4行
for(i1=23-wee5;i1<=29-wee5;i1++)printf("%2d ",i1); //输出五月份第4行
for(i1=23-wee6;i1<=29-wee6;i1++)printf("%2d ",i1); //输出六月份第4行
printf("\n");
//显示日历本层核心行第5行(本日历每层核心行共六行)
printf(" ");
if(30-(29-wee4)==2)printf("%2d %2d ",29,30);//输出四月份第5行
else if(wee4+1==3){for(i1=28;i1<=30;i1++)printf("%2d ",i1);printf(" ");}
else if(wee4+1==4){for(i1=27;i1<=30;i1++)printf("%2d ",i1);printf(" ");}
else if(wee4+1==5){for(i1=26;i1<=30;i1++)printf("%2d ",i1);printf(" ");}
else if(wee4+1==6){for(i1=25;i1<=30;i1++)printf("%2d ",i1);printf(" ");}
else if(wee4+1==7){for(i1=24;i1<=30;i1++)printf("%2d ",i1);}
else {for(i1=23;i1<=29;i1++)printf("%2d ",i1);}
if(31-(29-wee5)==7){for(i1=25;i1<=31;i1++)printf("%2d ",i1);} //输出五月份第5行
else if(wee5+2==8){{for(i1=24;i1<=30;i1++)printf("%2d ",i1);}}
else if(wee5+2==9){{for(i1=23;i1<=29;i1++)printf("%2d ",i1);}}
else if(wee5+2==6){{for(i1=26;i1<=31;i1++)printf("%2d ",i1);}printf(" ");}
else if(wee5+2==5){{for(i1=27;i1<=31;i1++)printf("%2d ",i1);}printf(" ");}
else if(wee5+2==4){{for(i1=28;i1<=31;i1++)printf("%2d ",i1);}printf(" ");}
else{for(i1=29;i1<=31;i1++)printf("%2d ",i1);printf(" ");}
if(30-(29-wee6)==2)printf("%2d %2d ",29,30);//输出六月份第5行
else if(wee6+1==3){for(i1=28;i1<=30;i1++)printf("%2d ",i1);printf(" ");}
else if(wee6+1==4){for(i1=27;i1<=30;i1++)printf("%2d ",i1);printf(" ");}
else if(wee6+1==5){for(i1=26;i1<=30;i1++)printf("%2d ",i1);printf(" ");}
else if(wee6+1==6){for(i1=25;i1<=30;i1++)printf("%2d ",i1);printf(" ");}
else if(wee6+1==7){for(i1=24;i1<=30;i1++)printf("%2d ",i1);}
else {for(i1=23;i1<=29;i1++)printf("%2d ",i1);}
printf("\n");
//显示日历本层核心行第6行(本日历每层核心行共六行)
printf(" ");
if(30-(29-wee4)==8)printf("%2d ",30);//输出四月份第6行
else printf(" ");
if(wee5+2==8)printf("%2d ",31); //输出五月份第6行
else if(wee5+2==9)printf("%2d %2d ",30,31);
else
printf(" ");
if(30-(29-wee6)==8)printf("%2d ",30);//输出六月份第6行
else printf(" ");
printf("\n");
//第三层实现输出如下(本程序共分四层实现万年历分三列打印)
printf("*********************************** ******************************** ***********************************\n");
printf("%19d年7月%30d年8月%30d年9月\n",year,year,year);
printf(" 一 二 三 四 五 六 日***一 二 三 四 五 六 日***一 二 三 四 五 六 日\n");
//显示日历本层核心行第1行(本日历每层核心行共六行)
printf(" ");
printblank(wee7);
for(i1=1;i1<=8-wee7;i1++)printf("%2d ",i1); //输出七月份的第1行
if(wee7<6)week7=wee7+2;
else week7=wee7-5;
if(week7==7)wee8=1;
else wee8=week7+1;
printblank(wee8);
for(i1=1;i1<=8-wee8;i1++)printf("%2d ",i1); //输出八月份的第1行
if(wee8<6)week8=wee8+2;
else week8=wee8-5;
if(week8==7)wee9=1;
else wee9=week8+1;
printblank(wee9);
for(i1=1;i1<=8-wee9;i1++)printf("%2d ",i1); //输出九月份的第1行
if(wee9<=6)week9=wee9+1;
else week9=1;
if(week9==7)wee10=1;
else wee10=week9+1;
printf("\n");
//显示日历本层核心行第2行(本日历每层核心行共六行)
printf(" ");
for(i1=9-wee7;i1<=15-wee7;i1++)printf("%2d ",i1); //输出七月份第2行
for(i1=9-wee8;i1<=15-wee8;i1++)printf("%2d ",i1); //输出八月份第2行
for(i1=9-wee9;i1<=15-wee9;i1++)printf("%2d ",i1); //输出九月份第2行
printf("\n");
//显示日历本层核心行第3行(本日历每层核心行共六行)
printf(" ");
for(i1=16-wee7;i1<=22-wee7;i1++)printf("%2d ",i1); //输出七月份第3行
for(i1=16-wee8;i1<=22-wee8;i1++)printf("%2d ",i1); //输出八月份第3行
for(i1=16-wee9;i1<=22-wee9;i1++)printf("%2d ",i1); //输出九月份第3行
printf("\n");
//显示日历本层核心行第4行(本日历每层核心行共六行)
printf(" ");
for(i1=23-wee7;i1<=29-wee7;i1++)printf("%2d ",i1); //输出七月份第4行
for(i1=23-wee8;i1<=29-wee8;i1++)printf("%2d ",i1); //输出八月份第4行
for(i1=23-wee9;i1<=29-wee9;i1++)printf("%2d ",i1); //输出九月份第4行
printf("\n");
//显示日历本层核心行第5行(本日历每层核心行共六行)
printf(" ");
if(31-(29-wee7)==7){for(i1=25;i1<=31;i1++)printf("%2d ",i1);} //输出七月份第5行
else if(wee7+2==8){{for(i1=24;i1<=30;i1++)printf("%2d ",i1);}}
else if(wee7+2==9){{for(i1=23;i1<=29;i1++)printf("%2d ",i1);}}
else if(wee7+2==6){{for(i1=26;i1<=31;i1++)printf("%2d ",i1);}printf(" ");}
else if(wee7+2==5){{for(i1=27;i1<=31;i1++)printf("%2d ",i1);}printf(" ");}
else if(wee7+2==4){{for(i1=28;i1<=31;i1++)printf("%2d ",i1);}printf(" ");}
else{for(i1=29;i1<=31;i1++)printf("%2d ",i1);printf(" ");}
if(31-(29-wee8)==7){for(i1=25;i1<=31;i1++)printf("%2d ",i1);} //输出八月份第5行
else if(wee8+2==8){{for(i1=24;i1<=30;i1++)printf("%2d ",i1);}}
else if(wee8+2==9){{for(i1=23;i1<=29;i1++)printf("%2d ",i1);}}
else if(wee8+2==6){{for(i1=26;i1<=31;i1++)printf("%2d ",i1);}printf(" ");}
else if(wee8+2==5){{for(i1=27;i1<=31;i1++)printf("%2d ",i1);}printf(" ");}
else if(wee8+2==4){{for(i1=28;i1<=31;i1++)printf("%2d ",i1);}printf(" ");}
else{for(i1=29;i1<=31;i1++)printf("%2d ",i1);printf(" ");}
if(30-(29-wee9)==2)printf("%2d %2d ",29,30);//输出九月份第5行
else if(wee9+1==3){for(i1=28;i1<=30;i1++)printf("%2d ",i1);printf(" ");}
else if(wee9+1==4){for(i1=27;i1<=30;i1++)printf("%2d ",i1);printf(" ");}
else if(wee9+1==5){for(i1=26;i1<=30;i1++)printf("%2d ",i1);printf(" ");}
else if(wee9+1==6){for(i1=25;i1<=30;i1++)printf("%2d ",i1);printf(" ");}
else if(wee9+1==7){for(i1=24;i1<=30;i1++)printf("%2d ",i1);}
else {for(i1=23;i1<=29;i1++)printf("%2d ",i1);}
printf("\n");
//显示日历本层核心行第6行(本日历每层核心行共六行)
printf(" ");
if(wee7+2==8)printf("%2d ",31); //输出七月份第6行
else if(wee7+2==9)printf("%2d %2d ",30,31);
else
printf(" ");
if(wee8+2==8)printf("%2d ",31); //输出八月份第6行
else if(wee8+2==9)printf("%2d %2d ",30,31);
else
printf(" ");
if(30-(29-wee9)==8)printf("%2d ",30);//输出九月份第6行
else printf(" ");
printf("\n");
//第四层实现输出如下(本程序共分四层实现万年历分三列打印)
printf("*********************************** ******************************** ***********************************\n");
printf("%19d年10月%29d年11月%29d年12月\n",year,year,year);
printf(" 一 二 三 四 五 六 日***一 二 三 四 五 六 日***一 二 三 四 五 六 日\n");
//显示日历本层核心行第1行(本日历每层核心行共六行)
printf(" ");
printblank(wee10);
for(i1=1;i1<=8-wee10;i1++)printf("%2d ",i1); //输出十月份的第1行
if(wee10<6)week10=wee10+2;
else week10=wee10-5;
if(week10==7)wee11=1;
else wee11=week10+1;
printblank(wee11);
for(i1=1;i1<=8-wee11;i1++)printf("%2d ",i1); //输出十一月份的第1行
if(wee11==7)week11=1;
else week11=wee11+1;
if(week11==7)wee12=1;
else wee12=week11+1;
printblank(wee12);
for(i1=1;i1<=8-wee12;i1++)printf("%2d ",i1); //输出十二月份的第1行
printf("\n");
//显示日历本层核心行第2行(本日历每层核心行共六行)
printf(" ");
for(i1=9-wee10;i1<=15-wee10;i1++)printf("%2d ",i1); //输出十月份第2行
for(i1=9-wee11;i1<=15-wee11;i1++)printf("%2d ",i1); //输出十一月份第2行
for(i1=9-wee12;i1<=15-wee12;i1++)printf("%2d ",i1); //输出十二月份第2行
printf("\n");
//显示日历本层核心行第3行(本日历每层核心行共六行)
printf(" ");
for(i1=16-wee10;i1<=22-wee10;i1++)printf("%2d ",i1); //输出十月份第3行
for(i1=16-wee11;i1<=22-wee11;i1++)printf("%2d ",i1); //输出十一月份第3行
for(i1=16-wee12;i1<=22-wee12;i1++)printf("%2d ",i1); //输出十二月份第3行
printf("\n");
//显示日历本层核心行第4行(本日历每层核心行共六行)
printf(" ");
for(i1=23-wee10;i1<=29-wee10;i1++)printf("%2d ",i1); //输出十月份第4行
for(i1=23-wee11;i1<=29-wee11;i1++)printf("%2d ",i1); //输出十一月份第4行
for(i1=23-wee12;i1<=29-wee12;i1++)printf("%2d ",i1); //输出十二月份第4行
printf("\n");
//显示日历本层核心行第5行(本日历每层核心行共六行)
printf(" ");
if(31-(29-wee10)==7){for(i1=25;i1<=31;i1++)printf("%2d ",i1);} //输出十月份第5行
else if(wee10+2==8){{for(i1=24;i1<=30;i1++)printf("%2d ",i1);}}
else if(wee10+2==9){{for(i1=23;i1<=29;i1++)printf("%2d ",i1);}}
else if(wee10+2==6){{for(i1=26;i1<=31;i1++)printf("%2d ",i1);}printf(" ");}
else if(wee10+2==5){{for(i1=27;i1<=31;i1++)printf("%2d ",i1);}printf(" ");}
else if(wee10+2==4){{for(i1=28;i1<=31;i1++)printf("%2d ",i1);}printf(" ");}
else{for(i1=29;i1<=31;i1++)printf("%2d ",i1);printf(" ");}
if(30-(29-wee9)==2)printf("%2d %2d ",29,30); //输出十一月份第5行
else if(wee11+1==3){for(i1=28;i1<=30;i1++)printf("%2d ",i1);printf(" ");}
else if(wee11+1==4){for(i1=27;i1<=30;i1++)printf("%2d ",i1);printf(" ");}
else if(wee11+1==5){for(i1=26;i1<=30;i1++)printf("%2d ",i1);printf(" ");}
else if(wee11+1==6){for(i1=25;i1<=30;i1++)printf("%2d ",i1);printf(" ");}
else if(wee11+1==7){for(i1=24;i1<=30;i1++)printf("%2d ",i1);}
else {for(i1=23;i1<=29;i1++)printf("%2d ",i1);}
if(31-(29-wee12)==7){for(i1=25;i1<=31;i1++)printf("%2d ",i1);} //输出十二月份第5行
else if(wee12+2==8){{for(i1=24;i1<=30;i1++)printf("%2d ",i1);}}
else if(wee12+2==9){{for(i1=23;i1<=29;i1++)printf("%2d ",i1);}}
else if(wee12+2==6){{for(i1=26;i1<=31;i1++)printf("%2d ",i1);}printf(" ");}
else if(wee12+2==5){{for(i1=27;i1<=31;i1++)printf("%2d ",i1);}printf(" ");}
else if(wee12+2==4){{for(i1=28;i1<=31;i1++)printf("%2d ",i1);}printf(" ");}
else{for(i1=29;i1<=31;i1++)printf("%2d ",i1);printf(" ");}
printf("\n");
//显示日历本层核心行第6行(本日历每层核心行共六行)
printf(" ");
if(wee10+2==8)printf("%2d ",31); //输出十月份第6行
else if(wee10+2==9)printf("%2d %2d ",30,31);
else
printf(" ");
if(30-(29-wee11)==8)printf("%2d ",30); //输出十一月份第6行
else printf(" ");
if(wee12+2==8)printf("%2d ",31); //输出十二月份第6行
else if(wee12+2==9)printf("%2d %2d ",30,31);
else
printf(" ");
printf("\n");
printf("*********************************** ******************************** ***********************************\n");
}
}