利用函数实现模块化设计
函数的声明
返回值类型 函数名(参数类型1 参数1,....,参数类型1 参数n){
函数体
return 返回值//如果为void类型则不用写return语句
}
- 函数体内的参数是属于形式参数,调用该函数时括号里面的参数属于实际参数
- 函数的声明和调用是能达到一个形参和实参虚实结合的效果
- 函数是通过执行该函数,该函数最后返回的一个返回值,接收返回值。完成函数的调用过程
- 在定义函数时指定的函数类型一般应该和return语句里面的返回值类型是一致的**(函数类型决定函数的返回值类型)**
#include <stdio.h>
int max(int a,int b,int c){
//令形参c为a与b的最大值 但是因为是形式参数 调用完函数就自动清除 传不回在mian中定义的c
c = a>b?a:b;
return a>b?a:b;
}
//分清形参和实参
int main()
{
int a,b;
int c=0;
int maxnum=0;
scanf("%d %d",&a,&b);
//调用max方法返回a与b的最大值 此时c还是0
maxnum=max(a,b,c);
//输出a与b的最大值maxnum和c=0
printf("maxnum=%d c=%d",maxnum,c);
return 0;
}
函数的基本使用
计算两个数的最大值
#include <stdio.h>
//声明一个返回值类型为int的函数max 参数为两个int型变量a和b
int max(int a,int b){
return a>b?a:b;
}
//计算两个数的最大值
int main()
{
int a,b;
int maxnum=0;
scanf("%d %d",&a,&b);
maxnum=max(a,b);
printf("maxnum=%d",maxnum);
return 0;
}
函数的嵌套调用
使用函数的嵌套计算四个数的最大值
在一个函数内嵌套调用其他的函数
#include <stdio.h>
//定义返回四个数最大值的函数max4n
int max4n(int a,int b,int c,int d){
//将max函数的返回值作为max函数的参数 进行嵌套运算
return max(max(a,b),max(c,d));
}
//返回两个数的最大值
int max(int a,int b){
return a>b?a:b;
}
//嵌套计算四个数的最大值
int main()
{
int a,b,c,d;
int maxnum=0;
scanf("%d %d %d %d",&a,&b,&c,&d);
//调用返回四个数最大值的函数max4n 拿maxnum存储该函数的返回值
maxnum=max4n(a,b,c,d);
printf("maxnum=%d",maxnum);
return 0;
}
函数的递归调用
- 函数的嵌套调用:在一个函数内嵌套调用其他的函数
- 函数的递归调用:在一个函数内递归调用自己的函数
- 为了避免栈的溢出,函数递归调用的次数应该不宜过多,应该在函数体内预先定义能使递归停止的语句,避免无限递归
#include <stdio.h>
int fib(int n)
{
//比如fib(4)=fib(3)+fib(2)
//而fib(3)=fib(2)+fib(1)
//这就形成了函数的递归调用
if(n>=3)
{
return fib(n-1)+fib(n-2);
}
//结束递归的条件
if(n==1||n==2)
{
return 1;
}
}
//递归计算前二十个斐波那契数列
int main()
{
for(int i = 1 ; i < 21 ; i ++)
{
printf("%-5d",fib(i));
}
return 0;
}
数组作为函数的参数
用一维数组作为函数的参数
#include <stdio.h>
//接受一个数组指针 该数组指针指向需要计算最大的数组的首地址 和元素个数n
int max(int arr[],int n){
int maxn = arr[0];
//循环计算最大值
for(int i=0;i<n;i++){
if(maxn<arr[i]){
maxn = arr[i];
}
}
//返回最大值
return maxn;
}
//数组作为函数的参数
int main()
{
int arr[]={
1,1,4,5,1,4,1,9,1,9,8,1,0};
//把数组的首地址作为参数传入函数中
printf("%d",max(arr,13));
return 0;
}
二维数组和多维数组的传递和一维数组类似
局部变量和全局变量
定义在函数体内部的变量是局部变量,定义在函数体外的变量是全局变量。需要在调用全局变量之前的代码段中进行全局变量定义
#include <stdio.h>
//定义全局变量a为3 全局变量b为5
int a=3;
int b=5;
//返回两个数的最大值
int max(int a,int b){
return a>b?a:b;
}
//区别局部变量和全局变量
int main()
{
//定义局部变量a 该局部变量在main函数中生效
//全局变量a在main函数中被局部变量a屏蔽 不起效
int a=0;
//向main函数中的局部变量a中输入值
scanf("%d",&a);
//调用max方法 参数为定义在main函数中的局部变量a和全局变量b
printf("%d",max(a,b));
return 0;
}
自动变量和静态局部变量
不同变量存储类型的比较
存储类名 | 生命周期 | 作用域 |
---|---|---|
extern | 静态(程序结束后释放) | 外部(整个程序) |
static | 静态(程序结束后释放) | 内部(仅翻译单元,一般指单个源文件) |
auto,register | 函数调用(调用结束后释放) | 无 |
#include <stdio.h>
//返回两个数的最大值
int max(int a){
//定义静态局部变量b为10 静态局部变量只能赋一次初值 多次赋初值无效
//第一次调用结束该静态局部变量b为11
//第二次调用结束该静态局部变量b为12
static int b=10;
b=b+1;
return a>b?a:b;
}
//区别自动变量和静态局部变量
int main()
{
//不加修饰符的默认变量为auto类型 自动类型的变量
int a=0;
scanf("%d",&a);
printf("%d\n",max(a));
printf("%d",max(a));
return 0;
}