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

JAVA(SpringBoot)集成Kafka实现消息发送和接收。

SpringBoot集成Kafka实现消息发送和接收。 一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者 君子之学贵一&#xff0c;一则明&#xff0c;明则有功。 一、Kafka 简介 Kafka 是由 Apache 软件基金会开发的一个开源流处理平台&#xff0c;最初由 Link…...

AI刷题-蛋糕工厂产能规划、优质章节的连续选择

挑两个简单的写写 目录 一、蛋糕工厂产能规划 问题描述 输入格式 输出格式 解题思路&#xff1a; 问题理解 数据结构选择 算法步骤 关键点 最终代码&#xff1a; 运行结果&#xff1a;​编辑 二、优质章节的连续选择 问题描述 输入格式 输出格式 解题思路&a…...

在线可编辑Excel

1. Handsontable 特点&#xff1a; 提供了类似 Excel 的表格编辑体验&#xff0c;包括单元格样式、公式计算、数据验证等功能。 支持多种插件&#xff0c;如筛选、排序、合并单元格等。 轻量级且易于集成到现有项目中。 具备强大的自定义能力&#xff0c;可以调整外观和行为…...

什么是词嵌入?Word2Vec、GloVe 与 FastText 的区别

自然语言处理(NLP)领域的核心问题之一,是如何将人类的语言转换成计算机可以理解的数值形式,而词嵌入(Word Embedding)正是为了解决这个问题的重要技术。本文将详细讲解词嵌入的概念及其经典模型(Word2Vec、GloVe 和 FastText)的原理与区别。 1. 什么是词嵌入(Word Em…...

WPS数据分析000010

基于数据透视表的内容 一、排序 手动调动 二、筛选 三、值显示方式 四、值汇总依据 五、布局和选项 不显示分类汇总 合并居中带标签的单元格 空单元格显示 六、显示报表筛选页...

Qt中QVariant的使用

1.使用QVariant实现不同类型数据的相加 方法&#xff1a;通过type函数返回数值的类型&#xff0c;然后通过setValue来构造一个QVariant类型的返回值。 函数&#xff1a; QVariant mainPage::dataPlus(QVariant a, QVariant b) {QVariant ret;if ((a.type() QVariant::Int) &a…...

Avalonia UI MVVM DataTemplate里绑定Command

Avalonia 模板里面绑定ViewModel跟WPF写法有些不同。需要单独绑定Command. WPF里面可以直接按照下面的方法绑定DataContext. <Button Content"Button" Command"{Binding DataContext.ClickCommand, RelativeSource{RelativeSource AncestorType{x:Type User…...

动态规划DP 数字三角型模型 最低通行费用(题目详解+C++代码完整实现)

最低通行费用 原题链接 AcWing 1018. 最低同行费用 题目描述 一个商人穿过一个 NN的正方形的网格&#xff0c;去参加一个非常重要的商务活动。 他要从网格的左上角进&#xff0c;右下角出。每穿越中间 1个小方格&#xff0c;都要花费 1个单位时间。商人必须在 (2N−1)个单位…...

deepseek R1的确不错,特别是深度思考模式

deepseek R1的确不错&#xff0c;特别是深度思考模式&#xff0c;每次都能自我反省改进。比如我让 它写文案&#xff1a; 【赛博朋克版程序员新春密码——2025我们来破局】 亲爱的代码骑士们&#xff1a; 当CtrlS的肌肉记忆遇上抢票插件&#xff0c;当Spring Boot的…...

Linux 常用命令 - sort 【对文件内容进行排序】

简介 sort 命令源于英文单词 “sort”&#xff0c;表示排序。其主要功能是对文本文件中的行进行排序。它可以根据字母、数字、特定字段等不同的标准进行排序。sort 通过逐行读取文件&#xff08;没有指定文件或指定文件为 - 时读取标准输入&#xff09;内容&#xff0c;并按照…...