#include <stdio.h>
#include <stdlib.h>

int generateRandom(void);
int larger(int, int);
int sqCalculator(int);

#define PI 3.14
#define MESSAGE() printf("This a function-like macro\n");
#define LOOP(x) for(int i =0; i < x; i++)\
                {\
                    printf("%d\n", i);\
                }
#define CIRCUMFERENCE(x) (2*PI*x)
#define SQ(x) ((x)*(x))
#define MAX(x, y) ((x) > (y) ? (x) : (y))

int main()
{
    printf("PI: %f\n", PI);
    MESSAGE()
    LOOP(3)
    printf("The max of %d and %d is %d\n\n", 4, 8, larger(4, 8));
    printf("The max of %d and %d is %d\n\n", 4, 8, MAX(4, 8));

    int x = 5;
    printf("Circumference of a circle with radius %d is %f\n\n", x, CIRCUMFERENCE(x));

    int r1 = 2;
    int r2 = 5;
    printf("Square of %d + %d using Macro is    %d\n", r1, r2, SQ(r1 + r2));
    printf("Square of %d + %d using function is %d\n\n", r1, r2, sqCalculator(r1 + r2));

    printf("Square using Macro is %d\n", (int)SQ(2.0) % 2);
    printf("Square using function is %d\n\n", sqCalculator(2.0) % 2);

    r1 = 2;
    r2 = 2;
    printf("Value of r1 before calling the function-like Macro: %d\n", r1);
    printf("Square of r1++ using Macro: sq: %d\n", SQ(r1++));
    printf("Value of r2 before calling the function: %d\n", r2);
    printf("Square of r2++ using function: %d\n\n", sqCalculator(r2++));

    // r1 = 2;
    // r2 = 2;
    // printf("Value of r1 before calling the function-like Macro: %d\n", r1);
    // printf("Square of ++r1 using Macro: sq: %d\n", SQ(++r1));
    // printf("Value of r2 before calling the function: %d\n", r2);
    // printf("Square of ++r2 using function: %d\n\n", sqCalculator(++r2));

    // printf("Square of the generated using Macro:    %d\n", SQ(generateRandom()));
    // printf("Square of the generated using function: %d\n\n", sqCalculator(generateRandom()));
    return 0;
}

int larger(int x, int y)
{
    return x>y ? x:y;
}

int sqCalculator(int number)
{
    return number * number;
}

int generateRandom()
{
    int lower=2, upper=10;
    int rnd = (rand() % (upper - lower + 1)) + lower;
    printf("Generated random number: %d\n", rnd );
    return rnd;
}