Menu
CoddyTech

辅助方法

本课属于 Coddy C 学习旅程的“面向对象编程”单元。第 10 课,共 61 课。

到目前为止,我们已经见过修改结构体数据的函数(例如 player_take_damage),也见过只显示数据的函数。但还有一类重要的函数:它们会根据结构体成员计算派生值,而不会改变任何内容。

考虑一个存储宽度和高度的 Rectangle 结构体。面积不会被存储,而是在需要时计算:

typedef struct {
    double width;
    double height;
} Rectangle;

double rectangle_area(const Rectangle *self) {
    return self->width * self->height;
}

double rectangle_perimeter(const Rectangle *self) {
    return 2 * (self->width + self->height);
}

这些是辅助方法。它们使用结构体中已有的数据,并生成一个新值。注意,它们使用 const 指针,因为它们只读取数据,从不写入。计算结果会被返回,而不是存储在结构体中。

Rectangle box = {5.0, 3.0};
printf("Area: %.1f\n", rectangle_area(&box));       // 15.0
printf("Perimeter: %.1f\n", rectangle_perimeter(&box)); // 16.0

这种模式能让你的结构体保持精简:只存储必要的数据,并在需要时计算其他所有内容。这样也能确保派生值始终与当前状态一致。

challenge icon

挑战

简单

让我们构建一个 Circle 模块,用存储的数据计算派生值。你将练习编写辅助函数:根据结构体成员计算结果,但不修改它们。

你将创建 3 个文件:

  • circle.h:声明一个只有一个 double radius 成员的 Circle 结构体。还要声明两个辅助函数:
    • circle_area:接受一个指向 Circle 的 const 指针,并返回面积
    • circle_circumference:接受一个指向 Circle 的 const 指针,并返回周长
    使用符号 CIRCLE_H 设置头文件保护。
  • circle.c:实现这两个辅助函数。计算时使用 3.14159 作为圆周率。面积公式为 pi * radius * radius,周长公式为 2 * pi * radius。两个函数都只能读取半径,不能修改它。
  • main.c:创建一个 Circle,并使用辅助函数计算和显示它的属性。

你将收到一个输入:圆的半径(类型为 double)。

在主文件中,使用给定的半径初始化一个 Circle,然后使用辅助函数计算并打印面积和周长。

按以下格式打印结果:

Area: {area}
Circumference: {circumference}

两个值都使用 %.2f,显示两位小数。

例如,半径为 5.0 时,输出为:

Area: 78.54
Circumference: 31.42

亲手试试

#include <stdio.h>
#include "circle.h"

int main() {
    double radius;
    scanf("%lf", &radius);
    
    // TODO: 用给定的半径创建一个 Circle 结构体
    
    // TODO: 使用 circle_area 和 circle_circumference 辅助方法
    // 计算并打印结果
    
    // 打印格式:
    // printf("Area: %.2f\n", ...);
    // printf("Circumference: %.2f\n", ...);
    
    return 0;
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: C 在线编译器