【C 语言之项目实战】判断闰年及计算天数(详细版)

您所在的位置:网站首页 闰年是不是能被4整除 【C 语言之项目实战】判断闰年及计算天数(详细版)

【C 语言之项目实战】判断闰年及计算天数(详细版)

2024-07-11 11:15:36| 来源: 网络整理| 查看: 265

目录 1.项目要求 2.定义模块函数 3.各模块函数实现 4.项目源代码 5.项目总结

1. 项目要求

1.1 首先判断用户输入的年份是否为闰年; 1.2 计算一年中每个月份的天数; 1.3 用户输入日期(年月日),计算输出天数 。

2. 定义函数

2.1 主函数:main() 2.2 判断闰年函数:Is_Leap() 2.3 计算月份天数:Get_YM_day() 2.4 输入日期计算天数:Get_YMD_Total()

3. 各模块函数实现

3.1 判断闰年函数:Is_Leap()

     ①. 算法思想:闰年判断条件是,输入的任意年份满足能被 4 整除但不能被 100 整除或者满足能被 400 整除即可。

     ②. 源程序

/** 判断是否为闰年 */ bool Is_Leap(int year) { /** bool leap; // bool 类型初始值默认为 false if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) { leap = true; } return leap; */ // 等价于 ==> return (year % 4 == 0 && year % 100 != 0 || year % 400 == 0); }

3.2 计算月份天数:Get_YM_day()

     ①. 算法思想:月份天数基本上是固定不变的,除了 2 月份,闰年 29 天,非闰年 28 天。所以采用数组实现,通过查表法,用户输入月份就可得到相应的天数。月份即为数组下标,因为数组下表是从 0 开始,所以下表 0 表示闰年的 2 月天数 29 天,下标 1 – 12 表示非闰年 1 - 12 月 对应的天数。

     ②. 源程序

/** 计算一年中月份的天数 Get_YM_day */ int Get_YM_Day(int year, int month) { // 静态常性数组 static 只初始化一次 const 且只可读不可写 // 主函数每调用一次 都会开辟一次数组空间 调用结束后释放空间 // 用 static 静态关键字 作用域在函数内部 生存期在数据区(.data)避免每次调用每次开辟空间 static const int days[13] = { 29, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // 0 1 2 3 4 5 6 7 8 9 10 11 12 if (month == 2 && Is_Leap(year)) { month = 0; } return days[month]; }

     ③. 总结:静态常性数组 static 只初始化一次,const 只可读不可写,主函数每调用一次都会开辟一次数组空间,调用结束后释放空间;用 static 静态关键字,作用域在函数内部,生存期在数据区(.data),避免每次调用每次开辟空间。

     关键字详情请参考 《C语言之初识关键字》,点击此处即可阅读

3.3 输入日期计算天数:Get_YMD_Total()

     ①. 算法思想:循环叠加用户输入月份的前几个月的天数 + 当月的天数,如:用户输入 6 月 8 日 计算前 5 个月的天数 + 6 月的 8 天,最后还需判断用户输入的年月日是否正确。

/** 输出日期 计算天数 Get_YMD_Total */ int Get_YMD_Total(int year, int month, int day) { // 循环叠加用户输入月份的前几个月的天数 + 当月的天数 如:用户输入 6 月 8 日 计算前 5 个月的天数 + 8 天 int sum = 0; if (year int year, month, day, day1; char ch = '\0'; do { printf("Input (year month day): \n"); scanf_s("%d %d %d", &year, &month, &day); // 计算一年中月份的天数 day1 = Get_YM_Day(year, month); // 输出日期 计算天数 int total = Get_YMD_Total(year, month, day); switch (total) { case YEAR_ERROR: printf("year input error! \n"); break; case MONTH_ERROR: printf("month input error! \n"); break; case DAY_ERROR: printf("day input error! \n"); break; default: if (Is_Leap(year)) { printf("%d年是闰年!\n", year); } else { printf("%d年不是闰年!\n", year); } printf("%d年的%d月==>%d天\n", year, month, day1); printf("%d年%d月%d日==>%d天\n", year, month, day, total); break; } printf("是否继续(y/n)... \n"); // 清除缓冲区 // fflush(stdin); 在 vs 2015 年之后就失效了 // 清除缓冲区的作用:键盘录入时会有 ‘\n’ 为了避免 ‘\n’的干扰需清除缓冲区 rewind(stdin); ch = getchar(); } while (ch == 'Y' || ch == 'y'); return 0; } 4. 项目源代码 #include #include #include #define YEAR_ERROR -1 #define MONTH_ERROR -2 #define DAY_ERROR -3 /** 项目: * 判断是否为闰年 Is_Leap * 计算一年中月份的天数 Get_YM_day * 输出日期 计算天数 Get_YMD_Total */ /** 判断是否为闰年 */ bool Is_Leap(int year) { return (year % 4 == 0 && year % 100 != 0 || year % 400 == 0); } /** 计算一年中月份的天数 Get_YM_day */ int Get_YM_Day(int year, int month) { // 静态常性数组 static 只初始化一次 const 且只可读不可写 static const int days[13] = { 29, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // 0 1 2 3 4 5 6 7 8 9 10 11 12 if (month == 2 && Is_Leap(year)) { month = 0; } return days[month]; } /** 输出日期 计算天数 Get_YMD_Total */ int Get_YMD_Total(int year, int month, int day) { // 循环叠加用户输入月份的前几个月的天数 + 当月的天数 如:用户输入 6 月 8 日 计算前 5 个月的天数 + 8 天 int sum = 0; if (year int year, month, day, day1; char ch = '\0'; do { printf("Input (year month day): \n"); scanf_s("%d %d %d", &year, &month, &day); // 计算一年中月份的天数 day1 = Get_YM_Day(year, month); // 输出日期 计算天数 int total = Get_YMD_Total(year, month, day); switch (total) { case YEAR_ERROR: printf("year input error! \n"); break; case MONTH_ERROR: printf("month input error! \n"); break; case DAY_ERROR: printf("day input error! \n"); break; default: if (Is_Leap(year)) { printf("%d年是闰年!\n", year); } else { printf("%d年不是闰年!\n", year); } printf("%d年的%d月==>%d天\n", year, month, day1); printf("%d年%d月%d日==>%d天\n", year, month, day, total); break; } printf("是否继续(y/n)... \n"); // 清除缓冲区 // fflush(stdin); 在 vs 2015 年之后就失效了 // 清除缓冲区的作用:键盘录入时会有 ‘\n’ 为了避免 ‘\n’的干扰需清除缓冲区 rewind(stdin); ch = getchar(); } while (ch == 'Y' || ch == 'y'); return 0; }

运行结果 在这里插入图片描述

5. 项目总结

     在做项目之前,先分析项目需求,设置完成项目实例所需要的各模块函数;思考各模块函数代码实现的算法思想,通过算法思想一步步完成各模块函数代码的实现并进行优化。通过调试逐步完善代码,最终实现项目实例代码的编写。



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