1、库函数
注意:使用时必须调用头文件。
学习库函数的软件:MSDN/zh.cppreference/en.cppreference
2、自定义函数
注意:与库函数一样,包含函数名,返回值类型与函数参数。
(1)求两数较大值
int get_max(int x, int y) { return x > y ? x : y; } //函数名前的数据类型为返回值类型,如果函数没有返回值,类型可以设置为void int main() { int a = 0; int b = 0; scanf("%d %d", &a, &b); //求较大值 int max = get_max(a, b); printf("%d", max); return 0; }(2)交换两变量的数值
错误方法:传值调用
注意:x和y是形参,主函数中的a、b是实参。当实参传递给形参时,形参是实参的临时拷贝。
对形参的修改不会影响实参,因为形参与实参的存储位置不同,形参在函数调用结束后会自动销毁
void swap1(int x, int y) { int z = 0; z = x; x = y; y = z; } int main() { int a = 0; int b = 0; scanf("%d %d", &a, &b); printf("交换前:a=%d,b=%d", a, b); swap1(a, b); printf("交换后:a=%d,b=%d", a, b); return 0; }正确方法:传址调用
int swap2(int* px, int* py) { int z = *px; *px = *py; *py = z; } int main() { int a = 0; int b = 0; scanf("%d %d", &a, &b); printf("交换前:a=%d,b=%d", a, b); swap2(&a, &b); printf("交换后:a=%d,b=%d", a, b); return 0; }3、函数的嵌套调用和链式访问
(1)嵌套调用
函数和函数之间可以根据实际需求进行组合的,也就是互相调用。
//打印hehe void new_line() { printf("hehe\n"); } void three_line() { int i = 0; for (i = 0; i < 3; i++) { new_line(); } } int main() { three_line(); return 0; }(2)链式访问
注意:将其他函数的返回值作为该函数的参数。因此只有有返回值的函数能够使用链式调用。
int main() { int len = strlen("abcdef"); printf("%d\n", len); //链式访问: printf("%d\n", strlen("abcdef")); return 0; }典型链式访问:printf()函数的返回值为打印字符的个数。
printf("%d",printf("%d",printf("%d",43))); //输出43214、函数声明与定义
(1)函数声明
注意:告诉编译器有一个函数叫什么,参数是什么,返回类型是什么,但是具体存不存在,函数声明决定不了。函数声明一般在函数使用之前,要满足先声明后使用。函数声明一般放在头文件中。
int Add(int x, int y); int main() { int a = 0; int b = 0; scanf("%d %d", &a, &b); int sum = Add(a, b); printf("%d", sum); return 0; } int Add(int a, int b) { return a + b; }//调用自定义的头文件 #include"add.h"(2)函数定义
注意:函数的具体实现,交代函数的功能实现。如果只有函数声明,没有函数定义,则声明为假。
5、函数递归
注意:程序调用自身的编程技巧称为递归。主要思想——大事化小。它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。优点是大大减少了程序的代码量。
void print(unsigned int x) { if (x > 9) { print(x / 10); //123 } printf("%d ", x % 10);//4 } int main() { unsigned int num = 0; scanf("%d",&num); print(num); return 0; }递归存在的两个必要条件
A 存在限制条件,当满足这个限制条件的时候,递归便不再继续
B 每次递归调用之后越来越接近这个限制条件。
6、函数迭代
(1)n的阶乘
int fac(int x) { if (x <= 1) return 1; else return x * fac(x - 1); } int main() { int n = 0; scanf("%d", &n); int ret = fac(n); printf("ret=%d\n",ret); return 0; }(2)斐波那契数列
提示:前两个数相加等于第三个数。
int Fib(int n) { if (n <= 2) return 1; else return Fib(n - 1) + Fib(n - 2); } int main() { int a = 0; scanf("%d", &a); int ret = Fib(a); printf("ret=%d\n", ret); return 0; }