function

LearningClanguagefunction 定义, 调用 and parameter传递

返回tutoriallist

1. function basicconcepts

1.1 what is function?

function is 一组执行specifictask 语句, 它可以接收输入parameter, 执行operation, 并返回结果. function is Clanguageincode组织 and 复用 basic单位.

usingfunction good 处:

  • code复用: 可以 in 程序 many 个地方调用同一个function, 避免重复code
  • module化: 将 complex issues分解 for smaller, manageable parts
  • 可maintenance性: function使得code更易于understanding and maintenance
  • readable 性: function可以给code片段起 has 意义 名称, improvingcode readable 性

1.2 function classification

Clanguagein function可以分 for 以 under 几class:

  • libraryfunction: 由C标准libraryproviding function, such as printf(), scanf() etc.
  • user自定义function: 由程序员自己定义 function

2. function 定义 and 声明

2.1 function 定义

function定义 一般形式:

返回class型 function名(parameterclass型 parameter名1, parameterclass型 parameter名2, ...) {
    // function体
    // 执行语句
    return return value;
}

2.1.1 function定义example

// 计算两个整数  and 
int add(int a, int b) {
    int sum = a + b;
    return sum;
}

// 打印问候语
void greet() {
    printf("Hello, World!\n");
}

2.2 function 声明

function声明 (也称 for function原型) 告诉编译器function 名称, 返回class型 and parameterclass型, 而不providingfunction implementation. function声明 一般形式:

返回class型 function名(parameterclass型 parameter名1, parameterclass型 parameter名2, ...);

2.2.1 function声明example

// function声明
int add(int a, int b);
void greet();

int main() {
    // function调用
    int result = add(5, 3);
    printf("Sum: %d\n", result);
    greet();
    return 0;
}

// function定义
int add(int a, int b) {
    int sum = a + b;
    return sum;
}

void greet() {
    printf("Hello, World!\n");
}

3. function 调用

3.1 function调用 一般形式

function调用 一般形式:

function名(实参1, 实参2, ...);

3.1.1 function调用example

#include <stdio.h>

// function声明
int add(int a, int b);
int subtract(int a, int b);
int multiply(int a, int b);
float divide(int a, int b);

int main() {
    int num1 = 10, num2 = 5;
    
    // function调用
    printf("%d + %d = %d\n", num1, num2, add(num1, num2));
    printf("%d - %d = %d\n", num1, num2, subtract(num1, num2));
    printf("%d * %d = %d\n", num1, num2, multiply(num1, num2));
    printf("%d / %d = %.2f\n", num1, num2, divide(num1, num2));
    
    return 0;
}

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

int subtract(int a, int b) {
    return a - b;
}

int multiply(int a, int b) {
    return a * b;
}

float divide(int a, int b) {
    if (b != 0) {
        return (float)a / b;
    } else {
        printf("error: 除数不能 for 零!\n");
        return 0;
    }
}

4. parameter传递

4.1 值传递

值传递 is 指将实参 值copy一份传递给形参, function in 部 for 形参 modify不会影响实参 值.

#include <stdio.h>

void swap(int x, int y) {
    int temp = x;
    x = y;
    y = temp;
    printf(" in function in 部: x = %d, y = %d\n", x, y);
}

int main() {
    int a = 10, b = 20;
    printf("调用function before : a = %d, b = %d\n", a, b);
    swap(a, b);
    printf("调用function after : a = %d, b = %d\n", a, b);
    return 0;
}

4.2 地址传递

地址传递 is 指将实参 地址传递给形参, function in 部through指针可以modify实参 值.

#include <stdio.h>

void swap(int *x, int *y) {
    int temp = *x;
    *x = *y;
    *y = temp;
    printf(" in function in 部: *x = %d, *y = %d\n", *x, *y);
}

int main() {
    int a = 10, b = 20;
    printf("调用function before : a = %d, b = %d\n", a, b);
    swap(&a, &b); // 传递地址
    printf("调用function after : a = %d, b = %d\n", a, b);
    return 0;
}

5. function return value

5.1 return value class型

function return valueclass型可以 is 任何 has 效 Cdataclass型, includingbasicdataclass型, 指针class型etc.. such as果function不返回任何值, 则using void serving as返回class型.

5.2 return语句

return语句用于 from functioninreturn value, 并结束function 执行. return语句 一般形式:

return 表达式;

5.2.1 return语句example

// 返回整数
int get_max(int a, int b) {
    if (a > b) {
        return a;
    } else {
        return b;
    }
}

// 不return value
void print_message() {
    printf("This is a message.\n");
    return; // 可选
}

6. 递归function

6.1 what is 递归?

递归 is 指function调用自身 过程. 递归function通常 has 以 under 特点:

  • has 一个 or many 个basiccircumstances (终止条件)
  • has 一个 or many 个递归circumstances, 将issues分解 for 更 small 子issues

6.2 递归functionexample

6.2.1 计算阶乘

#include <stdio.h>

int factorial(int n) {
    // basiccircumstances
    if (n == 0 || n == 1) {
        return 1;
    }
    // 递归circumstances
    else {
        return n * factorial(n - 1);
    }
}

int main() {
    int num = 5;
    printf("%d! = %d\n", num, factorial(num));
    return 0;
}

6.2.2 斐波那契数列

#include <stdio.h>

int fibonacci(int n) {
    // basiccircumstances
    if (n == 1 || n == 2) {
        return 1;
    }
    // 递归circumstances
    else {
        return fibonacci(n - 1) + fibonacci(n - 2);
    }
}

