当前位置: 首页 > news >正文

C 语言实现计算一年中指定日期是第几天 题】

引言

 在编程的世界里,处理日期和时间相关的问题是非常常见的。比如在日历应用、任务管理系统、数据分析等场景中,经常需要计算某个日期在一年中是第几天。本文将详细介绍如何使用 C 语言来实现这一功能,通过分析代码的结构、逻辑以及可能存在的问题和改进方法,帮助大家更好地理解和掌握相关知识。

 

代码整体功能概述

 给定的 C 语言代码旨在实现一个简单的功能:从用户那里获取输入的年份、月份和日期,然后计算并输出该日期是对应年份中的第几天。代码通过定义变量存储年份、月份、日期,使用数组存储每个月的天数,并通过循环和条件判断来累加天数,最终得到结果。

代码详细解析

 1. 头文件和主函数声明

#include <stdio.h>

 

int main() 

{

 

代码开头包含了  <stdio.h>  头文件,这个头文件提供了标准输入输出函数的声明,比如我们后面要用到的  scanf  和  printf  函数。 main  函数是 C 程序的入口点,程序从这里开始执行。

 2. 变量定义

    int year=0;

    int month=0;

    int day=0;

    int sum=0;

 这里定义了四个整型变量。 year  用于存储输入的年份, month  存储月份, day  存储日期, sum  用于累加从 1 月到输入月份之前所有月份的天数。

 3. 输入获取

    scanf("%d %d %d", &year, &month, &day);

 

 scanf  函数用于从标准输入(通常是键盘)读取用户输入的内容。 %d %d %d  是格式控制字符串,表示要读取三个整数,分别对应年份、月份和日期。 &year 、 &month  和  &day  是变量的地址, scanf  函数会将读取到的值存储到这些变量对应的内存位置中。

 4. 存储每月天数的数组

    int arr[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};

 定义了一个包含 13 个元素的整型数组  arr ,用于存储每个月的天数。数组的下标从 0 开始,但下标为 0 的元素没有实际意义,下标 1 - 12 分别对应 1 - 12 月。初始值按照平年的月份天数设置,即 1、3、5、7、8、10、12 月有 31 天,4、6、9、11 月有 30 天,2 月有 28 天。

 5. 结果变量和循环累加

    int resault=0;

    for(int i=1;i<month;i++) 

    {

        if(year%4==0&&year%100!=0 || year%400==0)

        {

            if(i==2)

            {

                arr[i]=29;

            }

            sum = sum +arr[i];

        }

        else

        {

            sum = sum +arr[i];

        }

    }

 

 resault  变量用于存储最终的结果,即该日期是一年中的第几天。 for  循环从 1 开始,到  month - 1  结束,用于累加输入月份之前所有月份的天数。在循环内部,首先通过条件  if(year%4==0&&year%100!=0 || year%400==0)  判断当前年份是否为闰年。如果是闰年,并且当前循环到的月份是 2 月( i == 2 ),则将  arr[2]  的值改为 29,即 2 月有 29 天。然后将当前月份的天数累加到  sum  中。如果不是闰年,则直接按照数组中存储的平年天数进行累加。

 

6. 计算最终结果并输出

    resault=sum+day;

    printf("%d",resault);

 将累加得到的之前月份的天数  sum  加上输入的日期  day ,得到最终的结果并存储在  resault  中。最后使用  printf  函数将结果输出到标准输出(通常是控制台)。

 

7. 主函数结束

    return 0;

}

 return 0  表示程序正常结束,返回值 0 通常用于向操作系统表明程序执行成功。

 

代码存在的问题

 1. 输入验证缺失

 代码中没有对用户输入的年份、月份和日期进行有效性检查。例如,年份可能是负数,月份可能不在 1 - 12 的范围内,日期可能超出了对应月份应有的天数(比如 2 月输入 30 天等)。如果用户输入了无效数据,程序可能会产生错误的结果甚至崩溃。

 2. 闰年判断逻辑的位置问题

 当前闰年判断逻辑在累加月份天数的循环内部,虽然功能上可以实现,但从代码结构和可读性角度来看,不够清晰。可以将闰年判断逻辑封装成一个单独的函数,这样代码的模块化程度更高,也更易于维护和理解。

 3. 数组使用的小瑕疵

数组  arr  的下标 0 没有实际意义,这种设计可能会让代码阅读者产生困惑,并且在一定程度上浪费了内存空间。可以考虑从下标 0 开始对应 1 月,重新设计数组的使用方式。

 

改进后的代码

#include <stdio.h>

 

// 判断是否为闰年

int isLeapYear(int year) {

    return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);

}

 

// 获取每个月的天数

int getDaysInMonth(int year, int month) {

    int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

    if (month == 2 && isLeapYear(year)) {

        return 29;

    }

    return days[month - 1];

}

 

