[C/C++/初学者]万年历(输入年份和月份,输出对应的日历表——数组)

//本代码不考虑历法问题,设定1年1月1日为星期一。

//以星期日为始。

//完整代码在最下方。

根据题意,我们首先需要接收年份的月份的数据。

	printf("请输入年份:");
	scanf("%d",&Year);

	printf("请输入月份:");
	scanf("%d",&Month);

如果我们要知道指定月份的第一天是星期几,

那么我们就需要一个基准点,以该基准点为起始向后推算。

那么就可以用年份减一乘上365,即(Year-1)*365,这样就可以得到我们所输入的这个年份之前有多少天。

s=365*(Year-1);

但我们都知道,在年份中有一个特殊的存在——闰年,2月为29天,一年有366天。

而这个问题也很好解决,只需要判断此前的是否有闰年的存在,

若有则在总天数上加一即可。


	for(i=1;i<Year;i++)
	{
		//判断是否有闰年,若有则累计
		if(i%4==0&&i%100!=0||i%400==0)
		{
			Count++;
		}
	}

	//由于闰年有366天,故每有一个闰年,我们就需要再日数上加一
	s=s+Count;

这样一来,我们就得到了指定年份之前的总天数,那么接下来就要计算指定月份之前的总天数了。

由于本题目要体现数组的应用,故我们把各月份的天数都保存到一个数组中。

为了在使用过程中,使得程序更加的简单明了,我们让数组的下标月份相对应。

例如:Day[1]代表一月,有31天。

int Day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};

回到此前的闰年问题,若指定年份为闰年,我们就需要将该年二月的天数改为29天。

	//如果我们所输入的这年是闰年,则该年的二月是29天。
	if(Year%4==0&&Year%100!=0||Year%400==0)
	{
		Day[2]=29;
	}

利用循环,将指定月份前的天数与之前的数据相加,就得到指定月份之前的全部天数。

即,我们求2022年12月的日历表,那么就计算出了从1年1月1日到2022年11月的全部天数之和。

	//加上所输入的月份之前的日子,例如我们输入5月,则加上1,2,3,4月的天数
	for(i=0;i<Month;i++)
	{
		s=s+Day[i];
	}

在完成了这些准备工作后,我们就可以开始输出了。

首先将第一行的星期输出:日 一 二 三 四 五 六

 
	for(i=0;i<7;i++)
	{
		switch(i)
		{
		case 0:
			printf("  日");
			break;
		case 1:
			printf("  一");
			break;
		case 2:
			printf("  二");
			break;
		case 3:
			printf("  三");
			break;
		case 4:
			printf("  四");
			break;
		case 5:
			printf("  五");
			break;
		case 6:
			printf("  六\n");
			break;
		}
	}

紧接着就是空白问题了,即如果我们所求的该月的第一天为星期五,则前面星期日到星期四的数据为空,用k来保存这个数据,并通过循环输出空格符达到空白的效果。

    k=s%7;

    for(i=0;i<=k;i++)
	{
		printf("    ");
	}

最后就可以输出我们需要的日期啦,值得注意的是,由于我们是以星期日为始,所以每当日期来到星期六时,我们就需要对其进行换行。

    //输出我们所指定的月份的天数
	for(i=1;i<=Day[Month];i++)
	{
		printf("%4d",i);

		//控制每个星期的换行
		//以星期六为末尾进行换行
		if((i+k+1)%7==0)
		{
			printf("\n");
		}
	}

	printf("\n");

以下为完整代码:

#include<stdio.h>
int main( )
{
	int i,Count=0,k,Year,Month,s;
	//为了让序号和月份对应,我们这里的Day[0]设为0,月份从Day[1]开始计算。
	int Day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};

	printf("请输入年份:");
	scanf("%d",&Year);

	printf("请输入月份:");
	scanf("%d",&Month);
	
	//假设没有闰年存在,那么我们所输入的这年的第一天之前就有s日。
	s=365*(Year-1);

	for(i=1;i<Year;i++)
	{
		//判断是否有闰年,若有则累计
		if(i%4==0&&i%100!=0||i%400==0)
		{
			Count++;
		}
	}

	//由于闰年有366天,故每有一个闰年,我们就需要再日数上加一
	s=s+Count;
	
	//如果我们所输入的这年是闰年,则该年的二月是29天。
	if(Year%4==0&&Year%100!=0||Year%400==0)
	{
		Day[2]=29;
	}

	//加上所输入的月份之前的日子,例如我们输入5月,则加上1,2,3,4月的天数
	for(i=0;i<Month;i++)
	{
		s=s+Day[i];
	}

	//得到总共的星期数
	k=s%7;

	//输出第一行的数据:日 一 二 三 四 五 六 
	for(i=0;i<7;i++)
	{
		switch(i)
		{
		case 0:
			printf("  日");
			break;
		case 1:
			printf("  一");
			break;
		case 2:
			printf("  二");
			break;
		case 3:
			printf("  三");
			break;
		case 4:
			printf("  四");
			break;
		case 5:
			printf("  五");
			break;
		case 6:
			printf("  六\n");
			break;
		}
	}

	//空白区域,例如我们需要的这个月的第一天是周二二,那么在此前的周日和周一则是空白的
	for(i=0;i<=k;i++)
	{
		printf("    ");
	}

	//输出我们所指定的月份的天数
	for(i=1;i<=Day[Month];i++)
	{
		printf("%4d",i);

		//控制每个星期的换行
		//以星期六为末尾进行换行
		if((i+k+1)%7==0)
		{
			printf("\n");
		}
	}

	printf("\n");
	
	return 0;
}

执行结果如下:

  • 18
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在这个问题中,用户提供了两段代码,分别是引用\[1\]和引用\[2\]。这两段代码都是用来在一个数组中查找指定数的位置。 引用\[1\]是一个C++代码示例,它使用了iostream和stdio.h头文件,并使用了命名空间std。代码中使用了一个while循环来不断读取输入的n值,然后创建一个大小为n的整型数组a,并通过for循环读取数组的元素。接下来,代码读取了一个整数m,并使用for循环遍历数组a,查找是否有与m相等的元素。如果找到了相等的元素,则将其位置赋值给变量t,并跳出循环。最后,根据t的值输出结果。 引用\[2\]是另一个C代码示例,它使用了stdio.h头文件。代码中同样使用了一个while循环来不断读取输入的n值,然后创建一个大小为n的整型数组a,并通过for循环读取数组的元素。接下来,代码读取了一个整数m,并使用for循环遍历数组a,查找是否有与m相等的元素。如果找到了相等的元素,则将其位置赋值给变量count,并将flag设置为1,表示找到了。最后,根据flag的值输出结果。 综上所述,这两段代码都是用来在一个数组中查找指定数的位置。它们的实现方式略有不同,但都能达到相同的目的。 #### 引用[.reference_title] - *1* [1143: 零起点学算法50——数组中查找数](https://blog.csdn.net/weixin_43965597/article/details/113104995)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [问题 C: 零起点学算法82——数组中查找数](https://blog.csdn.net/chenhannan0024/article/details/127568844)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

渡过晚枫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值