函数

程序的模块化

函数是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);

函数的命名规范

命名规则

东巴文命名规则

  1. 使用有意义的名称
  2. 使用动词+名词的形式
  3. 使用驼峰命名法或下划线命名法
  4. 避免使用缩写
// ✅ 好的命名
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;
}

东巴文最佳实践

1. 函数应该短小精悍

// ✅ 函数功能单一,长度适中
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;
}

2. 函数应该只做一件事

// ✅ 一个函数只做一件事
int add(int a, int b) {
    return a + b;
}

void printResult(int result) {
    printf("结果:%d\n", result);
}

3. 函数应该有良好的命名

// ✅ 命名清晰
int calculateSum(int arr[], int size);
bool isEven(int number);
void sortArray(int arr[], int size);

4. 函数应该避免副作用

// ✅ 无副作用
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,我们会通过大量实例帮你掌握函数的使用!