int main() {

    int year, month, day;

    printf("请输入年份 月份 日期: ");

    while (scanf("%d %d %d", &year, &month, &day) != 3 || year < 0 || month < 1 || month > 12 || day < 1 || day > getDaysInMonth(year, month)) {

        printf("输入无效,请重新输入年份 月份 日期: ");

        while (getchar() != '\n'); // 清空输入缓冲区

    }

 

    int sum = 0;

    for (int i = 1; i < month; i++) {

        sum += getDaysInMonth(year, i);

    }

    sum += day;

    printf("这是该年的第 %d 天\n", sum);

    return 0;

}

 改进点说明

 - 输入验证:在  main  函数中,使用  while  循环对用户输入进行验证。如果输入的格式不正确( scanf  的返回值不等于 3,因为  scanf  成功读取三个整数时返回 3),或者年份、月份、日期不在合理范围内,就提示用户重新输入,并使用  getchar()  函数清空输入缓冲区,避免无效输入一直滞留在缓冲区影响后续输入。

 - 函数封装:将闰年判断逻辑封装成  isLeapYear  函数,将获取每个月天数的逻辑封装成  getDaysInMonth  函数。这样代码结构更加清晰,可读性和可维护性大大提高。

 - 数组优化:在  getDaysInMonth  函数中,数组  days  从下标 0 开始对应 1 月,通过  month - 1  来正确索引数组,避免了之前下标 0 无实际意义的问题。

 

总结

 通过对计算一年中指定日期是第几天的 C 语言代码的分析,我们深入了解了代码的实现逻辑、存在的问题以及如何进行改进。在编写程序时,不仅要关注功能的实现,还要注重代码的健壮性(如输入验证)、可读性(如函数封装和合理的变量命名)和可维护性。希望本文能帮助大家更好地理解 C 语言在日期计算方面的应用,并且在今后的编程中写出更加优质的代码。

       以上就是关于该 C 语言代码的全面解析和相关知识介绍,希望对你有所帮助。如果你在学习过程中还有其他疑问,欢迎随时交流探讨。

相关文章:

C 语言实现计算一年中指定日期是第几天 题】

引言 在编程的世界里&#xff0c;处理日期和时间相关的问题是非常常见的。比如在日历应用、任务管理系统、数据分析等场景中&#xff0c;经常需要计算某个日期在一年中是第几天。本文将详细介绍如何使用 C 语言来实现这一功能&#xff0c;通过分析代码的结构、逻辑以及可能存在…...

深入理解三高架构:高可用性、高性能、高扩展性的最佳实践

引言 在现代互联网环境下&#xff0c;随着用户规模和业务需求的快速增长&#xff0c;系统架构的设计变得尤为重要。为了确保系统能够在高负载和复杂场景下稳定运行&#xff0c;"三高架构"&#xff08;高可用性、高性能、高扩展性&#xff09;成为技术架构设计中的核…...

【反悔堆】力扣1642. 可以到达的最远建筑

给你一个整数数组 heights &#xff0c;表示建筑物的高度。另有一些砖块 bricks 和梯子 ladders 。 你从建筑物 0 开始旅程&#xff0c;不断向后面的建筑物移动&#xff0c;期间可能会用到砖块或梯子。 当从建筑物 i 移动到建筑物 i1&#xff08;下标 从 0 开始 &#xff09;…...

关于使用Mybatis-plus的TableNameHandler动态表名处理器实现分表业务的详细介绍

引言 随着互联网应用的快速发展&#xff0c;数据量呈爆炸式增长。传统的单表设计在面对海量数据时显得力不从心&#xff0c;容易出现性能瓶颈、查询效率低下等问题。为了提高数据库的扩展性和响应速度&#xff0c;分表&#xff08;Sharding&#xff09;成为了一种常见的解决方案…...

docker 安装 redis 详解

在平常的开发工作中&#xff0c;我们经常会用到 redis&#xff0c;那么 docker 下应该如何安装 redis 呢&#xff1f;简单来说&#xff1a;第一步&#xff1a;拉取redis镜像&#xff1b;第二步&#xff1a;设置 redis.conf 配置文件&#xff1b;第三步&#xff1a;编写 docker-…...

56. 合并区间

【题目】&#xff1a;56. 合并区间 class Solution { public:vector<vector<int>> merge(vector<vector<int>>& intervals) {// 按照左端点排序sort(intervals.begin(), intervals.end(), [&](vector<int> lhs, vector<int> rhs)…...

BOM对象location与数组操作结合——查询串提取案例

BOM对象location与数组操作结合——查询串提取案例 前置知识 1. Location 对象 Location 对象是 JavaScript 提供的内置对象之一&#xff0c;它表示当前窗口或框架的 URL&#xff0c;并允许你通过它操作或获取 URL 的信息。可以通过 window.location 访问。 主要属性&#…...

Jetson Orin Nano Super之 onnxruntime 编译安装

Jetson Orin Nano Super之 onnxruntime 编译安装 1. 源由2. 步骤步骤一&#xff1a;安装3.26 cmake步骤二&#xff1a;下载代码步骤三&#xff1a;编译代码步骤四&#xff1a;找到安装包步骤五&#xff1a;安装whl包 3. 注意4. 参考资料 1. 源由 Build onnxruntime 1.19.2 fai…...

