Menu
Coddy logo textTech

Итоги: Секретный ящик

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

challenge icon

Задание

Легко

Давайте создадим модуль Box, демонстрирующий полную инкапсуляцию. Ваш блок будет иметь три скрытых измерения — width, height и depth, — доступ к которым можно получить только через предоставленные вами функции. Это полный шаблон непрозрачного указателя в действии!

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

  • box.h: ваш публичный интерфейс. Объявите непрозрачный тип Box, используя только предварительное объявление: тело структуры должно оставаться скрытым. Объявите следующие функции:
    • create_box: принимает три целых числа (width, height, depth) и возвращает указатель на Box
    • destroy_box: освобождает выделенную память
    • get_volume: принимает const Box * и возвращает объём (width × height × depth)
    • set_dimensions: принимает указатель на Box и три новых значения измерений, возвращает int (1 при успехе, 0, если какое-либо измерение отрицательно или равно нулю)
    Используйте защиту от повторного включения с символом BOX_H.
  • box.c: определите фактическую struct Box с тремя скрытыми членами: int width, int height и int depth. Реализуйте все четыре функции. Ваш конструктор должен выделять память и инициализировать блок. Функция set_dimensions должна проверять, что все три значения положительны (больше нуля), прежде чем применять изменения; если какое-либо значение не проходит проверку, отклоните всё обновление и верните 0.
  • main.c: продемонстрируйте работу инкапсулированного Box, создав его, проверив его объём, попытавшись изменить измерения (как допустимыми, так и недопустимыми значениями), а затем корректно освободив ресурсы.

Вы получите пять входных значений: начальную ширину, начальную высоту, начальную глубину, а затем три новых измерения, которые нужно попытаться установить (они могут содержать недопустимые значения).

В основном файле создайте Box с начальными измерениями и выведите его объём. Затем попытайтесь установить новые измерения: выведите, успешно ли выполнено обновление, и получившийся объём. Наконец, освободите Box и подтвердите очистку.

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

Volume: {volume}
Set: {0 or 1}
Volume: {volume}
Destroyed

Например, при входных значениях 2, 3, 4, 5, 5, 5 результат будет таким:

Volume: 24
Set: 1
Volume: 125
Destroyed

При входных значениях 2, 3, 4, -1, 5, 5 результат будет таким:

Volume: 24
Set: 0
Volume: 24
Destroyed

Обратите внимание, как проверка в set_dimensions защищает ваш Box от недопустимых состояний: внешний код не может обойти ваши правила, поскольку измерения полностью скрыты за вашим интерфейсом.

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

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

int main() {
    // Прочитать начальные размеры
    int width, height, depth;
    scanf("%d", &width);
    scanf("%d", &height);
    scanf("%d", &depth);
    
    // Прочитать новые размеры для попытки
    int new_w, new_h, new_d;
    scanf("%d", &new_w);
    scanf("%d", &new_h);
    scanf("%d", &new_d);
    
    // TODO: Создать Box с начальными размерами
    
    
    // TODO: Вывести начальный объём в формате: "Volume: {volume}"
    
    
    // TODO: Попытаться установить новые размеры и сохранить результат
    
    
    // TODO: Вывести, удалась ли установка, в формате: "Set: {0 or 1}"
    
    
    // TODO: Вывести получившийся объём в формате: "Volume: {volume}"
    
    
    // TODO: Уничтожить box и вывести "Destroyed"
    
    
    return 0;
}

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

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