输入某年某月某日,判断这一天是这一年的第几天?(用数组)

该C程序首先定义了一个避免安全警告的宏,然后读取用户输入的年、月、日。程序检查是否为闰年以调整二月的天数,接着计算给定日期前的所有月份天数之和,最后输出总天数。

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

int main() {
    int year, month, day, sum = 0;
    int a[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
    printf("请输入年、月、日,格式为:年,月,日\n");
    scanf("%d,%d,%d", &year, &month, &day);
    if ((year % 4 == 0) || (year % 400 == 0) && (year % 100 != 0)) {
        a[1] = 29;
    }
    for (int i = 0; i < month - 1; i++) {
        sum = sum + a[i];
    }
    sum = sum + day;
    printf("%d\n", sum);
    return 0;
}

<think>我们使用C语言实现输入某年某月某日,判断一天是该年的第几天。 思路: 1. 输入年、月、日。 2. 判断年份是否为闰年(闰年2月29天,平年2月28天)。 3. 计算该日期是该年的第几天:将前几个月的天数加起来,再加上当月的日期。 4. 注意:如果月份是1月,则直接输出日期即可。 我们可以用一个数组来存储每个月的天数(平年),然后根据闰年调整2月的天数。 另外,需要检查输入的月份和日期是否合法。 参考引用中的代码,我们可以采用两种方法: 方法一:使用数组存储每月天数(平年),然后根据闰年调整2月天数,再累加前几个月的天数。 方法二:使用switch语句的穿透特性(不写break)来累加天数。 这里我们分别实现两种方法,并增加输入验证。 方法一:数组法(更直观) 步骤如下: a. 定义数组存储每月的天数(平年)。 b. 输入年、月、日。 c. 验证月份是否在1-12之间,日期是否在该月有效天数内(注意闰年2月)。 d. 如果是闰年,将2月的天数改为29。 e. 累加前几个月的天数(从0到month-1),再加上日。 方法二:switch穿透法(引用[2]的方法) a. 输入年、月、日。 b. 验证月份和日期。 c. 使用switch从12月开始递减,利用case穿透累加前面各月的天数,最后加上日。 d. 在3月之前(即case 3)判断闰年,如果是闰年则加29天,否则加28天。 我们选择方法一作为主要实现,因为更直观易懂。 但为了完整性,我们也会给出方法二的代码。 我们先使用方法一编写代码: </think># C语言实现:输入日期判断是该年第几天 我将使用C语言实现输入日期判断是该年第几天的功能,参考了站内提供的经典方法并进行了优化。 ## 完整代码实现 ```c #include <stdio.h> #include <stdbool.h> // 判断是否为闰年 bool is_leap_year(int year) { return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); } // 计算某日是该年的第几天 int day_of_year(int year, int month, int day) { // 各月份天数(平年) int days_in_month[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // 闰年调整2月天数 if (is_leap_year(year)) { days_in_month[1] = 29; } // 验证月份合法性 if (month < 1 || month > 12) { printf("错误:无效的月份!请输入1-12之间的月份。\n"); return -1; } // 验证日期合法性 if (day < 1 || day > days_in_month[month-1]) { printf("错误:%d月不存在%d号!\n", month, day); return -1; } // 计算天数(累加前几个月天数+当前月的天数) int days = 0; for (int i = 0; i < month - 1; i++) { days += days_in_month[i]; } days += day; return days; } int main() { int year, month, day; printf("请输入日期(格式:年 月 日,例如:2024 5 21):"); scanf("%d %d %d", &year, &month, &day); int days = day_of_year(year, month, day); if (days > 0) { printf("%d年%d月%d日是%d年的第%d天\n", year, month, day, year, days); } return 0; } ``` ## 算法说明 ### 1. 闰年判断 使用公式: $$is\_leap\_year = (y \mod 4 = 0 \land y \mod 100 \neq 0) \lor (y \mod 400 = 0)$$ ```c bool is_leap_year(int year) { return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); } ``` ### 2. 天数计算 累计天数公式: $$day\_count = \sum_{i=0}^{m-2} days\_in\_month[i] + d$$ 其中: - $m$: 月份(1-12) - $d$: 日期(1-31) ### 3. 输入验证 - 月份范围验证:1 ≤ m ≤ 12 - 日期范围验证:1 ≤ d ≤ 当月最大天数 - 闰年特殊处理:2月天数动态调整 ## 关键优化点 1. **模块化设计**:将闰年判断独立为单独函数 2. **错误处理**:对非法输入给出明确错误提示 3. **数据结构**:使用数组存储每月天数信息 4. **代码复用**:统一计算天数算法,避免重复代码 ## 运行示例 ``` 请输入日期(格式:年 月 日,例如:2024 5 21):2024 2 29 2024年2月29日是2024年的第60天 请输入日期(格式:年 月 日,例如:2024 5 21):2023 2 29 错误:2月不存在29号! ``` ## 算法分析 - **时间复杂度**:$O(1)$(循环最多执行11次) - **空间复杂度**:$O(1)$(使用固定大小数组) 此实现参考了经典C语言日期计算算法[^1],并增加了完善的错误处理机制[^3],确保程序健壮性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值