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, 计算一个数 阶乘.