6bingame 发表于 2024-12-3 14:03:04

每日一学9

本帖最后由 6bingame 于 2024-12-3 14:01 编辑

今天继续函数冲冲冲!

函数的声明

函数的声明的目的是使编译系统在编译阶段对函数的调用进行合法性检查,判断形参和实参的类型及个数是否匹配。函数声明采用函数原型的方法。函数原型就是已经定义函数的首部。

有参函数的声明形式为:
函数类型 函数名(形参列表);

无参函数的生命形式为:
函数类型 函数名();

题1:编写一个函数,球半径为r的球的体积。球的半径r由用户输入。

解:
#include<stdio.h>

double volume(double);      //函数的声明

void main()
{
    double r,v;

    printf("请输入半径:");

    scanf("%lf",&r);

    v=volume(r);

    printf("体积为:%lf\n\n",v);

}

double volume(double x)
{
    double y;

    y=4.0/3*3.14*x*x*x;

    return y;
}

例题分析:
本题中被调用函数volume()的定义在调用之后,需要在调用该函数之前给出函数的声明,声明的格式只需要在函数定义的首部加上分号,且声明中的形参列表只需要给出参数的类型即可,参数名字可写可不写,假如有多个参数则用逗号隔开。
函数的声明在下面3种情况下是可以省略的
(1)被调函数定义在主调函数之前
(2)被调函数的返回值是整形或字符型(整形是系统默认的类型)。
(3)在所有的函数定义之前,已在函数外部进行了函数声明。




函数的嵌套调用

在C语言中,函数之间的关系是平行的、独立的,也就是在函数定义时不能嵌套定义,即一个函数的定义函数体内不能包含另外一个函数的完整定义。但是C语言允许进行嵌套调用,也就是说,在调用一个函数的过程中可以调用另外一个函数。

题2:函数嵌套调用示例

#include<stdio.h>

fun2(int x,int y)
{
    int z;

    z=2*x-y;

    return z;
}

fun1(int x,int y)
{
    int z;

    z=fun2(x,x+y);      //在fun1()内调用fun2()函数

    return z;
}


main()
{
    int a,b,c;

    printf("请输入两个整数:");

    scanf("%d%d",&a,&b);

    c=fun1(a,b);   //调用fun1()函数

    printf("%d\n",c);
}

例题分析:
本题是两层的嵌套,其执行过程是:
1.执行main()函数的函数体部分;
2.遇到函数调用语句,程序转去执行fun1()函数;
3.执行fun1()函数的函数体部分;
4.遇到函数调用fun2()函数,转去执行fun2()函数的函数体;
5.执行fun2()函数体部分,直到结束;
6.返回fun1()函数调用fun2()处;
7.继续执行fun1()函数的尚未执行的部分,直到fun1()函数结束;
8.返回main()函数调用fun1()处;
9.继续执行main()函数剩余部分,直到结束。



函数的递归调用

如果在调用一个函数的过程中,又直接或间距地调用了该函数本身,这种形式称为函数的递归调用,这个函数就称为递归函数。递归函数分为直接递归和间接递归两种。C语言的特点之一就在于允许函数的递归调用。
直接递归就是函数在处理过程中又直接调用了自己。例如:
int func(int a)
{
        int b,c;
        ......
        c=func(b);
        ......
}
如果函数a调用函数b,而函数b反过来又调用函数b,就称为间接递归。

题3:用递归方法求n!(n>0)

解:
#include<stdio.h>

long fac(int n)   //定义求阶乘的函数fac()
{
    long m;

    if(n==1)

      m=1;

    else

      m=fac(n-1)*n;       //在函数的定义中又调用了自己

    return m;
}

main()
{
    int n;

    float y;

    printf("input the value of n.\n");

    scanf("%d",&n);

    printf("%d!=%ld\n",n,fac(n));   //输出n!
}

很多问题可以用递归算法解决,也可以用迭代算法或其他算法解决,而后者计算的效率往往更高,更容易理解。
所以上题也可以用循环来实现。

#include<stdio.h>

long fac(int n)
{
    int i;

    long m=1;

    for(i=1;i<=n;i++)
    {
      m=m*i;
    }

    return m;
}

main()
{
    int n;

    float y;

    printf("input the value of n.\n");

    scanf("%d",&n);

    printf("%d!=%ld",n,fac(n));
}

例题分析:
本例题采用递归法求解阶乘,就是5!=4!*5, 4!=3!*3...1!=1。
可以看出,当n>1时,求n的阶乘公式是一样的,因此可以用一个函数来表示上述关系,即fac()函数。
main()函数中只调用了一次fac()函数,整个问题的求解全靠一个fac(n)函数调用来解决。

芜湖666 发表于 2024-12-3 20:22:41

打卡
页: [1]
查看完整版本: 每日一学9