【重拾C语言】五、模块化程序设计 | 您所在的位置:网站首页 › 怎样定义一个函数c语言语句 › 【重拾C语言】五、模块化程序设计 |
目录 前言 五、模块化程序设计——函数 5.1 计算三角形的重心 5.2 函数 5.2.1 函数定义 5.2.2 函数调用 a. 函数调用的形式和过程 b. 参数传递 值传递 指针传递 c. 函数结果返回 5.2.3 函数原型(先调用后定义) 5.3 程序设计实例 5.3.1 打印字符图形 5.3.2 哥德巴赫猜想 5.4 程序调试 前言 本文介绍了模块化程序设计——函数,其中包括如何定义函数、函数的调用形式和过程、参数传递(值传递和指针传递)、函数结果的返回以及函数原型的使用。具体的程序设计实例有打印字符图形和验证哥德巴赫猜想。 五、模块化程序设计——函数在C语言中,我们可以使用函数实现模块化程序设计,将一些独立功能的部分写成单独的函数,使得程序更加结构化和清晰。 5.1 计算三角形的重心我们可以根据给定的三角形顶点坐标(x1, y1)、(x2, y2)和(x3, y3)来计算三角形的重心。重心G的坐标计算公式如下: 以下是使用C语言实现的函数: #include void centroid(float x1, float y1, float x2, float y2, float x3, float y3, float *Gx, float *Gy) { *Gx = (x1 + x2 + x3) / 3; *Gy = (y1 + y2 + y3) / 3; } int main() { float x1, y1, x2, y2, x3, y3, Gx, Gy; scanf("%f%f%f%f%f%f", &x1, &y1, &x2, &y2, &x3, &y3); centroid(x1, y1, x2, y2, x3, y3, &Gx, &Gy); printf("Centroid of the triangle is: (%.2f, %.2f)\n", Gx, Gy); return 0; }(关于指针的使用详见本系列后文) 函数定义包括返回值类型、函数名、参数列表以及函数体。 类型符 函数名(形式参数表) { 函数体 }其中,返回类型符指定了函数返回的数据类型,可以是基本数据类型(如int、char、float等)或自定义的数据类型。函数名是函数的标识符,用于在程序中调用该函数。参数列表是一组用逗号分隔的参数,可以包含零个或多个参数,每个参数包括参数类型和参数名。函数体是函数的具体实现代码,包括一系列语句和操作。以上面 centroid 函数为例: 函数的目的是计算一个三角形的质心坐标。它接受6个输入参数,分别是三角形的3个顶点的x和y坐标(x1, y1, x2, y2, x3, y3),以及两个指针变量(float *Gx和float *Gy),用于存储计算得到的质心的x和y坐标。 在函数体中,通过将三个顶点的x坐标相加并除以3,将结果存储在*Gx指向的内存位置中,表示质心的x坐标。同样,将三个顶点的y坐标相加并除以3,将结果存储在*Gy指向的内存位置中,表示质心的y坐标。 请注意,在C语言中,函数的声明和定义可以分开进行,即可以在程序的开头声明函数的原型(函数名、参数列表和返回类型),然后在后面的位置实现函数的定义。这种分离的方式可以提供更好的代码组织和模块化。 (详见5.2.3 函数原型) 5.2.2 函数调用 函数名(实际参数表)函数调用是在主函数或其他函数中使用已定义的函数。通过函数名和实际参数列表来调用函数。例如,在 main 函数中,我们调用了 centroid 函数并传入了6个实际参数和2个用于存储结果的指针。 定义一个函数后,就可以在程序中调用这个函数: 标准库函数:在程序的最前面用#include命令包含相应的头文件。自定义函数:程序中必须有相对应的函数定义。a. 函数调用的形式和过程 在C语言中,函数调用通过函数名和实际参数列表的形式进行。函数调用的一般形式是: 函数名(参数1, 参数2, ...);其中,函数名是要调用的函数的名称,参数是传递给函数的输入值。 函数调用的过程如下: 程序执行到函数调用的位置时,会跳转到被调用函数的起始位置。在被调用函数中,执行函数体中的语句,处理传递进来的参数。如果函数有返回值,计算并返回结果。执行完函数体中的语句后,返回到函数调用的下一条语句,继续执行。b. 参数传递 在C语言中,函数参数可以通过值传递(传递参数的副本)或指针传递(传递参数的地址)的方式进行传递。 值传递 当使用值传递方式传递参数时,函数内部对参数的修改不会影响到函数外部的变量。即函数内部操作的是参数的副本。指针传递 当使用指针传递方式传递参数时,函数内部可以通过指针来访问和修改函数外部的变量。通过传递变量的地址,函数可以直接对原始变量进行操作。(关于指针相关知识详见后文) c. 函数结果返回 函数可以有返回值,也可以没有返回值。函数的返回值通过 return 语句来指定。函数的返回值可以是任意基本类型(如整数、浮点数等),也可以是指针类型或结构体类型。在函数中使用 return 语句将结果返回给调用函数。返回值可以直接返回,也可以存储在变量中后再返回。例如,以下是一个函数的示例,它计算两个整数的和并返回结果: int add(int a, int b) { int sum = a + b; return sum; }在调用该函数时,可以将返回值赋给一个变量: int result = add(3, 5);在这个例子中,函数 add 接收两个整数参数 a 和 b,计算它们的和并将结果返回。函数调用 add(3, 5) 的结果为 8,然后将返回值 8 赋给变量 result。 5.2.3 函数原型(先调用后定义)函数原型是函数定义的简化形式,用于告诉编译器函数的信息,包括函数的返回值类型、函数名和参数列表(包括参数类型和参数名)。函数原型的目的是在函数调用之前提供函数的声明,让编译器知道函数的存在及其参数和返回值的类型。 在C语言中,函数原型的语法形式为: 返回值类型 函数名(参数列表);例如,对于之前提到的 centroid 函数,可以编写函数原型如下: void centroid(float x1, float y1, float x2, float y2, float x3, float y3, float *Gx, float *Gy);通过提供函数原型,我们可以在主函数之前声明函数,使得编译器能够正确地解析函数调用,并检查函数调用的参数类型和返回值类型的匹配性。这提高了程序的可读性和可维护性。在本例5.1中,函数原型可以省略,因为我们把 centroid 函数放在 main 函数的前面。 在程序的开头声明函数的原型: #include void centroid(float x1, float y1, float x2, float y2, float x3, float y3, float *Gx, float *Gy); int main() { float x1, y1, x2, y2, x3, y3, Gx, Gy; scanf("%f%f%f%f%f%f", &x1, &y1, &x2, &y2, &x3, &y3); centroid(x1, y1, x2, y2, x3, y3, &Gx, &Gy); printf("Centroid of the triangle is: (%.2f, %.2f)\n", Gx, Gy); return 0; } void centroid(float x1, float y1, float x2, float y2, float x3, float y3, float *Gx, float *Gy) { *Gx = (x1 + x2 + x3) / 3; *Gy = (y1 + y2 + y3) / 3; } 5.3 程序设计实例 5.3.1 打印字符图形 #include void printCharacterPattern(int n) { int i, j, space; // 打印上半部分 for (i = 1; i |
CopyRight 2018-2019 实验室设备网 版权所有 |