实编写万年历,要求从键盘输入一个年份,输出对应的日历表。

分析

1.判断是否是闰年,2月天数是取决与是否闰年的;

2.计算年份的星期;

3.打印日历表

有点难,循环先不说,做这个作业的时候多半人数组都没学哈哈;

第一种做法

#include <stdio.h>
 
int year(int y)
{
	if ((y%4==0) && (y%100!=0) || y%400==0)//判断闰年
		return 366;
	else
		return 365;//不是闰年时
}
 
int main()
{
	int y;
	int i,j,sum=0;	
	int begin,week;
	int days[12]={31,28,31,30,31,30,31,31,30,31,30,31};//每个月的日期
 
	scanf("%d",&y);
	for(i=1;i<y;i++)
		sum+=year(i);
	
	week=(sum+1)%7;		//表示该年1月1日为星期几
	
	if(year(y)==366)
		days[1]=29;	
 
	printf("\n%d年日历如下:\n\n",y);
 
	for(i=0;i<12;i++)
	{
		printf("       %d月          \n",i+1);
		printf("  7  1  2  3  4  5  6\n");
		printf("=====================\n");
		begin=1;
		for(j=0;j<week;j++)
			printf("   ");
		while(begin<=days[i])
		{
			printf("%3d",begin);
			begin++;
			week=(week+1)%7;
			if(week%7==0)
				printf("\n");
		}
		printf("\n\n");
 
	}
	
	
 
	return 0;
}

 

 第二种,大同小异

泰勒公式反而拖后腿,我们并不知道input的样例,不如从1开始。

#include <stdio.h>

#include<stdlib.h>

int year(int y)

{ //判断平年闰年

if ((y % 4 == 0) && (y % 100 != 0) || y % 400 == 0)

return 366; //闰年

else

return 365; //平年

}



void printfStar() //自定义函数

{

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

}



int main()

{

int y;

int i,j,sum = 0;

int day ,week;

int month[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; //闰年中每个月的天数



//输入想知道哪一年的日历

printf("请输入年份:\n");

scanf("%d",&y);

if(year(y) == 366)

month[1] = 29; //平年中2月的天数

//判断某年中1月1日为星期几 (泰勒公式, 1900年1月1号 星期一)

for(i = 1990;i < y;i++)

sum += year(i);

week = (sum+1)%7;

printf("%d年日历如下:\n",y);

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

{

printf("\t %d月\n",i+1);

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

printfStar();

//每一天对应的星期输入

day = 1; //从某一年的某一个月的第一天开始算起

for(j = 0;j < week;j++)

printf(" ");

while(day <= month[i]) //每个月的天数

{

printf("%4d",day); // 对齐

day++;

week= (week+1)%7; //计算每一天星期几

//如果一行达到7个数就换行,对应一个星期

if(week % 7 == 0)

printf("\n"); //换行

}

printf("\n"); //月份与月份之间隔开

printfStar(); //打 “*” 边框

printf("\n");

}

system("pause"); //防止闪退

return 0;

}

 

 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值