函数是C语言程序的基本模块,它将代码组织成可重用的单元。东巴文(db-w.cn) 将带你深入理解C语言的函数,掌握程序模块化的核心技能。
💡 东巴文观点:函数是程序的积木,通过函数,程序可以分解成多个可管理的模块。
函数是完成特定任务的独立代码块,可以接收输入参数并返回结果。
东巴文函数结构图:
函数
├── 输入(参数)
│ └── 函数接收的数据
├── 处理(函数体)
│ └── 完成特定任务的代码
└── 输出(返回值)
└── 函数返回的结果
东巴文函数优点表:
| 优点 | 说明 | 东巴文解释 |
|---|---|---|
| 代码重用 | 同一函数可多次调用 | 避免重复代码 |
| 模块化 | 将程序分解成小模块 | 便于管理 |
| 可读性 | 函数名描述功能 | 代码更清晰 |
| 可维护性 | 修改函数不影响其他代码 | 易于维护 |
| 可测试性 | 独立测试每个函数 | 便于调试 |
东巴文说明:库函数是由C语言标准库提供的函数,可以直接使用。
#include <stdio.h>
#include <string.h>
#include <math.h>
int main() {
printf("=== 东巴文库函数示例 ===\n\n");
// stdio.h中的函数
printf("printf函数:输出到屏幕\n");
// string.h中的函数
char str1[] = "东巴文";
char str2[] = "欢迎您";
printf("字符串长度:%lu\n", strlen(str1));
// math.h中的函数
printf("sqrt(16) = %.2f\n", sqrt(16));
printf("pow(2, 3) = %.2f\n", pow(2, 3));
return 0;
}
东巴文说明:自定义函数是由程序员自己编写的函数。
#include <stdio.h>
// 自定义函数:计算两个数的和
int add(int a, int b) {
return a + b;
}
// 自定义函数:判断奇偶
int isEven(int num) {
return num % 2 == 0;
}
int main() {
printf("=== 东巴文自定义函数示例 ===\n\n");
int sum = add(5, 3);
printf("5 + 3 = %d\n", sum);
if (isEven(4)) {
printf("4是偶数\n");
}
return 0;
}
东巴文说明:函数头包含返回类型、函数名和参数列表。
// 函数头
int add(int a, int b)
// ↑ ↑ ↑
// │ │ └── 参数列表
// │ └─────── 函数名
// └─────────── 返回类型
东巴文说明:函数体是完成特定任务的代码块。
int add(int a, int b) { // 函数头
// 函数体开始
int result = a + b; // 局部变量
return result; // 返回语句
// 函数体结束
}
#include <stdio.h>
// 无参数无返回值
void printHello() {
printf("东巴文欢迎您!\n");
}
// 有参数无返回值
void printNumber(int num) {
printf("数字:%d\n", num);
}
// 无参数有返回值
int getNumber() {
return 42;
}
// 有参数有返回值
int add(int a, int b) {
return a + b;
}
int main() {
printf("=== 东巴文函数基本组成 ===\n\n");
// 调用无参数无返回值函数
printHello();
// 调用有参数无返回值函数
printNumber(10);
// 调用无参数有返回值函数
int num = getNumber();
printf("获取的数字:%d\n", num);
// 调用有参数有返回值函数
int sum = add(5, 3);
printf("5 + 3 = %d\n", sum);
return 0;
}
#include <stdio.h>
// 计算圆的面积
double circleArea(double radius) {
return 3.14159 * radius * radius;
}
int main() {
printf("=== 东巴文代码重用示例 ===\n\n");
// 多次使用同一个函数
printf("半径1.0的面积:%.2f\n", circleArea(1.0));
printf("半径2.0的面积:%.2f\n", circleArea(2.0));
printf("半径3.0的面积:%.2f\n", circleArea(3.0));
return 0;
}
#include <stdio.h>
// 输入模块
int getInput() {
int num;
printf("请输入一个整数:");
scanf("%d", &num);
return num;
}
// 计算模块
int calculate(int a, int b) {
return a + b;
}
// 输出模块
void printResult(int result) {
printf("结果:%d\n", result);
}
int main() {
printf("=== 东巴文模块化示例 ===\n\n");
int num1 = getInput();
int num2 = getInput();
int result = calculate(num1, num2);
printResult(result);
return 0;
}
#include <stdio.h>
// ❌ 不使用函数,代码难以理解
int main_bad() {
int arr[] = {3, 7, 2, 9, 5, 8, 1, 6, 4, 0};
int max = arr[0];
for (int i = 1; i < 10; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
printf("最大值:%d\n", max);
return 0;
}
// ✅ 使用函数,代码清晰
int findMax(int arr[], int size) {
int max = arr[0];
for (int i = 1; i < size; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}
int main() {
printf("=== 东巴文提高可读性示例 ===\n\n");
int arr[] = {3, 7, 2, 9, 5, 8, 1, 6, 4, 0};
int max = findMax(arr, 10);
printf("最大值:%d\n", max);
return 0;
}
东巴文说明:一个函数只做一件事。
#include <stdio.h>
// ❌ 违反单一职责原则
void process(int arr[], int size) {
// 计算最大值
int max = arr[0];
for (int i = 1; i < size; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
// 计算最小值
int min = arr[0];
for (int i = 1; i < size; i++) {
if (arr[i] < min) {
min = arr[i];
}
}
// 输出结果
printf("最大值:%d\n", max);
printf("最小值:%d\n", min);
}
// ✅ 遵循单一职责原则
int findMax(int arr[], int size) {
int max = arr[0];
for (int i = 1; i < size; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}
int findMin(int arr[], int size) {
int min = arr[0];
for (int i = 1; i < size; i++) {
if (arr[i] < min) {
min = arr[i];
}
}
return min;
}
int main() {
printf("=== 东巴文单一职责原则 ===\n\n");
int arr[] = {3, 7, 2, 9, 5, 8, 1, 6, 4, 0};
printf("最大值:%d\n", findMax(arr, 10));
printf("最小值:%d\n", findMin(arr, 10));
return 0;
}
东巴文说明:函数长度应该适中,一般不超过50行。
// ✅ 函数长度适中
int binarySearch(int arr[], int size, int target) {
int left = 0;
int right = size - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid] == target) {
return mid;
} else if (arr[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
东巴文说明:参数数量应该适中,一般不超过4个。
// ❌ 参数过多
void process(int a, int b, int c, int d, int e, int f);
// ✅ 参数适中
void process(int a, int b);
// ✅ 使用结构体封装多个参数
struct Config {
int width;
int height;
int depth;
};
void process(const struct Config *config);
东巴文命名规则:
// ✅ 好的命名
int calculateSum(int arr[], int size);
void printMessage(const char *message);
bool isValid(int number);
void sortArray(int arr[], int size);
// ❌ 不好的命名
int func1(int a, int b);
void process();
bool check();
void doIt(int arr[], int size);
#include <stdio.h>
// ✅ 清晰的命名
int calculateFactorial(int n) {
if (n <= 1) return 1;
return n * calculateFactorial(n - 1);
}
bool isPrimeNumber(int num) {
if (num <= 1) return false;
for (int i = 2; i * i <= num; i++) {
if (num % i == 0) return false;
}
return true;
}
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
printf("=== 东巴文函数命名示例 ===\n\n");
printf("5! = %d\n", calculateFactorial(5));
if (isPrimeNumber(17)) {
printf("17是素数\n");
}
int arr[] = {1, 2, 3, 4, 5};
printArray(arr, 5);
return 0;
}
// ✅ 函数功能单一,长度适中
int findMax(int arr[], int size) {
int max = arr[0];
for (int i = 1; i < size; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}
// ✅ 一个函数只做一件事
int add(int a, int b) {
return a + b;
}
void printResult(int result) {
printf("结果:%d\n", result);
}
// ✅ 命名清晰
int calculateSum(int arr[], int size);
bool isEven(int number);
void sortArray(int arr[], int size);
// ✅ 无副作用
int add(int a, int b) {
return a + b; // 只返回结果,不修改外部变量
}
// ❌ 有副作用
int globalSum = 0;
int addToGlobal(int a, int b) {
globalSum = a + b; // 修改全局变量
return globalSum;
}
完成本章学习后,请确认:
掌握函数概述后,你可以继续学习:
如果遇到问题,欢迎访问 东巴文(db-w.cn) 获取帮助!
东巴文(db-w.cn) - 让编程学习更简单
📦 东巴文函数提示:函数是程序的模块,掌握函数是编写可维护程序的关键。在 db-w.cn,我们会通过大量实例帮你掌握函数的使用!