Menu
Coddy logo textTech

Реализация круга

Часть раздела Object Oriented Programming путешествия по C на Coddy — урок 45 из 61.

challenge icon

Задание

Легко

Давайте продолжим создание проекта Shape Drawer, реализовав Circle — конкретную фигуру, которая встраивает базовую структуру Shape и предоставляет собственную логику рисования и вычисления площади.

Опираясь на фундамент предыдущего урока, вы расширите свой проект следующими файлами:

  • shape.h: Сохраните ваш базовый интерфейс Shape из предыдущего урока с типами указателей на функции DrawFunc и AreaFunc.
  • circle.h: Определите здесь структуру Circle. Круг встраивает Shape в качестве своего первого члена (что позволяет использовать правило первого члена для восходящего приведения типов) и добавляет поле radius типа double. Объявите функцию-конструктор create_circle, которая принимает радиус и возвращает Circle по значению.
  • circle.c: Реализуйте здесь специфичное для круга поведение:
    • draw_circle — выводит Drawing Circle with radius: X.XX (радиус отображается с 2 знаками после запятой)
    • area_circle — возвращает π × radius² (используйте 3.14159 для π)
    • create_circle — инициализирует Circle, связывает указатели на функции встроенной Shape с draw_circle и area_circle, устанавливает радиус и возвращает круг
  • main.c: Соберите всё вместе. Считайте значение радиуса из входных данных, создайте круг с помощью конструктора, затем вызовите draw и area через указатели на функции встроенной Shape. Выведите площадь с 2 знаками после запятой.

Ваша программа получит один входной параметр: значение radius (в виде числа с плавающей точкой).

Пример вывода, когда входное значение равно 5.0:

Drawing Circle with radius: 5.00
Area: 78.54

Пример вывода, когда входное значение равно 3.5:

Drawing Circle with radius: 3.50
Area: 38.48

Ключевая идея заключается в том, что Circle содержит Shape в качестве своего первого члена, поэтому вы можете получить доступ к указателям на функции через circle.base.draw и circle.base.area (или как бы вы ни назвали встроенный член). При вызове этих функций передавайте указатель на член Shape. Не забудьте использовать include guards во всех заголовочных файлах.

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

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

int main() {
    double radius;
    scanf("%lf", &radius);
    
    // TODO: Создать Circle, используя create_circle
    
    // TODO: Вызвать draw через указатель на функцию встроенной структуры Shape
    
    // TODO: Вызвать area через указатель на функцию встроенной структуры Shape
    // и вывести результат с 2 знаками после запятой: "Area: %.2f\n"
    
    return 0;
}

Все уроки раздела Object Oriented Programming