1. 概要
~ Jack Qiao对米粒说:“今天咱们学习,编写一个更简单的C语言程序,这个程序会询问你一个年份,然后告诉你从1到那个年份之间有多少个闰年,并且把这些闰年都列出来。”
~ 米粒想到,判断闰年的条件是:
> 年份能被4整除但不能被100整除;或者年份能被400整除。
> 翻译成代码也就是下面的逻辑:
(currentYear % 4 == 0 && currentYear % 100 != 0) || (currentYear % 400 == 0)
2. 整体架构流程
2.1. 直接在主函数中实现
2.1.1. 检查闰年
for (currentYear = 1; currentYear <= year; currentYear++) { // 检查当前年份是否是闰年 if ((currentYear % 4 == 0 && currentYear % 100 != 0) || (currentYear % 400 == 0)) { // 如果是闰年,就打印出来 printf("%d ", currentYear); leapCount++; // 计数器加一 } }
~ 这里用year代表输入的年份, currentYear代表当前的年份,, leapCount 代表计数器。
2.1.2. 运行结果
2.1.3. 整体代码
#include <stdio.h>
int main() {
int year, currentYear, leapCount = 0;// 让用户输入一个年份
printf("你好!请输入一个年份:");
scanf("%d", &year);// 从1开始检查到用户输入的年份
for (currentYear = 1; currentYear <= year; currentYear++)
{
// 检查当前年份是否是闰年
if ((currentYear % 4 == 0 && currentYear % 100 != 0) || (currentYear % 400 == 0))
{
// 如果是闰年,就打印出来
printf("%d ", currentYear);
leapCount++; // 计数器加一
}
}// 打印总的闰年数量
printf("\n从1年到%d年总共有%d个闰年。\n", year, leapCount);return 0;
}
2.2. 引入函数实现
2.2.1. 函数一
> 判断是否为闰年的函数
int isLeapYear(int year) { return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); }
- isLeapYear 用于判断给定的年份是否是闰年。返回 1 表示是闰年,返回 0 表示不是闰年
2.2.2. 函数二
> 打印从1到指定年份之间的所有闰年
void printLeapYears(int year) { int leapCount = 0; printf("从1年到%d年之间的闰年有:\n", year); for (int currentYear = 1; currentYear <= year; currentYear++) { if (isLeapYear(currentYear)) { printf("%d ", currentYear); leapCount++; } } printf("\n从1年到%d年总共有%d个闰年。\n", year, leapCount); }
> printLeapYears 函数:接受一个年份作为参数,打印从1年到该年份之间的所有闰年,并输出总的闰年数量。
2.2.3. 运行结果
2.2.4. 全部代码
#include <stdio.h>
// 判断是否为闰年的函数
int isLeapYear(int year)
{
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}// 打印从1到指定年份之间的所有闰年
void printLeapYears(int year) {
int leapCount = 0;printf("从1年到%d年之间的闰年有:\n", year);
for (int currentYear = 1; currentYear <= year; currentYear++) {
if (isLeapYear(currentYear)) {
printf("%d ", currentYear);
leapCount++;
}
}
printf("\n从1年到%d年总共有%d个闰年。\n", year, leapCount);
}// 主函数
int main() {
int year;printf("请输入一个年份:");
if (scanf("%d", &year) != 1) {
printf("输入无效,请输入一个有效的年份。\n");
return 1;
}printLeapYears(year);
return 0;
}
3. 小结
~ 米粒对比思考后,根据它们优点和不足,做出以下总结:
> 第一个直接在主函数中实现
优点:简单直观,所有逻辑都在 main 函数中,初学者容易理解和实现。
代码量少,不需要额外的函数,代码量相对较少。
不足:可读性差,随着功能的增加,main 函数会变得越来越长,难以阅读和维护。复用性差,扩展性差:如果需要增加新的功能(例如,计算某个区间内的闰年),需要修改现有的逻辑,容易出错。
> 第二个引入函数实现
优点:代码结构清晰,将不同的功能封装在不同的函数中,代码结构更加清晰。
可读性强,每个函数都有明确的职责,容易理解和维护。
复用性强,可以在其他地方重用这些函数,避免重复代码。
扩展性强,如果需要增加新的功能,可以轻松地添加新的函数,而不会影响现有的代码。