Day 04 学习总结
函数的基本概念
1. 函数的定义
- 函数是实现特定功能的代码块,可以被重复调用,避免重复代码,提高代码复用性。
- 基本格式:
返回值类型 函数名(形参列表) {// 函数体:实现功能的代码 }
2. 函数的三要素
- 返回值类型:
- 决定函数返回的数据类型。
- 如果函数无返回值,用
void
。 - 示例:
- 判断偶数:返回值类型为
int
(返回0
或1
)。 - 转换字母大小写:返回值类型为
char
。 - 求两个数的较大值:返回值类型与输入类型相同。
- 判断偶数:返回值类型为
- 函数名:
- 自定义名称,建议使用描述性单词或短语。
- 示例:
getMax
,isEven
,convertToLowercase
。
- 形参列表:
- 表示函数输入的数据类型和个数。
- 格式:
形参类型 形参名, 形参类型 形参名, ...
- 如果函数不需要参数,用
void
。
3. 函数的使用
- 定义:
- 分析功能,确定返回值类型、函数名、形参列表。
- 调用:
- 在主函数中使用
函数名(实参列表)
调用函数。 - 返回值可存储在变量中或直接使用。
- 在主函数中使用
函数的分类
-
有形参有返回值:
- 需要输入参数,返回计算结果。
- 示例:求两个数的较大值。
int getMax(int a, int b) {return (a > b) ? a : b; }
-
有形参无返回值:
- 需要输入参数,但不返回值。
- 示例:随机数种子设置。
void srand(unsigned seed) {// 功能代码 }
-
无形参有返回值:
- 不需要输入参数,但返回值。
- 示例:生成随机数。
int rand(void) {// 功能代码 }
-
无形参无返回值:
- 不需要输入参数,也不返回值。
- 示例:显示菜单功能。
void showMenu(void) {printf("1. 添加\n2. 删除\n"); }
函数的调用与注意事项
- 调用格式:
返回值变量 = 函数名(实参列表);
- 注意:
- 实参列表与形参列表在 类型、顺序、个数上必须一致。
- 函数的返回值只能有一个。
调用示例
#include <stdio.h>
int getMax(int a, int b)
{return (a > b) ? a : b;
}int main()
{int res = getMax(10, 20);printf("较大值:%d\n", res);int x, y;printf("请输入两个数:");scanf("%d %d", &x, &y);res = getMax(x, y);printf("较大值:%d\n", res);return 0;
}
函数调用流程
- 分配形参的空间。
- 将实参的值传递给形参。
- 执行函数体代码。
- 函数结束,返回值给调用者,销毁局部变量和形参。
日历项目
功能概述
- 输入年份和月份,输出对应的日历(包含上月、本月、下月数据)。
- 一页日历包含 6 行 7 列(42 个数据)。
步骤解析
- 上个月的数据:
- 上个月数据的个数由 本月第一天是星期几 决定。
- 数据从上月最后一天倒序排列。
- 本月的数据:
- 从 1 到本月总天数。
- 下个月的数据:
- 补足 42 个格子。
核心功能函数
-
判断闰年:
- 输入年份,返回是否是闰年。
int isLeapYear(int year) {return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); }
- 输入年份,返回是否是闰年。
-
求某年某月的总天数:
- 根据月份和是否闰年返回天数。
int getDaysInMonth(int year, int month) {if (month == 2)return isLeapYear(year) ? 29 : 28;if (month == 4 || month == 6 || month == 9 || month == 11)return 30;return 31; }
- 根据月份和是否闰年返回天数。
-
求某日是星期几:
- 计算输入日期距离 1970-1-1 的天数,然后取模计算星期几。
int getWeekday(int year, int month, int day) {int days = 0;for (int y = 1970; y < year; y++)days += isLeapYear(y) ? 366 : 365;for (int m = 1; m < month; m++)days += getDaysInMonth(year, m);days += day - 1;return (days % 7 + 4) % 7; // 1970-1-1 是星期四 }
- 计算输入日期距离 1970-1-1 的天数,然后取模计算星期几。
-
输出日历数据:
void printCalendar(int year, int month) {int daysInMonth = getDaysInMonth(year, month);int firstDay = getWeekday(year, month, 1);int prevYear = (month == 1) ? year - 1 : year;int prevMonth = (month == 1) ? 12 : month - 1;int daysInPrevMonth = getDaysInMonth(prevYear, prevMonth);printf(" 日 一 二 三 四 五 六\n");// 上月数据for (int i = firstDay - 1; i >= 0; i--)printf("%3d", daysInPrevMonth - i);// 本月数据for (int i = 1; i <= daysInMonth; i++){if ((firstDay + i - 1) % 7 == 0)printf("\n");printf("%3d", i);}// 下月数据for (int i = 1; (firstDay + daysInMonth + i - 1) % 7 != 0; i++)printf("%3d", i);printf("\n"); }
完整主函数
int main()
{int year, month;printf("请输入年份和月份:");scanf("%d %d", &year, &month);printCalendar(year, month);return 0;
}
总结
- 函数三要素:返回值类型、函数名、形参列表。
- 调用规范:实参与形参需类型、顺序、个数一致。
- 函数的模块化:复杂功能通过多个函数分解,降低代码耦合。
- 日历项目:学习函数设计与调用的综合应用。