当前位置: 首页 > 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;沿着负…...

边缘设备福音:在树莓派上部署CosyVoice-300M Lite语音合成服务

边缘设备福音&#xff1a;在树莓派上部署CosyVoice-300M Lite语音合成服务 1. 为什么选择CosyVoice-300M Lite 1.1 专为边缘计算优化的语音合成方案 在物联网和边缘计算场景中&#xff0c;我们经常需要在资源受限的设备上运行AI模型。传统语音合成方案要么体积庞大&#xff…...

10分钟掌握 Terraform AWS EKS Blueprints 的 Karpenter 集成:实现自动节点扩展与成本优化终极指南

10分钟掌握 Terraform AWS EKS Blueprints 的 Karpenter 集成&#xff1a;实现自动节点扩展与成本优化终极指南 【免费下载链接】terraform-aws-eks-blueprints Configure and deploy complete EKS clusters. 项目地址: https://gitcode.com/gh_mirrors/te/terraform-aws-eks…...

Go语言中的包管理

Go语言中的包管理 1. 包管理的基本概念 包管理是Go语言开发中的重要部分&#xff0c;它负责管理项目的依赖关系。Go语言的包管理经历了几个阶段&#xff1a; GOPATH模式vendor模式Go Modules模式&#xff08;当前推荐&#xff09; 2. Go Modules简介 Go Modules是Go 1.11引入的…...

刘教链|比特币税收漏洞即将关闭,稳定币却成最大赢家

一觉醒来&#xff0c;BTC小幅回升至67k一线。地区冲突阴云不散&#xff0c;加密市场始终承压。最近美国国会又出了个新草案&#xff0c;叫Digital Asset PARITY Act。名字听起来很公平&#xff0c;追求资产平等待遇&#xff0c;但仔细一看&#xff0c;这哪里是平等&#xff0c;…...

从“制造”到“智造”:TVA如何成为智能工厂的底层代码?

当我们在谈论AI视觉检测&#xff0c;尤其是AI智能体视觉检测&#xff08;TVA&#xff09;时&#xff0c;我们究竟在谈论什么&#xff1f;如果只把它看作是“替代几个质检工人”的工具&#xff0c;那就太低估它的价值了。在产业升级的洪流中&#xff0c;每一次技术的迭代&#x…...

微生物网络分析参数配置与结果验证:microeco中SpiecEasi的进阶应用指南

微生物网络分析参数配置与结果验证&#xff1a;microeco中SpiecEasi的进阶应用指南 【免费下载链接】microeco An R package for data analysis in microbial community ecology 项目地址: https://gitcode.com/gh_mirrors/mi/microeco 在微生物生态学研究中&#xff0c…...

如何用kepano-obsidian构建你的终极知识管理系统:从零到精通的完整指南

如何用kepano-obsidian构建你的终极知识管理系统&#xff1a;从零到精通的完整指南 【免费下载链接】kepano-obsidian My personal Obsidian vault template. A bottom-up approach to note-taking and organizing things I am interested in. 项目地址: https://gitcode.com…...

从华为实践学IPD:手把手教你写高通过率的Charter文档

华为IPD方法论实战&#xff1a;打造高价值Charter文档的7个关键步骤 在科技企业的研发管理领域&#xff0c;一份优秀的Charter文档往往决定着数千万甚至上亿研发投入的成败。华为IPD&#xff08;集成产品开发&#xff09;体系中的Charter开发流程&#xff0c;被全球众多科技企业…...

AIGC技术实操:AI生图、AI视频开发与工具集成

2026年&#xff0c;AIGC技术已从“玩具级应用”走向“产业级工具”&#xff0c;其中AI生图、AI视频成为开发者的热门布局领域&#xff0c;据统计&#xff0c;AIGC/传媒领域商业化进程最快&#xff0c;MCN行业人工智能渗透率超60%&#xff0c;广告行业渗透率达55%。对于开发者而…...

自动驾驶车辆横向轨迹跟踪:基于NN与ANFIS优化MPC的探索

轨迹跟踪算法-基于神经网络NN或自适应神经模糊系统ANFIS优化模型预测控制MPC 的自动驾驶车辆横向轨迹跟踪 包含&#xff1a; 1.参考文献&#xff1b; 2.基于神经网络NN的自适应参数&#xff08;Np、Nc、Q、R 等&#xff09;的离散 MPC对比模型和代码&#xff1b; 3.基于自适应神…...