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

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...