#include <stdio.h>
#include <stdlib.h>
#include <math.h>
// Define a base class Shape (abstract class)
typedef struct {
double (*area)(void*);
double (*perimeter)(void*);
} Shape;
// Circle struct and methods
typedef struct {
Shape base;
double radius;
} Circle;
double circle_area(void* c) {
Circle* circle = (Circle*)c;
return M_PI * circle->radius * circle->radius;
}
double circle_perimeter(void* c) {
Circle* circle = (Circle*)c;
return 2 * M_PI * circle->radius;
}
Circle* create_circle(double radius) {
Circle* circle = (Circle*)malloc(sizeof(Circle));
if (circle == NULL) {
perror("Failed to allocate memory for circle");
exit(EXIT_FAILURE);
}
circle->base.area = circle_area;
circle->base.perimeter = circle_perimeter;
circle->radius = radius;
return circle;
}
// Square struct and methods
typedef struct {
Shape base;
double side;
} Square;
double square_area(void* s) {
Square* square = (Square*)s;
return square->side * square->side;
}
double square_perimeter(void* s) {
Square* square = (Square*)s;
return 4 * square->side;
}
Square* create_square(double side) {
Square* square = (Square*)malloc(sizeof(Square));
if (square == NULL) {
perror("Failed to allocate memory for square");
exit(EXIT_FAILURE);
}
square->base.area = square_area;
square->base.perimeter = square_perimeter;
square->side = side;
return square;
}
// Triangle struct and methods
typedef struct {
Shape base;
double side1;
double side2;
double side3;
} Triangle;
double triangle_area(void* t) {
Triangle* triangle = (Triangle*)t;
double s = (triangle->side1 + triangle->side2 + triangle->side3) / 2.0;
return sqrt(s * (s - triangle->side1) * (s - triangle->side2) * (s - triangle->side3));
}
double triangle_perimeter(void* t) {
Triangle* triangle = (Triangle*)t;
return triangle->side1 + triangle->side2 + triangle->side3;
}
Triangle* create_triangle(double side1, double side2, double side3) {
Triangle* triangle = (Triangle*)malloc(sizeof(Triangle));
if (triangle == NULL) {
perror("Failed to allocate memory for triangle");
exit(EXIT_FAILURE);
}
triangle->base.area = triangle_area;
triangle->base.perimeter = triangle_perimeter;
triangle->side1 = side1;
triangle->side2 = side2;
triangle->side3 = side3;
return triangle;
}
// Main function
int main() {
// Create shape objects
Circle* circle = create_circle(5.0);
Square* square = create_square(4.0);
Triangle* triangle = create_triangle(3.0, 4.0, 5.0);
// Calculate and print areas and perimeters
printf("Circle Area: %.2f, Perimeter: %.2f\n", circle->base.area(circle), circle->base.perimeter(circle));
printf("Square Area: %.2f, Perimeter: %.2f\n", square->base.area(square), square->base.perimeter(square));
printf("Triangle Area: %.2f, Perimeter: %.2f\n", triangle->base.area(triangle), triangle->base.perimeter(triangle));
// Free allocated memory
free(circle);
free(square);
free(triangle);
return 0;
}