C语言计算该日在本年中是第几天

解题思路以及程序详解:

思路:

定义一个结构体来接收年月日,先判断接收的数据是否合法,再根据年份来判断是否为闰年,累加输入月份之前的所有天数,再根据输入的月份来判断输入的日期是否合法,最后加上日期即可。

以下是完整的编程步骤:

  1. 定义一个结构体类型Date,包含年、月、日三个成员变量。
  2. 在主函数main中,声明一个Date类型的变量date,用于存放输入的年月日。
  3. 通过scanf函数依次读入年份、月份和日份,并使用getchar函数清除输入缓冲区中的换行符。
  4. 调用calculate函数,将输入的日期作为参数传递给它,并将返回值存储在变量sum中。
  5. calculate函数中,定义两个标志位flag1flag2,用于表示输入月份的类型和闰年/平年的状态。
  6. 根据输入的月份,通过条件判断将flag1设置为不同的值,以确定每个月的天数并以此判断日期是否合法。
  7. 根据输入的年份,通过条件判断将flag2设置为不同的值,以确定是否为闰年。
  8. 进行错误判断,检查输入的年份、月份和日份是否合法。如果不合法,则返回相应的错误码。
  9. 使用循环计算输入月份之前的月份的总天数,根据月份和天数计算总天数。
  10. 最后,根据输入月份是否大于2月,以及是否为闰年,计算总天数,并返回结果。
  11. 在主函数中,根据返回的sum值进行错误判断和输出结果。如果sum等于-1,则表示输入的年份错误;如果sum等于-2,则表示输入的月份错误;如果sum等于-3,则表示输入的日份错误;否则,输出总天数。

通过以上步骤,可以计算给定日期在本年中是第几天,并处理了闰年问题。

代码展示:

#include <stdio.h>

//声明一个结构体类型
struct Date{
	int year;
	int month;
	int day;
};

int calculate(struct Date date);

int main(){
  
	//date	用来存放日期
	struct Date date;	
	int  sum;		//存放总天数以及返回值
  
	//读入年月日
	printf("请输入年份\n");
	scanf("%d", &date.year);
	getchar();
	printf("请输入月份\n");
	scanf("%d", &date.month);
	getchar();
	printf("请输入日份:\n");
	scanf("%d", &date.day);
	getchar();
	sum = calculate(date);
  
	//错误判断
	if(sum == -1)
		printf("输入的年份错误\n");
	else if(sum == -2)
		printf("输入的月份错误错误\n");
	else if(sum == -3)
		printf("输入的日份错误\n");
	else
		printf("总天数为:%d\n", sum);	//打印总天数
	
	return 0;
}

/*
	功能:计算某年开始到某个日期一共多少天
	参数:struct Date date	年月日
	返回值:-1	输入年份错误
		   -2	输入月份错误
		   -3	输入日份错误
		   其他值	总天数
*/
int calculate(struct Date date){
	int flag1 = 0;	//输入月份标志位
	int flag2 = 0;	//闰年,平年标志位
	int sum = 0;	//总天数
	
	if(date.month == 1 || date.month == 3 || date.month == 5 || date.month == 7 || date.month == 8 || date.month == 10 || date.month == 12)
		flag1 = 1;		//每月31天
	else if(date.month == 4 || date.month == 6 || date.month == 9 || date.month == 11)
		flag1 =2;		//每月30天
	else if(date.month == 2)
		flag1 = 5;		//二月
		
		if(date.year % 400 == 0 || date.year % 4 == 0 && date.year % 100 != 0)
			flag2 = 3;	//闰年
		else
			flag2 = 4;	//平年
	
		
	//错误判断	
	if(date.year <= 0)
		return -1;	//年错误
	else if(flag1 == 0)
		return -2;	//月错误
	else if((flag1 == 1 && (date.day < 0 || date.day > 31)) || (flag1 == 2 && (date.day < 0 || date.day > 30)) ||((flag1 == 5 && flag2 == 3) && (date.day < 0 || date.day > 29)) || ((flag1 == 5 && flag2 == 4) &&(date.day < 0 || date.day > 28)))
		return -3;	//日错误
	
	//计算天数
	for(int i = 1; i < date.month; i++){	//除了2月和输入月份的总天数
		if(i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 || i == 12)
			sum = sum + 31;
		else if(i == 4 || i == 6 || i == 9 || i == 11)
			sum = sum + 30;
	}
	if(date.month > 2){	//输入月份是否大于2月
		if(flag2 == 3)
			return sum + 29 + date.day;	//闰年
		else
			return sum + 28 + date.day;	//平年
	}
	else
		return sum + date.day;			//输入月份小于2月
	
}

运行结果:

最后你也可以根据需求将读入数据和错误判断放入循环当中,如果报错则继续循环,直到正确为止

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值