第八章——函数

1. 什么是函数

函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数。

定义一个函数:

return_type function_name( parameter list )
{
   body of the function
}
  • 返回类型:一个函数可以返回一个值。return_type 是函数返回的值的数据类型。有些函数执行所需的操作而不返回值,在这种情况下,return_type 是关键字 void。
  • 函数名称:这是函数的实际名称。函数名和变量名具有相同的命名规范,由字母、下划线和数字组成,只能由字母和下划线开头。
  • 参数:参数就像是占位符。当函数被调用时,向参数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,也就是说,函数可能不包含参数。
  • 函数主体:函数主体包含一组定义函数执行任务的语句。

下面我们将求上面求质数的例子进行函数的封装:

#include <stdio.h>

int isPrime(int num) {
    int i = 2;
    for (; i <= num; i++) {
        //遇到第一个因数则跳出循环
        if (num % i == 0)
            break;
    }
    //如果该因数等于这个数本身则表明为质数,返回真
    if (i == num)
        return 1;
    else
        return 0;
}

int main() {
    for (int i = 2, count = 0; i <= 100; i++) {
        if (isPrime(i)) {
            printf("%-3d", i);
            count++;
            //判断质数的个数,五个质数就换行
            if (count % 5 == 0)
                printf("\n");
        }
    }
    return 0;
}

请大家尝试完成求两个数中最大公约数的函数封装。

参考代码如下:

#include <stdio.h>

int getGCD(int num1, int num2) {
    int min = num1;
    if (num1 > num2)
        min = num2;
    for (int i = min; i > 0; i--) {
        if (num1 % i == 0 && num2 % i == 0)
            return i;
    }
}

int main() {
    int num1, num2;
    printf("Input two intergers:");
    scanf("%d %d", &num1, &num2);
    printf("The greatest common divisor between %d and %d is %d.\n",
            num1, num2, getGCD(num1, num2));
    return 0;
}

2. 函数声明

函数声明会告诉编译器函数名称及如何调用函数。一般我们都是把创建的函数放在 main()之前,通过函数声明,我们就可以把函数主体放在 main()之后。

函数声明的格式:

return_type function_name( parameter list );

在函数声明中,参数的名称并不重要,只有参数的类型是必需的,因此下面也是有效的声明:

int getGCD(int, int);

针对上面求最大公约数的例子,通过函数声明可以改成如下:

#include <stdio.h>

int getGCD(int num1, int num2);
// int getGCD(int, int);

int main() {
    int num1, num2;
    printf("Input two intergers:");
    scanf("%d %d", &num1, &num2);
    printf("The greatest common divisor between %d and %d is %d.\n",
            num1, num2, getGCD(num1, num2));
    return 0;
}

int getGCD(int num1, int num2) {
    int min = num1;
    if (num1 > num2)
        min = num2;
    for (int i = min; i > 0; i--) {
        if (num1 % i == 0 && num2 % i == 0)
            return i;
    }
}

3. 小测试

  • 尝试编写通过函数的方式求圆面积的程序
  • 输入一个整数,求其\(x^2\)的程序