C语言入门系列 - 自定义函数
第一节 C 语言基础以及基本数据类型
第二节 C 语言运算符
第三节 C 语言控制语句
第四节 C 语言自定义函数
第五节 C 语言修饰变量的关键字
第六节 C 语言构造数据类型–数组
第七节 C 语言字符串
第八节 C 语言指针
第九节 指针与函数、指针函数、函数指针
第十节 数组与指针、二级指针&NULL&void 指针
第十一节 结构体
第十二节 链表
第十三节 共用体union,枚举enum,宏定义#define,条件编译,const与指针
C语言–图书管理项目
函数
- C语言入门系列 - 自定义函数
- 函数介绍
- 一、函数声明
- 二、函数定义
- 函数定义格式
- 三、函数调用
- 四、注意事项
- 五、递归函数
- 六、随机数函数
- 总结
函数介绍
函数就是将一段代码封装起来,为了代码复用
功能性的代码: 判断一个数是不是素数
判断某个年是闰年还是平年
提示:以下是本篇文章正文内容,下面案例可供参考
一、函数声明
函数声明:是为了在编译阶段让编译器知道函数的名字 函数的形参列表 函数的返回值。
函数三要素:函数名
返回值类型
形参列表:形参类型 形参名,形参类型 1 形参名 1,…
声明格式: 返回值类型 函数名(形参列表);
int isPrime(int num);
一个月有多少天和谁有关? 月份 年份
函数名:days
返回值类型: short
形参列表: 2 个 short year,short month
short days(short year,short month);
程序代码执行到上面语句的时候,它知道程序里面有一个名字叫 days 的函数,它的返回值类型是 short,它有两个形参,一个是 year,一个是 month,year 是 short 类型,month 是 short 类型,并且year 在前,month 在后。
当调用函数 days 的时候程序会按照上面的信息进行语法检查,如果形参类型不一致或者返回值类型不一致,或者函数名错误都会报错。
二、函数定义
函数定义格式
返回值类型 函数名(形参列表)
{
// 业务实现代码
}
判断素数函数代码如下:
int isPrime(int num){// 2~num-1 和 num 取余// 如果余数为 0 ,num 就不是素数,返回 0;// 如果执行 2~num-1 和 num 取余,没有一个余数为 0,则 num 是素数,返回 1int i;for(i=2;i<num;i++){if(num % i == 0){return 0;}}return 1;
}
三、函数调用
函数名(实参列表); 真正的数据
isPrime(10);
函数执行返回相应的结果,如果想保存结果,就需要开启一个和返回值类型一致的空间,用于保存函数返回的数据。
int res = isPrime(13);
printf(“%d”,res); // 1
函数调用流程:
注意:函数调用,有形参会首先在函数内部给形参分配空间。
函数调用结束,里面的变量或者形参空间会被销毁掉。
四、注意事项
1.main 函数的外面 – 一个函数的定义不能写在另外一个函数里面。
2.在函数内不需要定义变量接收实参,函数调用时会将实参数据传递给形参。
3.注意函数返回值的接收问题。
4.函数:1、先定义(直接定义即声明+定义同时进行,但一定要在主函数main()前面进行定义) 2、在调用
5.返回值类型:数据类型 无返回值类型 void ,在函数里面可以不写 return,或者 return 的后面没有返回值。return ;
6.形参列表,数据类型 没有形参 – 可以不写形参,也可以写上 void
7.函数设计规范:一般不在函数里面写输入和输出语句。
函数代码通用性 – 复用
五、递归函数
递归函数:一个函数在代码块中调用自身。需要设置一个终止条件
递归函数的优缺点:1、占用空间比较大 2、写法简单
阶乘代码如下:
long long jiecheng(n)
{if(n == 1) //结束条件{ return 1;}else //调用自身函数{return n*jiecheng(n-1);}
}
// 需要用到函数执行后的结果,那么也就一位这个函数必须有返回值。
long long res = jiecheng(5);
六、随机数函数
库函数 stdlib.h
rand() 生成一个随机数
int __cdecl rand(void); rand()在产生随机数的时候是根据种子按照一定的算法产生的。但是这个种子在电脑启动的时候就已经产生了。所以产生随机数的时候需要刷新种子。
srand() – 刷新种子的函数。
种子为了保证每次运行的时候不一样。可以使用时间戳
库函数 time.h
time(); __CRT_INLINE time_t __cdecl time(time_t *_Time) { return _time64(_Time); }
(unsigned int)time(NULL); // 当前系统时间距 1970-1-1 有多少毫秒
srand((unsigned int)time(NULL));
生成四位随机验证码代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>int main()
{ //-- 62 个char str[] = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; int i;srand((unsigned int)time(NULL)); //刷新随机数种子 for( i=0 ; i<4 ; i++ ){printf("%c", str[rand()%62]);}return 0;
}
总结
函数定义的时候 ,之前定义在 main 函数的上面。
如果将自定义的函数放入到 main 函数下面,在 main 函数里面调用,因为函数执行的时候从上往下,执行到函数的调用的时候还不知道有这个函数,并且不知道函数的返回值类型、形参个数 、形参类型 ,形参顺序,无法进行语法检查(这时就正要进行函数声明)。
递归函数:一定需要设置一个终止条件。
随机函数生成随机数的写法很固定。
srand((unsigned int)time(NULL)); //刷新随机数种子 for( i=0 ; i<4 ; i++ ){printf("%c", str[rand()%62]);//随机数}