Menu
Coddy logo textTech

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

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

challenge icon

Задание

Легко

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

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

  • shape.h: Сохраните интерфейс базовой Shape из предыдущего урока с типами указателей на функции DrawFunc и AreaFunc.
  • circle.h: Определите здесь структуру Circle. Круг встраивает Shape как свой first member (что позволяет применять правило first member для восходящего приведения типов) и добавляет поле radius типа double. Объявите функцию-конструктор create_circle, которая принимает радиус и возвращает значение типа Circle.
  • circle.c: Реализуйте здесь поведение, специфичное для круга:
    • draw_circle: выводит Drawing Circle with radius: X.XX (радиус отображается с 2 десятичными знаками)
    • area_circle: возвращает π × радиус² (используйте 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 в качестве своего first member, поэтому вы можете обращаться к указателям на функции через circle.base.draw и circle.base.area (или как бы вы ни назвали встроенный member). При вызове этих функций передавайте указатель на member Shape. Не забудьте использовать защиту от повторного включения во всех заголовочных файлах.

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

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

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

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