C语言笔记8

313 阅读3分钟

函数

定义

image.png

eg1 add函数

int add(int a,int b);//返回值类型:int整型 输入值:两个整数
	{
		return a + b;//做点什么:不做 返回值:两个整数的和
	}    

调用

  • 函数需要被另一个函数调用才能执行
#include <stdio.h>
int add(int a,int b)//函数定义
{
        return a + b;
}
int main()
{
        int result;
        result = add(2, 3);//函数调用
        printf("%d", result);
        return 0;
}  

封装

  • 封装后可多次调用 可增加复用性

eg2 不封装 用海伦公式计算三角形面积

#include <stdio.h>
#include<math.h>//sqrt需要头文件#include<math.h>
int main()
{
        //输入abc
        double a, b, c, p, s;
        scanf("%lf" "%lf" "%lf", &a,&b,&c);

        //判断是否构成三角形
        if (a + b > c && a + c > b && b + c > a)
                printf("it's a traingle\n");
        else
        {
                printf("not a traingle\n");
                return 0;//无法构成三角形 程序结束
        }

        //求三角形面积  
        p = (a + b + c) / 2;
        s = sqrt(p * (p - a) * (p - b) * (p - c));

        //输出结果
        printf("s=%f", s);
        return 0;
}  

eg3 封装 用海伦公式计算三角形面积

#include <stdio.h>
#include<math.h>//sqrt需要包含math.h

//判断能否构成三角形
int yes(double a, double b, double c)
{
        if (a + b > c && a + c > b && b + c > a)
                return 1;
        else
                return 0;
}

//定义求面积函数
double area(double a, double b, double c)
{
        double p, s;
        p = (a + b + c) / 2;
        s = sqrt(p * (p - a) * (p - b) * (p - c));
        return s;
}

int main()
{
        //输入abc
        double a, b, c;
        scanf("%lf" "%lf" "%lf", &a, &b, &c);

        //能否构成三角形
        if (yes(a, b, c) == 0)
        {
                printf("no");
                return 0;
        }

        //求面积  
        double s;
        s = area(a, b, c);
        printf("area is %f", s);
        return 0;
}

返回

  • void为空类型 无需输入和返回函数
  • return会停止函数的执行 返回主调函数
  • int main()需要返回值0 当函数正常执行后会返回0 用来检查函数是否正常执行

声明(原型)

  • 函数定义应放在调用前
  • 若调用前没有定义 可使用函数声明通知编辑器有这个函数存在
  • 声明格式:函数体;
  • 函数声明时可省略或修改变量名

eg4 声明

#include <stdio.h>
#include<math.h>

//调用前加函数声明
int yes(double, double, double);
double area(double, double, double);

int main()
{
    double a, b, c;
    scanf("%lf" "%lf" "%lf", &a, &b, &c);

    if (yes(a, b, c) == 0)
    {
        printf("no");
        return 0;
    }

    double s;
    s = area(a, b, c);
    printf("area is %f", s);
    return 0;
}

//函数定义
int yes(double a, double b, double c)
{
        if (a + b > c && a + c > b && b + c > a)
                return 1;
        else
                return 0;
}
double area(double a, double b, double c)
{
        double p, s;
        p = (a + b + c) / 2;
        s = sqrt(p * (p - a) * (p - b) * (p - c));
        return s;
}  

形参与实参

#include <stdio.h>
int add(int a, int b)
{
        return a + b;
}
int main()
{
        int result;
        result = add(2, 3);//函数调用
        printf("%d", result);
        return 0;
}  
  • 形式参数:a,b 指代函数参数的类型 是函数需经历的处理步骤 无确定值 只能是变量
  • 实际参数:2,3 确定函数参数的具体值
  • 形参实参相互独立
  • 函数内声明的变量为局部变量 不同函数内的局部变量相互独立 即使变量名相同

函数递归

定义

  • 函数内部调用自己 先递推再回归 放在递归调用前的语句将在递推过程中执行 而放在递归调用后的语句将在回归过程中执行

条件

  • 递推规则
  • 递推结束条件
#include <stdio.h>
void func(int n)
{
        if (n == 5)//n为5时结束递推
                return;
        printf("%d\n", n);
        func(n + 1);
}

int main()
{
        func(0);
        return 0;
}  

image.png

image.png

回归

#include <stdio.h>
void func(int n)
{
        if (n == 5)//n为5时结束递推
                return;
        printf("after %d\n", n);//递归前的语句 递归时执行
        func(n + 1);
        printf("before %d\n", n);//递归后的语句 回归时执行
}

int main()
{
        func(0);
        return 0;
}

image.png
image.png

实例

  • 阶乘

n为0或1时 f(n)返回1
n大于1时 f(n)=n*f(n-1)

#include <stdio.h>
int f(int n)
{
        if (n == 0 || n == 1)
                return 1;
        return n *f (n - 1);
}

int main()
{
        int result = f(4);
        printf("%d", result);
        return 0;
}
  • 斐波那契数列

n为1或2时 f(n)返回1
n大于2时 f(n)=f(n-1)+f(n-2)

#include <stdio.h>
int f(int n)
{
        if (n == 1 || n == 2)
                return 1;
        return f(n-1) + f(n - 2);
}

int main()
{
        int result = f(4);
        printf("%d", result);
        return 0;
}

调试

见课件25 懒得贴图了