请用循环语句进行程序设计(也可能用到if或switch语句),实现从键盘上输入一个日期,日期格式为:2018-7-9,判断这一天是这一年中的第几天。

请用循环语句进行程序设计(也可能用到if或switch语句),实现从键盘上输入一个日期,日期格式为:2018-7-9,判断这一天是这一年中的第几天。
注:本题涉及到闰年、平年的判断,已知符合下列条件之一者是润年:
   (1)能被4整除,但不能被100整除;
   (2)能被400整除。

输入提示信息:"Please Input the Date:\n"
输入格式:"%d-%d-%d"
输出格式:"Result=%d\n"
如果输入月份不在1到12月份之间输出错误提示信息"Input error!\n"
如果输入的日期不符合规定,输出:"Input error!\n"
输入输出用例1:
Please Input the Date:
2010-10-2
Result=275
输入输出用例2:
Please Input the Date:
2000-4-5
Result=96
输入输出用例3:
Please Input the date:
2017-17-2
Input error!

解答如下:

//判断是否是闰年:
//输入某年,返回0则不是闰年,1则是闰年
int judge_leap_year(int year)
{
	if (year % 4 == 0 && year % 100 != 0)//能被4整除,但不能被100整除;
	{
		return 1;
	}
	if (year % 400 == 0)//能被400整除
	{
		return 1;
	}
	return 0;
}
//判断是一年中的第几天:
int which_day(int year, int month, int day)
{
	if (month > 12 || month < 1)
	{
		printf("Input error!\n");
		return 0;
	}
	else //符合月份规定
	{
		int A = judge_leap_year(year);
		switch (month)  //这里很多case是对于大月中日的合法性判断
		{
		case 1:
			if (day > 31 || day < 1)
			{
				printf("Input error!\n");
				return -1;
			}
			break;
		case 2:
			if (A == 1)//是闰年
			{
				if (day > 29 || day < 1)
				{
					printf("Input error!\n");
					return -1;
				}
			}
			else
			{
				if (day > 28 || day < 1)
				{
					printf("Input error!\n");
					return -1;
				}
			}
			break;
		case 3:
			if (day > 31 || day < 1)
			{
				printf("Input error!\n");
				return -1;
			}
			break;
		case 5:
			if (day > 31 || day < 1)
			{
				printf("Input error!\n");
				return -1;
			}
			break;
		case 7:
			if (day > 31 || day < 1)
			{
				printf("Input error!\n");
				return -1;
			}
			break;
		case 8:
			if (day > 31 || day < 1)
			{
				printf("Input error!\n");
				return -1;
			}
			break;
		case 10:
			if (day > 31 || day < 1)
			{
				printf("Input error!\n");
				return -1;
			}
			break;
		case 12:
			if (day > 31 || day < 1)
			{
				printf("Input error!\n");
				return -1;
			}
			break;
		default://其余小的月份
			if (day > 30 || day < 1)
			{
				printf("Input error!\n");
				return -1;
			}
		}
		switch (month)
		{
		case 1:
			return day;
		case 2:
			return 31 + day;
		case 3:
			return 31 + 28 + day+A;
		case 4:
			return 31 + 28 + 31 + day+A;
		case 5:
			return 31 + 28 + 31 + 30 + day + A;
		case 6:
			return 31 + 28 + 31 + 30 + 31 + day + A;
		case 7:
			return 31 + 28 + 31 + 30 + 31 + 30 + day + A;
		case 8:
			return 31 + 28 + 31 + 30 + 31 + 30 + 31 + day + A;
		case 9:
			return 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + day + A;
		case 10:
			return 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + day + A;
		case 11:
			return 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + day + A;
		case 12:
			return 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + day + A;
		}
	}
}
int main()
{
	//读取和保存数据
	int year, month, day;
	printf("Please Input the Date:\n");
	scanf("%d-%d-%d",&year,&month,&day);
	//调用函数判断:
	int A = judge_leap_year(year);
	int B = which_day(year, month, day);
	//合法之后在进行下一步
	if (B != 0&&B!=-1)
	{
		printf("Result=%d\n", B);
	}
	return 0;
}

原题目没有考虑日期的合法性,这里用了switch-case对其进行合法性判断的补充,更加全面.对于代码的注释写的都很详细,希望大家喜欢.

  • 25
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值