1. 函数
C语言一门面向过程的语言,注重程序的执行过程,在程序中函数是主体函数本质就是一些语句的集合
C程序中函数主要分为3类
(1)主函数(main) 程序的入口
(2)自定义函数
(3)库函数 printf、scanf
1.1 函数的定义
返回值 函数名(形式参数){
函数体;
}
函数的参数相当于函数的入口,函数的返回值相当于函数的出口,函数体就是函数的具体功能;
void表示不需要参数和 返回值,函数写完,记得要对函数进行声明,如果没有声明,编译器会默认声明返回值为int 的函数
根据传入的两个数据,返回较大值int max(int num1,int num2)
{
if(num1 > num2)
{
return num1;
}
return num2;
//return num1 > num2?num1:num2;
}
注意:
(1)如果函数不需要参数,也不需要返回值,那么使用void表示
(2)如果函数定义在主函数的后面,需要对函数进行声明,声明方法:把函数头拷贝过来,加个分号即可
(3)定义的函数需要被主函数直接/间接 的调用才会实现具体的功能
1.2函数的参数
例子: 编程实现,编写一个函数,将传入的两个变量的值,进行交换;交换两个变量值的方法:
int a = 3 ,b = 5;
(1)int temp = a; a = b;b = temp;
(2) a = a^b;
b = b^a;
a = a^b;
( 3) a = a + b;b = a - b; a = a - b;
1.2.1形式参数 和 实际参数
(1)形式参数:在函数的声明和定义的时候的参数,如果有多个形参时,使用逗号隔开。每个形参都必须指定数据类型
(2)实际参数:在函数的调用时传递的参数
注意:
(1)在函数声明中,形参名是可以省略的;
(2)实参名 和 形参名 可以相同也可以不同
(3)C语言的潜规则:当自定义函数在声明的时候参数为空时,表示可以接受任意多个实参
如:void fn();fn (num1,num2,num3,"hello");
(4) 当函数的返回值类型 和return的数据类型不一致时,以函数的返回值类型为准
double fn (){return 66;}
1.2.2值传递 和 址传递 的比较:
(1)值传递表示将数据值传过去了,做了一个复制(2)址传递表示把数据的地址传递过去了,共用同一块内存;
1.2.3数组作为参数时的处理方法:
void fn (int arr [], int len);第一个参数为数组的首地址,第二个参数为数组的长度1.3 库函数
(1)rand 函数rand 随机 man 3 rand
#include<stdlib.h>
int rand(void);
函数不需要参数,返回一个指定范围的伪随机数
生成指定范围内的随机数
int res = rand()%n; 生成 0~ n-1之间的随机数
int res = rand()%n+1;生成1~ n-1之间的随机数
(2)srand函数#include<stdlib.h>
void srand(unsigned int seed)
函数通过设置随机种子从而产生一个新的随机数,这个数由rand 函数返回(3)time
#include<time.h>time_t time(time_t *t)
函数的作用返回1970-1-1 0:0:0 到现在的秒数,如果参数不为空,则返回值保存在t所指向的内存中,如果参数为NULL ,那么秒数由返回值返回time_t ->unsigned int
生成随机数的方法步骤:
(1)设置随机数的种子
srand(time(0)); => int t = time(0);srand(t);
1.4常见的库函数以及头文件
(1) C99 中封装了bool类型true false #include<stdbool.h>
(2)sqrt 开平方的函数
#include<math.h>
编译的语句:gcc xxx.c -lm(-lm 表示链接到库函数)
(3)exit 终止程序的函数
#include<stdlib.h>
void exit(int status);参数一般填0表示程序正常终止,-1表示非正常终止
(4)exit 和 return 的区别
return -> 结束当前函数,return/return 0/return -1;
exit ->结束整个程序 exit(0)/exit(-1)
(5)常见的头文件
stdio.h —> 包含输入输出相关的函数
time.h ->时间相关的函数
stdlib.h ->工具相关的函数,exit/srand
math.h ->数学函数
string.h -> 字符串处理相关函数
stdbool.h ->bool类型的头文件
头文件包含在:/usr/include 目录下
(6) 函数的设计应该遵循:"高内聚,低耦合"
在一个模块中,让每一个元素之间都尽可能的紧密相连,在一个 完整的系统中,模块与模块之间尽可能的独立
1.5.常量:
常量的定义和变量非常相似,只是使用const关键字修饰,表示这个变量的值不可改变例子: const int num = 23;(推荐使用)
int const num = 66;
应用:
const 修改函数的形参的时候,表示这个参数的值在函数体内不可改变
1.6.递归:
函数:f(3) = 5 x <= 0;
= 2f(x - 1) + 3 x > 0;
递归:如果一个函数调用自己本身,就说这个函数是递归的
递归条件:
(1)必须有退出条件
(2)找到递归的规律