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 語言代碼的全面解析和相關知識介紹,希望對你有所幫助。如果你在學習過程中還有其他疑問,歡迎隨時交流探討。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/67604.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/67604.shtml
英文地址,請注明出處:http://en.pswp.cn/web/67604.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

rsync安裝與使用-linux015

使用 rsync 可以非常高效地將文件或目錄從一個服務器傳輸到另一個服務器。 能力&#xff1a; 支持 64 位文件、64 位 inode、64 位時間戳、64 位長整型支持套接字對、符號鏈接、符號鏈接時間、硬鏈接、硬鏈接特殊文件、硬鏈接符號鏈接支持 IPv6、訪問時間&#xff08;atimes&…

UE5.3 C++ CDO的初步理解

一.UObject UObject是所有對象的基類&#xff0c;往上還有UObjectBaseUtility。 注釋&#xff1a;所有虛幻引擎對象的基類。對象的類型由基于 UClass 類來定義。 這為創建和使用UObject的對象提供了 函數&#xff0c;并且提供了應在子類中重寫的虛函數。 /** * The base cla…

Pandas基礎06(異常值的檢測與過濾/抽樣/常用聚合函數/數據聚合)

Pandas基礎06 異常值的檢測與過濾 在數據分析中&#xff0c;異常值&#xff08;Outliers&#xff09;是指與其他數據點顯著不同的值。這些值可能由于數據錄入錯誤、設備故障或極端情況而產生&#xff0c;因此在進行數據分析之前&#xff0c;需要對其進行檢測與過濾。本文將介紹…

【PyTorch】4.張量拼接操作

個人主頁&#xff1a;Icomi 在深度學習蓬勃發展的當下&#xff0c;PyTorch 是不可或缺的工具。它作為強大的深度學習框架&#xff0c;為構建和訓練神經網絡提供了高效且靈活的平臺。神經網絡作為人工智能的核心技術&#xff0c;能夠處理復雜的數據模式。通過 PyTorch&#xff0…

jstat命令詳解

jstat 用于監視虛擬機運行時狀態信息的命令&#xff0c;它可以顯示出虛擬機進程中的類裝載、內存、垃圾收集、JIT 編譯等運行數據。 命令的使用格式如下。 jstat [option] LVMID [interval] [count]各個參數詳解&#xff1a; option&#xff1a;操作參數LVMID&#xff1a;本…

App.Current.Services.GetService<UserView>()無限循環

代碼無線循環 public partial class UserView : UserControl{public UserView(){InitializeComponent();InitData();}private void InitData(){DataContext App.Current.Services.GetService<UserView>();}} } DataContext App.Current.Services.GetService<User…

(動態規劃路徑基礎 最小路徑和)leetcode 64

視頻教程 1.初始化dp數組&#xff0c;初始化邊界 2、從[1行到n-1行][1列到m-1列]依次賦值 #include<vector> #include<algorithm> #include <iostream>using namespace std; int main() {vector<vector<int>> grid { {1,3,1},{1,5,1},{4,2,1}…

松靈機器人 scout ros2 驅動 安裝

必須使用 ubuntu22 必須使用 鏈接的humble版本 #打開can 口 sudo modprobe gs_usbsudo ip link set can0 up type can bitrate 500000sudo ip link set can0 up type can bitrate 500000sudo apt install can-utilscandump can0mkdir -p ~/ros2_ws/srccd ~/ros2_ws/src git cl…

pytorch基于GloVe實現的詞嵌入

PyTorch 實現 GloVe&#xff08;Global Vectors for Word Representation&#xff09; 的完整代碼&#xff0c;使用 中文語料 進行訓練&#xff0c;包括 共現矩陣構建、模型定義、訓練和測試。 1. GloVe 介紹 基于詞的共現信息&#xff08;不像 Word2Vec 使用滑動窗口預測&…

C++ 堆棧分配的區別

這兩種聲明方式有什么區別 1.使用 new 關鍵字動態分配內存 動態分配&#xff1a;使用 new 關鍵字會在堆&#xff08;heap&#xff09;上分配內存&#xff0c;并返回一個指向該內存位置的指針。生命周期&#xff1a;對象的生命周期不會隨著聲明它的作用域結束而結束&#xff0…