int main() {
    int num = 10;
    printf("斐波那契数列 第%d项: %d\n", num, fibonacci(num));
    return 0;
}

7. function 作用域 and storeclass别

7.1 局部variable and 全局variable

局部variable: in function in 部定义 variable, 只 in function in 部 has 效.

全局variable: in function out 部定义 variable, in 整个程序in都 has 效.

#include <stdio.h>

// 全局variable
int global_var = 100;

void function() {
    // 局部variable
    int local_var = 200;
    printf("局部variable: %d\n", local_var);
    printf("全局variable: %d\n", global_var);
}

int main() {
    printf("全局variable: %d\n", global_var);
    function();
    // printf("局部variable: %d\n", local_var); // error: local_var  in 此作用域in未声明
    return 0;
}

7.2 storeclass别

Clanguagein variable has 以 under storeclass别:

  • auto: 自动variable, 默认storeclass别, in function in 部定义
  • static: 静态variable, in function调用之间保持值
  • extern: out 部variable, 用于声明 in otherfilein定义 全局variable
  • register: 寄存器variable, 建议编译器将variablestore in 寄存器in

7.2.1 staticvariableexample

#include <stdio.h>

void counter() {
    static int count = 0; // 静态局部variable
    count++;
    printf("计数: %d\n", count);
}

int main() {
    counter(); // 输出 1
    counter(); // 输出 2
    counter(); // 输出 3
    return 0;
}

8. function advanced features

8.1 function指针

function指针 is 指向function 指针variable, 可以用于storefunction 地址并through指针调用function.

#include <stdio.h>

int add(int a, int b) {
    return a + b;
}

int subtract(int a, int b) {
    return a - b;
}

int main() {
    // 声明function指针
    int (*operation)(int, int);
    
    // 指向addfunction
    operation = add;
    printf("5 + 3 = %d\n", operation(5, 3));
    
    // 指向subtractfunction
    operation = subtract;
    printf("5 - 3 = %d\n", operation(5, 3));
    
    return 0;
}

8.2 in 联function

in 联function is 指 in 编译时将function体直接插入 to 调用处, 而不 is throughfunction调用 方式执行, from 而reducingfunction调用 开销. using inline 关键字声明 in 联function:

#include <stdio.h>

//  in 联function
inline int max(int a, int b) {
    return (a > b) ? a : b;
}

int main() {
    int x = 10, y = 20;
    printf("最 big 值: %d\n", max(x, y));
    return 0;
}

9. function 综合application

9.1 module化programmingexample

under 面 is a usingfunctionimplementationmodule化programming example, 计算学生 平均成绩:

#include <stdio.h>

// function声明
float calculate_average(float scores[], int size);
void print_result(float average);

int main() {
    float scores[5];
    int i;
    
    printf("请输入5个学生 成绩: \n");
    for (i = 0; i < 5; i++) {
        printf("学生%d: ", i + 1);
        scanf("%f", &scores[i]);
    }
    
    float avg = calculate_average(scores, 5);
    print_result(avg);
    
    return 0;
}

// 计算平均成绩
float calculate_average(float scores[], int size) {
    float sum = 0;
    int i;
    
    for (i = 0; i < size; i++) {
        sum += scores[i];
    }
    
    return sum / size;
}

// 打印结果
void print_result(float average) {
    printf("平均成绩: %.2f\n", average);
    
    if (average >= 90) {
        printf("优秀!\n");
    } else if (average >= 80) {
        printf("良 good !\n");
    } else if (average >= 60) {
        printf("及格!\n");
    } else {
        printf("不及格!\n");
    }
}

实践case: 计算器程序

writing一个usingfunctionimplementation 计算器程序, support加, 减, 乘, 除四种运算.

requirementsanalysis

  • 提示user输入两个operation数 and 运算符
  • usingfunctionimplementation不同 运算
  • processing除法运算in 除数 for 零 circumstances
  • 输出运算结果

referencecode

#include <stdio.h>

// function声明
float add(float a, float b);
float subtract(float a, float b);
float multiply(float a, float b);
float divide(float a, float b);

int main() {
    float num1, num2, result;
    char operator;
    
    printf("请输入第一个数: ");
    scanf("%f", &num1);
    
    printf("请输入运算符 (+, -, *, /): ");
    scanf(" %c", &operator);
    
    printf("请输入第二个数: ");
    scanf("%f", &num2);
    
    switch(operator) {
        case '+':
            result = add(num1, num2);
            break;
        case '-':
            result = subtract(num1, num2);
            break;
        case '*':
            result = multiply(num1, num2);
            break;
        case '/':
            result = divide(num1, num2);
            break;
        default:
            printf("error: 无效 运算符!\n");
            return 1;
    }
    
    printf("%.2f %c %.2f = %.2f\n", num1, operator, num2, result);
    
    return 0;
}

// 加法function
float add(float a, float b) {
    return a + b;
}

// 减法function
float subtract(float a, float b) {
    return a - b;
}

// 乘法function
float multiply(float a, float b) {
    return a * b;
}

// 除法function
float divide(float a, float b) {
    if (b != 0) {
        return a / b;
    } else {
        printf("error: 除数不能 for 零!\n");
        return 0;
    }
}

run结果

请输入第一个数: 10
请输入运算符 (+, -, *, /): *
请输入第二个数: 5.5
10.00 * 5.50 = 55.00

互动练习

练习1: writing一个Cfunction, 判断一个数 is 否 for 质数.

练习2: writing一个Cfunction, 计算两个数 最 big 公约数 (GCD) .

练习3: writing一个Cfunction, 将一个整数转换 for string.

练习4: writing一个递归function, 计算一个数 阶乘.