// Description: Macros to calculate the perimeter (distance around)
//              of six two-dimensional shapes.
//
// Shapes covered:
//   a. Triangle
//   b. Square
//   c. Rectangle
//   d. Quadrilateral
//   e. Circle
//   f. Sector
//
//**************************************************************

#include <stdio.h>

// PI constant used for circle and sector calculations
#define PI 3.14159265358979323846

//**************************************************************
// Perimeter Macros
//
// a. Triangle
//    Perimeter = sum of all three sides
//    Parameters: a, b, c (lengths of the three sides)
//
// b. Square
//    Perimeter = 4 times the length of one side
//    Parameters: s (side length)
//
// c. Rectangle
//    Perimeter = 2 times (length + width)
//    Parameters: l (length), w (width)
//
// d. Quadrilateral
//    Perimeter = sum of all four sides
//    Parameters: a, b, c, d (lengths of the four sides)
//
// e. Circle  (circumference)
//    Perimeter = 2 * PI * radius
//    Parameters: r (radius)
//
// f. Sector
//    Perimeter = 2 * radius + arc length
//             = 2r + (theta * r)
//             = r * (2 + theta)
//    Parameters: r (radius), theta (central angle in RADIANS)
//
//**************************************************************

#define PERIMETER_TRIANGLE(a, b, c)          ((a) + (b) + (c))
#define PERIMETER_SQUARE(s)                  (4 * (s))
#define PERIMETER_RECTANGLE(l, w)            (2 * ((l) + (w)))
#define PERIMETER_QUADRILATERAL(a, b, c, d)  ((a) + (b) + (c) + (d))
#define PERIMETER_CIRCLE(r)                  (2 * PI * (r))
#define PERIMETER_SECTOR(r, theta)           ((r) * (2 + (theta)))


//**************************************************************
// main - tests each macro with sample values
//**************************************************************

int main ()
{
    // --- a. Triangle ---
    // sides: 3, 4, 5  =>  expected: 12
    printf("a. Triangle Perimeter       : %.2f\n",
           (double) PERIMETER_TRIANGLE(3, 4, 5));

    // --- b. Square ---
    // side: 5  =>  expected: 20
    printf("b. Square Perimeter         : %.2f\n",
           (double) PERIMETER_SQUARE(5));

    // --- c. Rectangle ---
    // length: 8, width: 3  =>  expected: 22
    printf("c. Rectangle Perimeter      : %.2f\n",
           (double) PERIMETER_RECTANGLE(8, 3));

    // --- d. Quadrilateral ---
    // sides: 4, 6, 5, 7  =>  expected: 22
    printf("d. Quadrilateral Perimeter  : %.2f\n",
           (double) PERIMETER_QUADRILATERAL(4, 6, 5, 7));

    // --- e. Circle ---
    // radius: 7  =>  expected: 2 * PI * 7 = 43.98
    printf("e. Circle Perimeter         : %.2f\n",
           PERIMETER_CIRCLE(7.0));

    // --- f. Sector ---
    // radius: 5, theta: PI/3 (60 degrees)
    // expected: 5 * (2 + PI/3) = 5 * 3.0472 = 15.24
    printf("f. Sector Perimeter         : %.2f\n",
           PERIMETER_SECTOR(5.0, PI / 3));

    return 0;

} // main