C语言利用函数实现模块化设计

利用函数实现模块化设计

函数的声明

返回值类型 函数名(参数类型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;
}

猜你喜欢

转载自blog.csdn.net/a695415974/article/details/122491406