2022大一作业日历显示

输入任一整数年份,显示出该年的所有月份日期,以及对应的星期几,

其显示格式要求如下:

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语句加上二维数组,花费我时间的是在并列两月行数不同时的输出,到底是没学到家。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值