深入解析 Linux 內核中的頁面錯誤處理機制

在現代操作系統中,頁面錯誤(Page Fault)是內存管理的重要組成部分。當程序試圖訪問未映射到物理內存的虛擬內存地址時,CPU 會觸發頁面錯誤異常。Linux 內核通過一系列復雜的機制來處理這些異常,確保系統的穩定性和性能。本文將深入解析 Linux 內核中處理頁面錯誤的核心代碼…

MATLAB-Simulink并行仿真示例

一、概述 在進行simulink仿真的過程中常常遇到CPU利用率較低&#xff0c;仿真緩慢的情況&#xff0c;可以借助并行仿真改善這些問題&#xff0c;其核心思想是將參數掃描、蒙特卡洛分析或多工況驗證等任務拆分成多個子任務&#xff0c;利用多核CPU或計算集群的并行計算能力&…

Workbench 中的熱源仿真

探索使用自定義工具對移動熱源進行建模及其在不同行業中的應用。 了解熱源動力學 對移動熱源進行建模為各種工業過程和應用提供了有價值的見解。激光加熱和材料加工使用許多激光束來加熱、焊接或切割材料。盡管在某些情況下&#xff0c;熱源 &#xff08;q&#xff09; 不是通…

I2C基礎知識

引言 這里祝大家新年快樂&#xff01;前面我們介紹了串口通訊協議&#xff0c;現在我們繼續來介紹另一種常見的簡單的串行通訊方式——I2C通訊協議。 一、什么是I2C I2C 通訊協議&#xff08;Inter-Integrated Circuit&#xff09;是由Phiilps公司在上個世紀80年代開發的&#…

深度學習 DAY3:NLP發展史

NLP發展史 NLP發展脈絡簡要梳理如下&#xff1a; (遠古模型&#xff0c;上圖沒有但也可以算NLP&#xff09; 1940 - BOW&#xff08;無序統計模型&#xff09; 1950 - n-gram&#xff08;基于詞序的模型&#xff09; (近代模型&#xff09; 2001 - Neural language models&am…

CSS 背景與邊框:從基礎到高級應用

CSS 背景與邊框&#xff1a;從基礎到高級應用 1. CSS 背景樣式1.1 背景顏色示例代碼&#xff1a;設置背景顏色 1.2 背景圖像示例代碼&#xff1a;設置背景圖像 1.3 控制背景平鋪行為示例代碼&#xff1a;控制背景平鋪 1.4 調整背景圖像大小示例代碼&#xff1a;調整背景圖像大小…

HarmonyOS簡介:應用開發的機遇、挑戰和趨勢

問題 更多的智能設備并沒有帶來更好的全場景體驗 連接步驟復雜數據難以互通生態無法共享能力難以協同 主要挑戰 針對不同設備上的不同操作系統&#xff0c;重復開發&#xff0c;維護多套版本 多種語言棧&#xff0c;對人員技能要求高 多種開發框架&#xff0c;不同的編程…

【Linux】列出所有連接的 WiFi 網絡的密碼

【Linux】列出所有連接的 WiFi 網絡的密碼 終端輸入 sudo grep psk /etc/NetworkManager/system-connections/*會列出所有連接過 Wifi 的信息&#xff0c;格式類似 /etc/NetworkManager/system-connections/AAAAA.nmconnection:pskBBBBBAAAAA 是 SSID&#xff0c;BBBBB 是對…

如何使用tushare pro獲取股票數據——附爬蟲代碼以及tushare積分獲取方式

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、pandas是什么&#xff1f;二、使用步驟 1.引入庫2.讀入數據 總結 一、Tushare 介紹 Tushare 是一個提供中國股市數據的API接口服務&#xff0c;它允許用戶…

觀察者模式和訂閱發布模式的關系

有人把觀察者模式等同于發布訂閱模式&#xff0c;也有人認為這兩種模式存在差異&#xff0c;本質上就是調度的方法不同。 發布訂閱模式: 觀察者模式: 相比較&#xff0c;發布訂閱將發布者和觀察者之間解耦。&#xff08;發布訂閱有調度中心處理&#xff09;