函数:
一段具有某项功能的代码段,是C语言中管理代码的最小单位
把代码封装成一个一个的函数,可以方便管理和调用代码
函数分类:
标准库函数:
C语言标准委员会为C语言以函数形式提供的一套常用的基础功能
被封转在lib.so、libm.so等库中,使用时需要提供头文件
通过函数名(参数)就可以调用该函数
int isalnum(int c);
功能:判断c是否是数字、字母字符,返回为真
int isalpha(int c);
功能:判断c是否是字母字符,返回为真
int iscntrl(int c);
功能:判断c是否是数字,返回为真
int islower(int c);
功能:判断c是否是小写字符,返回为真
int isupper(int c);
功能:判断c是否是大写字符,返回为真
int toupper(int c);
功能:判断c转换成大写字符
int tolower(int c);
功能:判断c转换成小写字符
int abs(int c);
功能:把j的绝对值返回
以下函数都封装在libm.so库中,编译时加-lm导入该库
double pow(double x,double y)
功能:返回x的y次方
double sqrt(double x)
功能:返回x的平方跟
double floor(double x)
功能:返回小于x的最大整数
double ceil(double x)
功能:返回大于等于x的最小整数
double fabs(double x)
功能:返回浮点数的绝对值
time_t time(time_t *tloc)
功能:返回自1970-1-1 0:0:0到调用该函数起,过了多少秒
time(NULL);
void srand(unsigned int seed);
功能:种随机种子
int rand(void);
功能:返回一个随机数
获取10个[100,1000]随机数
随机出一注双色球的中奖号码
红球六个1~33 不能重复
篮球个1~16
系统函数
是操作系统以函数形式提供的一些功能 系统函数不能算是真正的函数,这些功能包括
内存管理、文件IO、信号处理、文件管理、进程管理、进程通信
线程管理、线程同步、网络通信
第三方库函数
一些开源或者收费的第三方代码
glog 日志记录
MD5 验证
JSON 序列化和反序列化
自定义函数
为了更方便管理代码,减少代码冗余,把代码封装成函数的形式使用
函数声明:
函数声明的目的是为了告诉其他代码该函数的调用格式
返回值的类型 函数名(参数的类型 参数名1,参数类型 参数名2,...);
1、c语言中,函数名全部小写,用下划线分隔
2、如果该函数不需要参数,建议参数写void不要空着
3、函数定义是,不写return语句也会有返回值,但是返回值是一个垃圾值
4、如果函数不需要返回值,返回值类型也要写void,否则会默认为int类型
隐式声明:
在调用函数之前,该函数既没有声明也没有定义,那么编译器会对该函数进行隐式声明,会猜该函数的
的格式,如果猜测成功,也可以成功调用
参数会根据实参猜测,返回值会猜测为int类型
函数定义:
才是函数真正的实现代码
返回值的类型 函数名(参数的类型 参数名1,参数类型 参数名2,...)
{
函数体;
return val;
}
注意:函数声明中、定义中,参数列表中的变量叫做型参变量
注意:如果函数定义在函数调用之前,那么函数声明可以省略
注意:建议一个函数最多不要超过50行
函数调用:
函数名(实参):
注意:调用函数后,需要立即接受或者显示返回值,否则此次
函数传参:
1、函数的形参只属于所在的函数,除了该函数就不能在使用了
2、实参与形参之间是以赋值的形式进行数据传递的(单向值传递)
3、return其实是吧一个返回值放在调用者和函数之间公共的
区域内,如果不写return语句,该区域就是一个垃圾数据
一样可以被调用者读取到
4、当数组作为函数参数时,长度会丢失,因此需要额外传递一个
长度参数
5、数组的传递是:“址传递”,此时函数与调用者可以共享数组
练习1:
实现一个函数,找出数组的最大值
练习2:
实现一个函数,给数组排序
练习3:
实现一个函数,查找数组中是否存在某个值,如果存在返回该数据
在树组中的下标
设计函数的准则:
1、一个函数最好只解决一个问题,这样可以降低出错率,提高
可读性
2、最好尽量不依赖其他自定义函数(耦合度)
3、函数的数据由调用者提供,结果返回给调用者(通用性,不要把函数写死)
4、对函数调用者提供的非法参数进行考虑处理,可以通过返回值告诉调用者,
以及在注释中说明可能出现的非法情况