辅助方法
本课属于 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
这种模式能让你的结构体保持精简:只存储必要的数据,并在需要时计算其他所有内容。这样也能确保派生值始终与当前状态一致。
挑战
简单让我们构建一个 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;
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: C 在线编译器