输入任一整数年份,显示出该年的所有月份日期,以及对应的星期几,
其显示格式要求如下:
1)第一行显示年份,第二行显示月份;
2)下一行显示星期,从周日到周六,中英文都可以;
3)下一行开始显示日期从1号开始,并按其是周几实际情况与上面的星期数垂直对齐; 两个月日历并排显示,当输入2017显示如下:
#include<stdio.h>
int TotalLeapYear(int year); //判断闰年非闰年
int geshu(int y,int m);
void month(int m) //显示月份
{
printf("\n %5d\t \t\t\t\t %5d\n\n",2*m-1,2*m);
};
void week() //显示周
{
printf(" Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat\n");
};
int main()
{
int year,i,j,m,k,d=1,s=1; //d和s给每天赋值并作为标记(flag),m是月份;i,j,k都用于循环
int g,h,x,y,r; //g,h判断每月第一天是周几 ;x,y用于填充每月第一天前空格数
int a[6][7],b[6][7];
scanf("%d",&year);
for(i=1;i<=35;i++)printf(" "); //将年份居中
printf("=====%d=====\n",year); //显示输入年
for(m=1;m<=6;m++){ //循环改变m的值将12个月分6组m为1到6
switch(m){ //switch语句两月一组赋值输出
case 1: month(m); //显示月份
week(); //显示周
g=geshu(year,1);
h=geshu(year,2);
if(TotalLeapYear(year)==0) { //判断闰年非闰年分两种情况赋值输出
for(i=1;i<=6;i++){
for(j=g+1;j<=7;j++)
{a[i][j]=d;
d++;
if(d==32)break;}
g=0;
if(s!=29)for(j=h+1;j<=7;j++){
b[i][j]=s;
s++;
if(s==29)break;
}
h=0;
if(d==32)break;
}}
else {g=geshu(year,1);
h=geshu(year,2);
for(i=1;i<=6;i++){
for(j=g+1;j<=7;j++)
{
a[i][j]=d;
d++;
if(d==32)break;
}
g=0;
if(s!=30){
for(j=h+1;j<=7;j++){
b[i][j]=s;
s++;
if(s==30)break;}}
h=0;
if(d==32)break;
}
} g=geshu(year,1);
h=geshu(year,2);
for(i=1;i<=6;i++)
{
for(x=g;x>0;x--)printf(" ");
for(j=g+1;j<=7;j++){
d--;
printf("%5d",a[i][j]);
if(d==1){
break;}
}g=0;if(j!=7){for(k=1;k<=7-j;k++) //填充月底非周六到周六的空格
printf(" ");
}
printf(" "); //两月并排间隔空格
for(y=h;y>0;y--)printf(" ");
for(j=h+1;j<=7;j++){
if(s==1)break;
s--;
printf("%5d",b[i][j]);
}h=0; printf("\n");
if(d==1)break;
}break;
case 2: month(m);
g=geshu(year,3);
h=geshu(year,4);
week();
s=1;d=1;
for(i=1;i<=6;i++){
for(j=g+1;j<=7;j++)
{
a[i][j]=d;
d++;
if(d==32)break;
}g=0;
for(j=h+1;j<=7;j++){
if(s>30)break;
b[i][j]=s;
s++;
}h=0;
if(d==32)break;}
g=geshu(year,3);
h=geshu(year,4);
for(i=1;i<=6;i++)
{
for(x=g;x>0;x--)printf(" ");
for(j=g+1;j<=7;j++){
d--;
printf("%5d",a[i][j]);
if(d==1)
break;
}g=0;if(j!=7){for(k=1;k<=7-j;k++)
printf(" ");
}
printf(" ");
for(y=h;y>0;y--)printf(" ");
for(j=h+1;j<=7;j++){
if(s==1)break;
s--;
printf("%5d",b[i][j]);
}h=0;
printf("\n");
if(d==1)break;
}break;
case 3: month(m);
g=geshu(year,5);
h=geshu(year,6);
week();
s=1;d=1;
s=1;d=1;
for(i=1;i<=6;i++){
for(j=g+1;j<=7;j++)
{
a[i][j]=d;
d++;
if(d==32)break;
}g=0;
for(j=h+1;j<=7;j++){
if(s>30)break;
b[i][j]=s;
s++;
}h=0;
if(d==32)break;}
g=geshu(year,5);
h=geshu(year,6);
for(i=1;i<=6;i++)
{
for(x=g;x>0;x--)printf(" ");
for(j=g+1;j<=7;j++){
d--;
printf("%5d",a[i][j]);
if(d==1){
break;}
}g=0;if(j!=7){for(k=1;k<=7-j;k++)
printf(" ");
}
printf(" ");
for(y=h;y>0;y--)printf(" ");
for(j=h+1;j<=7;j++){
if(s==1)break;
s--;
printf("%5d",b[i][j]);
}h=0;
printf("\n");
if(d==1)break;
}break;
case 4:g=geshu(year,7);
h=geshu(year,8);
month(m);
week();
s=1;d=1;
s=1;d=1;
for(i=1;i<=6;i++){
for(j=g+1;j<=7;j++)
{
a[i][j]=d;
d++;
if(d==32)break;
}g=0;
for(j=h+1;j<=7;j++){
if(s>31)break;
b[i][j]=s;
s++;
}h=0;
if(d==32)break;}
g=geshu(year,7);
h=geshu(year,8);
for(i=1;i<=6;i++)
{
for(x=g;x>0;x--)printf(" ");
for(j=g+1;j<=7;j++){
d--;
printf("%5d",a[i][j]);
if(d==1){
break;}
}g=0;if(j!=7){for(k=1;k<=7-j;k++)
printf(" ");
}
printf(" ");
for(y=h;y>0;y--)printf(" ");
for(j=h+1;j<=7;j++){
if(s==1)break;
s--;
printf("%5d",b[i][j]);
}h=0;
printf("\n");
if(d==1)break;
}break;
case 5:g=geshu(year,9);
h=geshu(year,10);
month(m);
week();
s=1;d=1;
for(i=1;i<=6;i++){
for(j=h+1;j<=7;j++)
{
if(d==32)break;
b[i][j]=d;
d++;
if(d==32)break;
}h=0;
for(j=g+1;j<=7;j++){
if(s>30)break;
a[i][j]=s; //标记r确保在前一个月天数少于后一月但前一月行数多与后一行行数情况下输出多的一行
s++;
}g=0;
if(s<31)continue; //确保在前一个月天数少于后一月但前一月行数多与后一行行数情况下不会提前结束循环
if(d==32)break;}
g=geshu(year,9);
h=geshu(year,10);
for(i=1;i<=6;i++)
{
for(x=g;x>0;x--)printf(" ");
for(j=g+1;j<=7;j++){
if(s==1){
j=0; //用于前一月行数少于后一月,填充空格
break;}
s--;
printf("%5d",a[i][j]);
if(s==1)break;
}g=0;if(j!=7){for(k=1;k<=7-j;k++)
printf(" ");
}
printf(" ");
for(y=h;y>0;y--)printf(" ");
for(j=h+1;j<=7;j++){
if(d==1) break;
d--;
printf("%5d",b[i][j]);
if(d==1)break;
}h=0;
printf("\n");
if(d==1&&s==1)break;
}break;
case 6:g=geshu(year,11);
h=geshu(year,12);
month(m);
week();
s=1;d=1;
for(i=1;i<=6;i++){
for(j=h+1;j<=7;j++)
{
if(d==32)break;
b[i][j]=d;
d++;
if(d==32)break;
}h=0;
for(j=g+1;j<=7;j++){
if(s>30)break;
a[i][j]=s; //标记r确保在前一个月天数少于后一月但前一月行数多与后一行行数情况下输出多的一行
s++;
}g=0;
if(s<31)continue; //确保在前一个月天数少于后一月但前一月行数多与后一行行数情况下不会提前结束循环
if(d==32)break;}
g=geshu(year,11);
h=geshu(year,12);
for(i=1;i<=6;i++)
{
for(x=g;x>0;x--)printf(" ");
for(j=g+1;j<=7;j++){
if(s==1){
j=0; //用于前一月行数少于后一月,填充空格
break;}
s--;
printf("%5d",a[i][j]);
if(s==1)break;
}g=0;if(j!=7){for(k=1;k<=7-j;k++)
printf(" ");
}
printf(" ");
for(y=h;y>0;y--)printf(" ");
for(j=h+1;j<=7;j++){
if(d==1) break;
d--;
printf("%5d",b[i][j]);
if(d==1)break;
}h=0;
printf("\n");
if(d==1&&s==1)break;}break;
}
}
return 0;
}
int TotalLeapYear(int year)//判断闰年,非闰年
{
int flag=0;
if(year%4==0&&year%100!=0){
flag=1;
}
else if(year%400==0){
flag=1;
}
return flag;
}
int geshu(int y,int m)//计算每月1日是周几
{
int n=0,a,b,c=0,i;
int q[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
for(a=1;a<y;a++){
if(TotalLeapYear(a)==1)
c=c+366;
else c=c+365;
}
for(i=0;i<m;i++){
n=n+q[i];
}
if(TotalLeapYear(y)==1)n=n+1;
return (n+c+1)%7;
}
主体很长可能因为我是初学者,简化不太行,而且比较赶,大一作业,没继续简化
switch语句加上二维数组,花费我时间的是在并列两月行数不同时的输出,到底是没学到家。