开发环境搭建-3:配置 nodejs 开发环境 (fnm+ node + pnpm)

在 WSL 环境中配置&#xff1a;WSL2 (2.3.26.0) Oracle Linux 8.7 官方镜像 node 官网&#xff1a;https://nodejs.org/zh-cn/download 点击【下载】&#xff0c;选择想要的 node 版本、操作系统、node 版本管理器、npm包管理器 根据下面代码提示依次执行对应代码即可 基本概…...

[SWPUCTF 2022 新生赛]js_sign

题目 查看页面源代码 <!DOCTYPE html> <html> <head><meta charset"utf-8"><style>body {background-color: rgb(255, 255, 255);}</style> </head> <body><input id"flag" /><button>Check…...

农业信息化的基本框架

农业信息化的主要研究内容 基于作物模型的相关研究 作物生长模拟模型以及模型评价、模型的应用作物模型应用&#xff0c;包括&#xff1a;作物生态系统过程、生产管理措施、区域作物产量评估与气候变化对产量影响预测、基于作物模型的决策支持系统 数据挖掘、知识工程及应用、管…...

OpenAI的真正对手?DeepSeek-R1如何用强化学习重构LLM能力边界——DeepSeek-R1论文精读

2025年1月20日&#xff0c;DeepSeek-R1 发布&#xff0c;并同步开源模型权重。截至目前&#xff0c;DeepSeek 发布的 iOS 应用甚至超越了 ChatGPT 的官方应用&#xff0c;直接登顶 AppStore。 DeepSeek-R1 一经发布&#xff0c;各种资讯已经铺天盖地&#xff0c;那就让我们一起…...

Vue 3 中的父子组件传值:详细示例与解析

在 Vue 3 中&#xff0c;父子组件之间的数据传递是一个常见的需求。父组件可以通过 props 将数据传递给子组件&#xff0c;而子组件可以通过 defineProps 接收这些数据。本文将详细介绍父子组件传值的使用方法&#xff0c;并通过优化后的代码示例演示如何实现。 1. 父子组件传值…...

回顾2024,展望2025

项目 LMD performance phase2 今年修修补补&#xff0c;设计和做了很多item&#xff0c;有时候自己都数不清做了什么大大小小的item&#xff0c;但是for LMD performance phase2的go-live确实是最大也是最难的了&#xff0c;无论什么系统&#xff0c;只要用的人多了&#xff…...

【Python实现机器遗忘算法】复现2021年顶会 AAAI算法Amnesiac Unlearning

【Python实现机器遗忘算法】复现2021年顶会 AAAI算法Amnesiac Unlearning 1 算法原理 论文&#xff1a;Graves, L., Nagisetty, V., & Ganesh, V. (2021). Amnesiac machine learning. In Proceedings of the AAAI Conference on Artificial Intelligence, volume 35, 115…...

Vue 3 30天精进之旅:Day 03 - Vue实例

引言 在前两天的学习中&#xff0c;我们成功搭建了Vue.js的开发环境&#xff0c;并创建了我们的第一个Vue项目。今天&#xff0c;我们将深入了解Vue的核心概念之一——Vue实例。通过学习Vue实例&#xff0c;你将理解Vue的基础架构&#xff0c;掌握数据绑定、模板语法和指令的使…...

【ArcGIS微课1000例】0141:提取多波段影像中的单个波段

文章目录 一、波段提取函数二、加载单波段导出问题描述:如下图所示,img格式的时序NDVI数据有24个波段。现在需要提取某一个波段,该怎样操作? 一、波段提取函数 首先加载多波段数据。点击【窗口】→【影像分析】。 选择需要处理的多波段影像,点击下方的【添加函数】。 在多…...

【第九天】零基础入门刷题Python-算法篇-数据结构与算法的介绍-六种常见的图论算法(持续更新)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Python数据结构与算法的详细介绍1.Python中的常用的图论算法2. 图论算法3.详细的图论算法1&#xff09;深度优先搜索&#xff08;DFS&#xff09;2&#xf…...

落地 轮廓匹配

个人理解为将一幅不规则的图形&#xff0c;通过最轮廓发现&#xff0c;最大轮廓匹配来确定图像的位置&#xff0c;再通过pt将不规则的图像放在规定的矩形里面&#xff0c;在通过透视变换将不规则的图形放进规则的图像中。 1. findHomography 函数 • Mat h findHomography(s…...

【漫话机器学习系列】064.梯度下降小口诀(Gradient Descent rule of thume)

梯度下降小口诀 为了帮助记忆梯度下降的核心原理和关键注意事项&#xff0c;可以用以下简单口诀来总结&#xff1a; 1. 基本原理 损失递减&#xff0c;梯度为引&#xff1a;目标是让损失函数减少&#xff0c;依靠梯度指引方向。负梯度&#xff0c;反向最短&#xff1a;沿着负…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...