定义一个结构体变量(包括年,月,日)。计算该日在本年中是第几天

定义一个结构体变量(包括年,月,日)。计算该日在本年中是第几天,注意闰年问题

#include <stdio.h>

struct dayOfYear{
	int year, month, day;
};


int main(){

	struct dayOfYear p;

	printf("请输入年,月,日:\n");
	scanf("%d %d %d", &p.year, &p.month, &p.day);
	int sum = 0;
	int a[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
	for (int i = 0; i < p.month - 1; i++)
	{
		sum = sum + a[i];
	}
	sum += p.day;
	if (p.year % 4 == 0 && p.year % 100 != 0)
	{
		if (p.month > 2){
			sum += 1;
			printf("是闰年,是第%d天", sum);
		}
		else
		{
			printf("是闰年,是第%d天", sum);
		}
	}
	else if (p.year % 400 == 0)
	{
		if (p.month > 2)
		{
			sum += 1;
			printf("是闰年,是第%d天", sum);
		}
		else
		{
			printf("是闰年,是第%d天", sum);
		}

	}
	else
	{
		printf("不是闰年是第%d天", sum);
	}
}

写一个函数days,实现上面的计算,有主函数将年月日传递给days函数,计算后将日子数传回主函数输出

#include <stdio.h>

struct dayOfYear{
	int year, month, day;
};

int days(int year, int month, int day);

int main(){

	struct dayOfYear p;
	
	printf("请输入年,月,日:\n");
	scanf("%d %d %d", &p.year, &p.month, &p.day);
	days(p.year,p.month,p.day);
	
}

int days(int year, int month, int day){
	int sum = 0;
	int a[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
	for (int i = 0; i < month - 1; i++)
	{
		sum = sum + a[i];
	}
	sum += day;
	if (year % 4 == 0 && year % 100 != 0)
	{
		if (month > 2){
			sum += 1;
			printf("是闰年,是第%d天", sum);
		}
		else
		{
			printf("是闰年,是第%d天", sum);
		}
	}
	else if (year % 400 == 0)
	{
		if (month > 2)
		{
			sum += 1;
			printf("是闰年,是第%d天", sum);
		}
		else
		{
			printf("是闰年,是第%d天", sum);
		}

	}
	else
	{
		printf("不是闰年是第%d天", sum);
	}
	return 0;
}

 

  • 11
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 好的,以下是用文回复: 可以定义一个结构体变量来表示期,包括三个成员变量。然后可以编写一个函数来计算在本第几天。 具体实现方法如下: 1. 定义结构体变量: ``` struct Date { int year; int month; int day; }; ``` 2. 编写计算函数: ``` int dayOfYear(struct Date date) { int days[] = {,31,59,90,120,151,181,212,243,273,304,334}; int day = days[date.month - 1] + date.day; if (date.month > 2 && (date.year % 4 == && date.year % 100 != || date.year % 400 == )) { day++; } return day; } ``` 3. 调用函数: ``` struct Date date = {2021, 5, 1}; int day = dayOfYear(date); printf("202151是本的第%d天\n", day); ``` 输出结果为: ``` 202151是本的第121天 ``` ### 回答2: 定义一个结构体变量可以用以下语句: ``` struct Date { int year; int month; int day; }; Date currentDate = {2022, 10, 7}; // 假设当前期为2022107 ``` 接下来我们需要计算在本第几天。具体做法是先计算出该之前所有份的天数总和,再加上当的天数即可。考虑闰的情况,对于公历闰来说,2有29天,否则只有28天。因此需要判断当前份是否为闰。闰的判断方法是:份能够被4整除但不能被100整除,或者能够被400整除。下面是计算天数的代码: ``` int days_of_month[12] = {31, 28 + is_leap_year(currentDate.year), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // 每个份的天数 int is_leap_year(int year) { // 判断是否为闰 return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0; } int days = 0; for (int i = 0; i < currentDate.month - 1; ++i) { days += days_of_month[i]; } days += currentDate.day; printf("当前期在本是第 %d 天\n", days); ``` 以2022107为例,该期在本是第280天。 ### 回答3: 首先定义一个结构体变量包括三个成员: ``` struct Date { int year; int month; int day; } date; ``` 接下来,输入这个结构体变量: ``` printf("请输入(yyyy-mm-dd):"); scanf("%d-%d-%d", &date.year, &date.month, &date.day); ``` 然后,计算在本第几天。可以通过循环累加每个的天数来实现。需要注意的是,闰的2份有29天,而平的2份只有28天,其余份的天数是一样的。 ``` int days[] = {0,31,28,31,30,31,30,31,31,30,31,30,31}; // 初始化每个的天数 int total_days = 0; // 初始化总天数 for (int i = 1; i < date.month; i++) { total_days += days[i]; // 累加前面份的天数 } if ((date.year % 4 == 0 && date.year % 100 != 0) || date.year % 400 == 0) { // 闰的2份有29天 days[2] = 29; } else { // 平的2份有28天 days[2] = 28; } total_days += date.day; // 累加当的天数 ``` 最后输出该在本第几天: ``` printf("该在本是第%d天。\n", total_days); ``` 完整代码如下: ``` #include <stdio.h> struct Date { int year; int month; int day; } date; int main() { printf("请输入(yyyy-mm-dd):"); scanf("%d-%d-%d", &date.year, &date.month, &date.day); int days[] = {0,31,28,31,30,31,30,31,31,30,31,30,31}; int total_days = 0; for (int i = 1; i < date.month; i++) { total_days += days[i]; } if ((date.year % 4 == 0 && date.year % 100 != 0) || date.year % 400 == 0) { days[2] = 29; } else { days[2] = 28; } total_days += date.day; printf("该在本是第%d天。\n", total_days); return 0; } ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值