一、函数的嵌套调用和链式访问
函数和函数之间可以根据实际需求进行组合,也就是相互调用;
1.嵌套调用
简单理解为A函数调用了B函数又调用了C函数
#include <stdio.h>
int jisuan(float a,float b,float c)
{
float p = 0;
p=(a+b+c)/3;
if(p<60)
return 1;
else return 0;
}
int banji(int n)
{
float a = 0;
float b = 0;
float c = 0;
int h = 0;
int add=0;
while(n!=0)
{
scanf("%f %f %f",&a,&b,&c);
h=jisuan(a,b,c);
if(h==1)
add++;
n--;
h=0;
}
return add;
}
int main() {
int n = 0;
int add = 0;
scanf("%d",&n);
add=banji(n);
printf("%d",add);
return 0;
}
上面这个函数就是一个简单的调用,在main()函数中调用了banji(),而又在banji()函数中调用了jisuan()函数,组合实现了该代码。
注意事项:函数可以嵌套调用,不可以嵌套定义
2.链式访问
把一个函数的返回值作为另一个函数的参数,将函数像链条一样穿起来。
#include <string.h>
int main()
{
int len = strlen("abcdef");
printf("%d\n", len);
//链式访问
printf("%d\n", strlen("abcdef"));
return 0;
}
上面的代码就实现了简单的函数链式访问,将strlen()函数得返回值作为printf()函数的参数
二、函数的声明和定义
1.函数的声明
1.告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数声明决定不了。
2.函数的声明一般出现函数的使用之前。要满足先声明后使用
3.函数的声明一般要放在头文件中。
//函数声明
//int Add(int, int);
//int Add(int x, int y);
//
//int main()
//{
// int a = 0;
// int b = 0;
// //输入
// scanf("%d %d", &a, &b);
// //加法
// int c = Add(a, b);//函数调用
// //打印
// printf("%d\n", c);
//
// return 0;
//}
//
函数的定义
//int Add(int x, int y)
//{
// return x + y;
//}
下面就是上面函数的声明,告诉了编译器有一个add()的函数,参数类型为(int,int ),这里声明时只用要交代残数类型是什么,不用变量,下面展示的代码是两种声明方式,都可用,
//函数声明
//int Add(int, int);
//int Add(int x, int y);
2.函数的定义
1.函数的定义是指函数的具体实现,交代函数的功能实现。
函数的定义
//int Add(int x, int y)
//{
// return x + y;
//}
这便实现了一个函数的简单定义。函数的定义还是一个特殊的定义说明
//函数的定义-定义是一种特殊的声明
//int Add(int x, int y)
//{
// return x + y;
//}
//
//int main()
//{
// int a = 0;
// int b = 0;
// //输入
// scanf("%d %d", &a, &b);
// //加法
// int c = Add(a, b);//函数调用
// //打印
// printf("%d\n", c);
//
// return 0;
//}
以上代码便是一种特殊的声明,可不用在前面main()函数前声明,便可以直接运行了。
3.在我们了解了声明和定义了,我们就在想,它们除了这样有没有其他作用呢?
其实函数的声明和定义通常不是上面这样使用的,函数的声明应该放在头文件当中。
声明如下:
定义为:
函数的定义
//int Add(int x, int y)
//{
// return x + y;
//}
使用为:
这里就有人有疑问了,明明这么简单一个代码,为什么非要弄三个,搞得如此复杂。
这里我们得把眼光看长远点儿,未来你写的代码肯定会比这复杂,一个人无法完成,需要协作,不可能都在一个test.c里面写,这时候就需要我们分模块来写。比如我们这儿需要实现一个简单的计算机,我们便可以把加、减、乘、除分为四个模块,分别交给A、B、C、D四位程序员来完成
每个程序员都完成自己相应模块后,这时候当需要一个完整的计算机的时候,便可以轻松完成,比如q程序员想做,这时候他只需要创建一个test.c,并在该工程包含该这些函数便可以实现
这样做的优点是:1.分模块去写,方便写作,最后做整合
2.可以把代码的实现和声明分离
声明和分离又有什么用呢?
在这儿给大家举一个列子,假如,博主很厉害,在空余时间写了一个,很牛的代码(由于博主现在不牛,后面代码用加法代码代替),想要卖出去挣钱。那你想我是不会愿意把源代码卖出去,那这个时候我怎么才能既把东西卖出去,又不让别人知道我是怎么写的呢。
这时候便可以进行如下操作:
我们卖代码的时候,只需要让买家知道函数名和怎么使用就行。首先这是我们所写的代码
然后我们选中我们的项目csdn5_5,右键选中属性,我们会看到一个页面(如下),点击常规,
然后选中配置类型,将应用程序改为静态库 ,然后应用、确定
这时候由于已经变成静态库了,自然是无法编译了,下一步我们找到我们项目存储的路径
我们点进Dehug,会发现一个csdn.lib的文件
这时候我们可以打开这个文件看一下,在这里博主选择用记事本来打开,我们会发现为一段乱码,无法看懂。
进行到这儿,这个时候我们就可以将add.h和csdn5_5.lib文件卖出去还不会泄露自己代码实现,那么问题来了,买家拿到后该如何实现呢?我们只需要将这两个文件放入到买家所创建工程文件中,并在使用时前面加上
#pragma comment(lib,"csdn5_5.lib")
#include "add.h"
//.lib - 静态库
//导入静态库
#pragma comment(lib, "csdn5_5.lib")
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
int c = Add(a, b);
printf("%d\n", c);
return 0;
}
三、函数的递归
1.什么是递归
程序调用自身的编程技巧称为递归( recursion)。
递归做为一-种算法在程序设计语言中广泛应用。一 个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把- -个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
递归的主要思考方式在于:把大事化小
2.递归的两个条件
1、 存在限制条件,当满足这个限制条件的时候,递归便不再继续。
2、每次递归调用之后越来越接近这个限制条件。
关于递归的两个条件的详细讲解,以及递归与迭代,请关注博主后续动态更新!!!