C语言题目:结构体之时间设计

文章介绍了如何编写一个程序,通过定义结构体和count函数来计算给定日期(包括年、月、日)在当年的天数,同时考虑闰年的判断规则。程序利用数组存储不同月份的天数,并在main函数中获取用户输入并输出结果。
摘要由CSDN通过智能技术生成

题目描述

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

输入格式

年月日

输出格式

当年第几天

样例输入

2000 12 31

样例输出

366

判断闰年的规则

  1. 如果年份能够被4整除,但不能被100整除,则是闰年。
  2. 如果年份能够被400整除,则是闰年。

题目解析

  1. 首先,定义了一个date结构体,用于存储日期信息,包括年(year)、月(month)和日(day)。
    struct date
    {
    	int year;
    	int month;
    	int day;
    };

  2. 接下来,定义了一个名为count的函数,该函数接收一个date类型的参数arr。这个函数的目的是计算并返回从公元元年1月1日到给定日期arr之间的天数总和。
    int count(struct date arr)

  3. count函数内部,首先定义了一个整数变量sum,用于累加天数,初始值为0。然后定义了一个整数数组month_day,用于存储每个月的天数。数组的大小为13,因为一年有12个月加上一个用于错误月份判断的额外空间。
    	int sum = 0;
    	int month_day[13] = {0};

  4. 接下来,使用了一个条件判断来检查给定的年份arr.year是否为闰年。根据闰年的定义,如果年份能被400整除,或者能被4整除但不能被100整除,则该年是闰年。
    	if ((arr.year % 400 == 0) || (arr.year % 4 == 0 && arr.year % 100 != 0))

  5. 如果是闰年,那么从1月到给定月份之前的所有月份的天数将被计算出来。使用一个for循环,从1开始遍历到给定的月份arr.month
    • 如果当前月份是1月、3月、5月、7月、8月、10月或12月,则这些月份都有31天,所以month_day数组对应的位置被设置为31。
    • 如果当前月份是2月,因为是闰年,所以2月有29天,month_day数组对应的位置被设置为29。
    • 对于其他月份,即4月、6月、9月和11月,它们都有30天,所以month_day数组对应的位置被设置为30。
    • 每设置好一个月的天数后,就将其加到sum变量上。
      		if (arr.month > 1)
      		{
      			for (int i = 1; i < arr.month; i++)
      			{
      				if (i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 || i == 12)
      					month_day[i] = 31;
      				else if (i == 2)
      					month_day[i] = 29;
      				else
      					month_day[i] = 30;
      				sum += month_day[i];
      			}
      		}
      		sum += arr.day;

  6. 如果不是闰年,那么计算方法类似,只是在2月时只有28天。
    				else if (i == 2)
    					month_day[i] = 28;

  7. 在计算完所有月份的天数后,还需要加上给定日期的天数arr.day
    		sum += arr.day;

  8. 最后,count函数返回累加的天数sum
    	return sum;

  9. main函数中,首先定义了一个date类型的变量now,用于存储用户输入的当前日期。
    	struct date now;

  10. 使用scanf函数读取用户输入的年、月、日,并存储在now变量中。
    	scanf("%d%d%d", &now.year,&now.month,&now.day);

  11. 调用count函数,并将now作为参数传递,计算出结果。
    count(now)

  12. 使用printf函数输出计算结果。
    	printf("%d\n", count(now));

源代码

#include <stdio.h>
struct date
{
	int year;
	int month;
	int day;
};
int count(struct date arr)
{
	int sum = 0;
	int month_day[13] = {0};
	if ((arr.year % 400 == 0) || (arr.year % 4 == 0 && arr.year % 100 != 0))
	{
		if (arr.month > 1)
		{
			for (int i = 1; i < arr.month; i++)
			{
				if (i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 || i == 12)
					month_day[i] = 31;
				else if (i == 2)
					month_day[i] = 29;
				else
					month_day[i] = 30;
				sum += month_day[i];
			}
		}
		sum += arr.day;
	}
	else
	{
		if (arr.month > 1)
		{
			for (int i = 1; i < arr.month; i++)
			{
				if (i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 || i == 12)
					month_day[i] = 31;
				else if (i == 2)
					month_day[i] = 28;
				else
					month_day[i] = 30;
				sum += month_day[i];
			}
		}
		sum += arr.day;
	}
	return sum;
}
int main(void)
{
	struct date now;
	scanf("%d%d%d", &now.year,&now.month,&now.day);
	printf("%d\n", count(now));
	return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值