库函数:
- cplusplus.com:C library - C++ Reference
- 库函数相关头⽂件:C 标准库头文件 - cppreference.com
- 库函数⽂档的⼀般格式:
- 1. 函数原型
- 2. 函数功能介绍
- 3. 参数和返回类型说明
- 4. 代码举例
- 5. 代码输出
- 6. 相关知识链接
#include <stdio.h> #include <math.h> int main() { double d = 16.0; double r = sqrt(d); printf("%lf\n", r); return 0;
自定义函数:
#include<stdio.h> int Add(int x, int y)//形式上的参数,简称形参 //函数的参数就相当于,⼯⼚中送进去的原材料,函数的参数也可以是 void ,明确表⽰函数没有参数。 //如果有参数,要交代清楚参数的类型和名字,以及参数个数。 { int z = 0; int z = x + y; return z; //在这个函数中,变量z存储了变量x和y的和,并通过return 语将结果返回给调用方。returnz的作用是将z的值作为函数的结果返回。 //调用 Add 函数时,可以通过接收返回值的变量来获取计算结果 } //{}括起来的部分被称为函数体,函数体就是完成计算的过程。 // //(2)形参实际化 //(1)先写出这个函数应用场景 int main() { int a = 0; int b = 0; //输入 scanf("%d %d", &a, &b); //计算求和 int z = Add(a, b);//a和b是真实传给Add的参数,是实际参数,简称实参 //输出 printf("%d", z); return 0; }
Return的用法:
- return后边可以是⼀个数值,也可以是⼀个表达式,如果是表达式则先执⾏表达式,再返回表达式 的结果。例如:
#include <stdio.h> int Add(int x,int y) { return x+y; }
- return后边也可以什么都没有,直接写 return; 这种写法适合函数返回类型是void的情况。
#include <stdio.h> void test() { int n = 0; scanf("%d", &n); printf("hehe\n"); if (n == 5) return ;//直接跳出返回空值void printf("haha\n"); } int main() { test(); return 0; }
- 注意:这里的return和break不同,break只能用于跳出循环,但是后面的操作还能继续,而return语句执⾏后,函数就彻底返回,后边的代码不再执⾏。 .代码如下:
- return返回的值和函数返回类型不⼀致,系统会⾃动将返回的值隐式转换为函数的返回类型。 返回结果:3
int test() { return 3.14; } int main() { int n = test(); printf("%d\n", n); return 0; }
- 如果函数中存在if等分⽀的语句,则要保证每种情况下都有return返回,否则会出现编译错误。
#include <stdio.h> int test() { int n = 1; if (n == 5) return 1; else return -1; } int main() { int m = test(); printf("%d\n", m); return 0; }
数组做函数参数:
使⽤函数解决问题时,会将数组作为参数传递给函数,在函数内部对数组进⾏操作。
例如:写⼀个函数对将⼀个整型数组的内容,全部置为-1,再写⼀个函数打印数组的内容。
//写⼀个函数对将⼀个整型数组的内容,全部置为-1,再写⼀个函数打印数组的内容。 #include<stdio.h> void set_arr(int arr[], int sz) { int i = 0; for (i = 0; i < sz; i++) { arr[i] = -1; } } void print_arr(int arr[], int sz) { int i = 0; for (i = 0; i < sz; i++) { printf("%d", arr[i]); } printf("\n"); } int main() { int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; int sz = sizeof(arr) / sizeof(arr[0]);//计算出数组元素个数才能遍历 print_arr(arr, sz);//先打印出原来的元素 //先写一个函数,将arr中的内容全部设为-1 set_arr(arr,sz); //写一个函数,将arr中的内容打印出来 print_arr(arr,sz); return 0; }
数组传参的重点:
• 函数的形式参数要和函数的实参个数匹配
• 函数的实参是数组,形参也是可以写成数组形式的
• 形参如果是 ⼀维数组,数组大小可以省略不写--->arr[]
• 形参如果是 ⼆维数组,⾏可以省略,但是列不能省略--->arr[][必写]
• 数组传参,形参是不会创建新的数组的
• 形参操作的数组和 实参的数组是 同⼀个数组
二维数组传参举例:
//二维数组传参 #include <stdio.h> void print_arr(int arr[][5], int r, int c) { int i = 0; for (i = 0; i < r; i++) { int j = 0; for (j = 0; j < c; j++) { printf("%d ", arr[i][j]); } printf("\n"); } } int main() { int arr[3][5] = { 1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7 }; print_arr(arr, 3, 5);//数组传参 return 0; }
嵌套调用和链式访问:
嵌套调用:函数之间的互相调⽤,每个函数就⾏⼀个乐⾼零件,正是因为多个乐⾼的零件互相⽆缝 的配合才能搭建出精美的乐⾼玩具,也正是因为函数之间有效的互相调⽤,最后写出来了相对⼤型的 程序。
例子:假设我们计算某年某⽉有多少天?,如果要函数实现,可以设计2个函数:
• is_leap_year():根据年份确定是否是闰年
• get_days_of_month():调⽤is_leap_year确定是否是闰年后,再根据⽉计算这个⽉的天数
闰年:能被400整除的年份.
//嵌套调用 //例子:假设我们计算某年某⽉有多少天?,如果要函数实现,可以设计2个函数: //is_leap_year():根据年份确定是否是闰年 //get_days_of_month():调⽤is_leap_year确定是否是闰年后,再根据⽉计算这个⽉的天数 #include <stdio.h> //(3)进一步细化判断是否为闰年 int is_leap_year(int y) { if (y %400 == 0 ||( y % 100 != 0 && y %4 == 0)) return 1; else return 0; } //(2)通过函数封装进行模块的细化--获取某年某月有多少天 int get_days_of_month(int y, int m) { //巧妙利用数组进行12个月天数的输入,将月份和它对应的天数对齐 int days[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 int d = days[m];//通过月份访问天数 if(is_leap_year(y) && m==2)//判断是否为闰年并且是否为二月 { d += 1; } return d; } //(1)根据题目含义先写出大概模块 int main() { int y = 0;//年 int m = 0;//月 scanf("%d %d", &y, &m);//输入年月 int d=get_days_of_month(y,m);//天数 printf("%d", d);//打印天数 return 0; }
通过封装函数,可以让使用者在使用过程中重复调用,不用再重新进行代码的编写
summary:
• main 函数调⽤ scanf 、 printf 、 get_days_of_month
• get_days_of_month 函数调⽤ is_leap_year
函数之间可以嵌套调⽤,但是函数是不能嵌套定义
链式访问:将⼀个函数的返回值作为另外⼀个函数的参数,像链条⼀样将函数串起来就是函数的链式访问。
#include <stdio.h> int main() { int len = strlen("abcdef");//1.strlen求⼀个字符串的⻓度 printf("%d\n", len);//2.打印⻓度 return 0; }
#include <stdio.h> int main() { printf("%d\n", strlen("abcdef"));//链式访问 return 0; }
把strlen的返回值直接作为printf函数的参数,这样就是⼀ 个链式访问.
✨ 看⼀个有趣的代码,下⾯代码执⾏的结果是什么呢?
#include <stdio.h> int main() { printf("%d", printf("%d", printf("%d", 43))); return 0; }
------------------------>运行结果为4321,这是为什么呢?
------------------------>个代码的关键是明⽩ printf 函数的返回是啥?
根据c语言官网printf函数返回值可知它返回的是打印在屏幕上字符的个数 .
上⾯的例⼦中,我们就第⼀个printf打印的是第⼆个printf的返回值,第⼆个printf打印的是第三个
printf的返回值。
第三个printf打印43,在屏幕上打印2个字符,再返回2
第⼆个printf打印2,在屏幕上打印1个字符,再放回1
第⼀个printf打印1
所以屏幕上最终打印:4321