Desenvolva um TAD para um esfera. Inclua as funções de inicializações necessárias e as operações que retornem seu raio, a sua área e o seu volume.
Passo 1
Enunciado: precisamos criar um TAD que represente uma esfera, permitindo inicializar seu raio e obter seu raio, sua área de superfície e seu volume. O conteúdo envolvido é definição de Tipo Abstrato de Dados (TAD), encapsulamento e aplicação das fórmulas geométricas:
e
.
Passo 2
Escolha de linguagem e encapsulamento: vamos usar C e definir um tipo opaco
Interface em
sphere_t
em sphere.h
, deixando a estrutura interna definida apenas em sphere.c
para garantir o encapsulamento.Interface em
sphere.h
: declaramos o tipo opaco e as funções públicas. Precisamos de: criação (sphere_create
), destruição (sphere_destroy
), acessor de raio (sphere_get_radius
), cálculo de área (sphere_get_area
) e cálculo de volume (sphere_get_volume
).Passo 3
Implementação em
Função de acesso ao raio:
sphere.c
: definimos struct sphere_t { double radius; };
. Em sphere_create(double radius)
, validamos radius >= 0
, alocamos memória e armazenamos o valor. Em sphere_destroy
, liberamos essa memória.Função de acesso ao raio:
double sphere_get_radius(const sphere_t *s)
retorna s->radius
(ou um valor de erro se s == NULL
).Passo 4
Cálculo da área: usamos a fórmula
em
double sphere_get_area(const sphere_t *s)
, obtendo primeiro o raio e depois aplicando a expressão.Passo 5
Cálculo do volume: usamos a fórmula
em
double sphere_get_volume(const sphere_t *s)
, obtendo raio e aplicando a expressão.Passo 6
Com essas definições, o TAD está completo: o usuário pode criar uma esfera, consultar seu raio, área e volume, e depois destruir o objeto.
Resposta
// sphere.h
#ifndef SPHERE_H
#define SPHERE_H
#ifndef SPHERE_H
#define SPHERE_H
typedef struct sphere_t sphere_t;
// Cria uma esfera com dado raio (retorna NULL se raio < 0 ou falha de alocação)
sphere_t *sphere_create(double radius);
// Destrói a esfera
void sphere_destroy(sphere_t *s);
// Retorna o raio da esfera (retorna valor negativo se s for NULL)
double sphere_get_radius(const sphere_t *s);
// Retorna a área de superfície da esfera
double sphere_get_area(const sphere_t *s);
// Retorna o volume da esfera
double sphere_get_volume(const sphere_t *s);
sphere_t *sphere_create(double radius);
// Destrói a esfera
void sphere_destroy(sphere_t *s);
// Retorna o raio da esfera (retorna valor negativo se s for NULL)
double sphere_get_radius(const sphere_t *s);
// Retorna a área de superfície da esfera
double sphere_get_area(const sphere_t *s);
// Retorna o volume da esfera
double sphere_get_volume(const sphere_t *s);
#endif // SPHERE_H
// sphere.c
#include <stdlib.h>
#include <math.h>
#include “sphere.h”
#include <stdlib.h>
#include <math.h>
#include “sphere.h”
struct sphere_t {
double radius;
};
double radius;
};
sphere_t *sphere_create(double radius) {
if (radius < 0) return NULL;
sphere_t *s = malloc(sizeof(sphere_t));
if (!s) return NULL;
s->radius = radius;
return s;
}
if (radius < 0) return NULL;
sphere_t *s = malloc(sizeof(sphere_t));
if (!s) return NULL;
s->radius = radius;
return s;
}
void sphere_destroy(sphere_t *s) {
free(s);
}
free(s);
}
double sphere_get_radius(const sphere_t *s) {
if (!s) return -1.0;
return s->radius;
}
if (!s) return -1.0;
return s->radius;
}
double sphere_get_area(const sphere_t *s) {
double r = sphere_get_radius(s);
return 4.0 * M_PI * r * r;
}
double r = sphere_get_radius(s);
return 4.0 * M_PI * r * r;
}
double sphere_get_volume(const sphere_t *s) {
double r = sphere_get_radius(s);
return (4.0/3.0) * M_PI * r * r * r;
}
double r = sphere_get_radius(s);
return (4.0/3.0) * M_PI * r * r * r;
}