C语言函数

函数详解

函数是C语言程序的基本构建块,用于组织和重用代码。

函数的主要特点:

  • 函数声明和定义
  • 参数传递(值传递和引用传递)
  • 返回值
  • 函数原型
  • 递归函数
  • 函数指针
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 函数声明
int add(int a, int b);
void swap(int *a, int *b);
int factorial(int n);
void printArray(int arr[], int size);
int* createArray(int size);
void freeArray(int *arr);
int compare(const void *a, const void *b);
void sortArray(int arr[], int size);
int binarySearch(int arr[], int size, int target);
void printFibonacci(int n);
int gcd(int a, int b);
void printPrimes(int n);
void reverseString(char *str);

// 主函数
int main() {
    // 基本函数调用示例
    printf("基本函数调用示例:\n");
    int result = add(5, 3);
    printf("5 + 3 = %d\n", result);
    
    // 参数传递示例
    printf("\n参数传递示例:\n");
    int x = 10, y = 20;
    printf("交换前:x = %d, y = %d\n", x, y);
    swap(&x, &y);
    printf("交换后:x = %d, y = %d\n", x, y);
    
    // 递归函数示例
    printf("\n递归函数示例:\n");
    int n = 5;
    printf("%d的阶乘是:%d\n", n, factorial(n));
    
    // 数组操作示例
    printf("\n数组操作示例:\n");
    int arr[] = {64, 34, 25, 12, 22, 11, 90};
    int size = sizeof(arr) / sizeof(arr[0]);
    printf("原始数组:");
    printArray(arr, size);
    
    // 排序示例
    printf("\n排序示例:\n");
    sortArray(arr, size);
    printf("排序后数组:");
    printArray(arr, size);
    
    // 二分查找示例
    printf("\n二分查找示例:\n");
    int target = 25;
    int index = binarySearch(arr, size, target);
    if (index != -1) {
        printf("找到%d,位置在:%d\n", target, index);
    } else {
        printf("未找到%d\n", target);
    }
    
    // 动态内存分配示例
    printf("\n动态内存分配示例:\n");
    int *dynamicArr = createArray(5);
    if (dynamicArr != NULL) {
        for (int i = 0; i < 5; i++) {
            dynamicArr[i] = i + 1;
        }
        printf("动态数组:");
        printArray(dynamicArr, 5);
        freeArray(dynamicArr);
    }
    
    // 斐波那契数列示例
    printf("\n斐波那契数列示例:\n");
    printFibonacci(10);
    
    // 最大公约数示例
    printf("\n最大公约数示例:\n");
    int a = 48, b = 36;
    printf("%d和%d的最大公约数是:%d\n", a, b, gcd(a, b));
    
    // 素数示例
    printf("\n素数示例:\n");
    printPrimes(20);
    
    // 字符串反转示例
    printf("\n字符串反转示例:\n");
    char str[] = "Hello, World!";
    printf("原始字符串:%s\n", str);
    reverseString(str);
    printf("反转后字符串:%s\n", str);
    
    return 0;
}

// 函数定义
int add(int a, int b) {
    return a + b;
}

void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

int factorial(int n) {
    if (n == 0 || n == 1) {
        return 1;
    }
    return n * factorial(n - 1);
}

void printArray(int arr[], int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int* createArray(int size) {
    return (int*)malloc(size * sizeof(int));
}

void freeArray(int *arr) {
    free(arr);
}

int compare(const void *a, const void *b) {
    return (*(int*)a - *(int*)b);
}

void sortArray(int arr[], int size) {
    qsort(arr, size, sizeof(int), compare);
}

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;
        }
        
        if (arr[mid] < target) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }
    
    return -1;
}

void printFibonacci(int n) {
    int a = 0, b = 1;
    printf("斐波那契数列前%d项:", n);
    for (int i = 0; i < n; i++) {
        printf("%d ", a);
        int temp = a + b;
        a = b;
        b = temp;
    }
    printf("\n");
}

int gcd(int a, int b) {
    if (b == 0) {
        return a;
    }
    return gcd(b, a % b);
}

void printPrimes(int n) {
    printf("小于%d的素数:", n);
    for (int i = 2; i < n; i++) {
        int isPrime = 1;
        for (int j = 2; j * j <= i; j++) {
            if (i % j == 0) {
                isPrime = 0;
                break;
            }
        }
        if (isPrime) {
            printf("%d ", i);
        }
    }
    printf("\n");
}

void reverseString(char *str) {
    int length = strlen(str);
    for (int i = 0; i < length / 2; i++) {
        char temp = str[i];
        str[i] = str[length - i - 1];
        str[length - i - 1] = temp;
    }
}