Menu
Coddy logo textTech

Powtórka: tajemnicze pudełko

Część sekcji Programowanie obiektowe ścieżki C w Coddy. Lekcja 21 z 61.

challenge icon

Wyzwanie

Łatwy

Zbudujmy moduł Box, który demonstruje pełną enkapsulację. Twój box będzie miał trzy ukryte wymiary: width, height i depth, do których można uzyskać dostęp wyłącznie za pomocą udostępnionych przez Ciebie funkcji. Oto wzorzec nieprzezroczystego wskaźnika w praktyce!

Utworzysz trzy pliki:

  • box.h: Twój publiczny interfejs. Zadeklaruj nieprzezroczysty typ Box, używając wyłącznie deklaracji wstępnej: treść struktury pozostaje ukryta. Zadeklaruj następujące funkcje:
    • create_box: przyjmuje trzy liczby całkowite (width, height, depth) i zwraca wskaźnik do Box
    • destroy_box: zwalnia zaalokowaną pamięć
    • get_volume: przyjmuje const Box * i zwraca objętość (width × height × depth)
    • set_dimensions: przyjmuje wskaźnik do Box i trzy nowe wartości wymiarów, zwraca int (1 w przypadku powodzenia, 0, jeśli którykolwiek wymiar jest ujemny lub równy zero)
    Użyj strażników nagłówka z symbolem BOX_H.
  • box.c: Zdefiniuj właściwą struct Box z trzema ukrytymi składowymi: int width, int height i int depth. Zaimplementuj wszystkie cztery funkcje. Konstruktor powinien alokować pamięć na box i go inicjalizować. Funkcja set_dimensions musi sprawdzić, czy wszystkie trzy wartości są dodatnie (większe od zera), zanim wprowadzi zmiany; jeśli którakolwiek wartość nie przejdzie walidacji, odrzuć całą aktualizację i zwróć 0.
  • main.c: Zademonstruj działanie enkapsulowanego Box, tworząc go, sprawdzając jego objętość, próbując zmienić wymiary (zarówno poprawnie, jak i niepoprawnie) oraz prawidłowo zwalniając zasoby.

Otrzymasz pięć danych wejściowych: początkową szerokość, początkową wysokość, początkową głębokość, a następnie trzy nowe wymiary, których ustawienia należy spróbować (mogą zawierać nieprawidłowe wartości).

W pliku main utwórz Box z początkowymi wymiarami i wypisz jego objętość. Następnie spróbuj ustawić nowe wymiary: wypisz, czy aktualizacja się powiodła, oraz wynikową objętość. Na koniec zwolnij box i potwierdź posprzątanie.

Wypisz wynik w następującym formacie:

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

Na przykład dla danych wejściowych 2, 3, 4, 5, 5, 5 wynik będzie następujący:

Volume: 24
Set: 1
Volume: 125
Destroyed

Dla danych wejściowych 2, 3, 4, -1, 5, 5 wynik będzie następujący:

Volume: 24
Set: 0
Volume: 24
Destroyed

Zwróć uwagę, jak walidacja w set_dimensions chroni Twój box przed nieprawidłowymi stanami: kod zewnętrzny nie może ominąć Twoich reguł, ponieważ wymiary są całkowicie ukryte za interfejsem.

Spróbuj swoich sił

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

int main() {
    // Wczytaj początkowe wymiary
    int width, height, depth;
    scanf("%d", &width);
    scanf("%d", &height);
    scanf("%d", &depth);
    
    // Wczytaj nowe wymiary, które zostaną wypróbowane
    int new_w, new_h, new_d;
    scanf("%d", &new_w);
    scanf("%d", &new_h);
    scanf("%d", &new_d);
    
    // TODO: Utwórz obiekt Box o początkowych wymiarach
    
    
    // TODO: Wypisz początkową objętość w formacie: "Volume: {volume}"
    
    
    // TODO: Spróbuj ustawić nowe wymiary i zapisz wynik
    
    
    // TODO: Wypisz, czy ustawienie się powiodło, w formacie: "Set: {0 or 1}"
    
    
    // TODO: Wypisz wynikową objętość w formacie: "Volume: {volume}"
    
    
    // TODO: Zniszcz obiekt Box i wypisz "Destroyed"
    
    
    return 0;
}

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator C online