//C语言实现面向对象,细节暂不做修改,简单易懂
#include <stdio.h>
#include <stdlib.h>
#define PI (3.14)

typedef struct shape {      //shape基类
    int x;
    int y;
} shape_t;

typedef struct Rectangle {  //矩形类
    const struct Rectangle* this;
    shape_t point;
    int (*GetArea)(const struct Rectangle*);
} rect_t;

typedef struct Circle {     //圆形类
    const struct Circle* this;
    shape_t point;
    double (*GetArea)(const struct Circle*);
} circ_t;

typedef struct Square {     //正方形类
    const struct Square* this;
    rect_t rect;
    int (*GetArea)(const struct Square*);
} squa_t;

int getRectArea(const struct Rectangle* this) {
    return this->point.x * this->point.y;
}

double getCircArea(const struct Circle* this) {
    return PI * this->point.x * this->point.x;
}

int getSquaArea(const struct Square* this) {
    return this->rect.point.x * this->rect.point.x;
}

int main() {
    rect_t rect = {
        .this = &rect,
        .GetArea = getRectArea
    };
    scanf("%d %d", &rect.point.x, &rect.point.y);
    circ_t circ = {
        .this = &circ,
        .point.y = 0,
        .GetArea = getCircArea
    };
    scanf("%d", &circ.point.x);
    squa_t squa = {
        .this = &squa,
        .rect.point.y = 0,
        .GetArea = getSquaArea
    };
    scanf("%d", &squa.rect.point.x);
    int rectArea = rect.GetArea(&rect);
    double circArea = circ.GetArea(&circ);
    int squaArea = squa.GetArea(&squa);
    printf("%d\n", rectArea);
    printf("%g\n", circArea);
    printf("%d\n", squaArea);
    return 0;
}