Menu
Coddy logo textTech

Вспомогательные методы

Часть раздела Объектно-ориентированное программирование путешествия по C на Coddy. Урок 10 из 61.

До сих пор мы видели function, которые изменяют данные структур (например, player_take_damage), и function, которые просто отображают их. Но существует ещё одна важная категория: function, которые вычисляют производные значения на основе членов структур, ничего не изменяя.

Рассмотрим структуру Rectangle, в которой хранятся ширина и height. Площадь не хранится: она вычисляется по запросу:

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);
}

Это helper methods. Они берут существующие данные структуры и создают новое значение. Обратите внимание, что они используют указатели const, поскольку only read и никогда не записывают данные. Вычисленный результат возвращается, а не сохраняется в структуре.

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, который вычисляет производные значения на основе сохранённых данных. Вы попрактикуетесь в написании вспомогательных методов: функций, которые вычисляют results из членов структуры, не изменяя их.

Вы создадите три файла:

  • circle.h: Declare структуру Circle с единственным членом double radius. Также Declare два вспомогательных метода:
    • circle_area: принимает указатель const на Circle и возвращает area
    • circle_circumference: принимает указатель const на Circle и возвращает circumference
    Используйте include guards с символом CIRCLE_H.
  • circle.c: Implement оба вспомогательных метода. Для вычислений используйте 3.14159 в качестве значения числа пи. Формула area — pi * radius * radius, а формула circumference — 2 * pi * radius. Обе функции должны only читать radius: никогда не изменяйте его.
  • main.c: Create Circle и используйте вспомогательные методы, чтобы вычислить и отобразить его свойства.

Вы получите одни входные данные: radius окружности (как double).

В основном файле инициализируйте Circle с given radius, затем используйте вспомогательные методы, чтобы вычислить и вывести area и circumference.

Выведите results в следующем формате:

Area: {area}
Circumference: {circumference}

Используйте %.2f для обоих значений, чтобы отображать два знака после десятичной точки.

Например, при radius, равном 5.0, вывод будет таким:

Area: 78.54
Circumference: 31.42

Попробуйте сами

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

int main() {
    double radius;
    scanf("%lf", &radius);
    
    // TODO: Создайте структуру Circle с заданным радиусом
    
    // TODO: Use circle_area and circle_circumference helper methods
    // чтобы вычислить и вывести результаты
    
    // Формат вывода:
    // printf("Area: %.2f\n", ...);
    // printf("Circumference: %.2f\n", ...);
    
    return 0;
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор C