類別和繼承程式語言的問題

請使用C++撰寫三個類別(class):shape(形狀)、circle(圓形)與rectangle(矩形),

其中shape為抽象類別(abstract class),而circle與rectangle為衍生類別(derived class),均繼承shape。

請在shape中定義兩個介面(interface),

分別作為運算週長(circumference)與面積(area)的介面,

並在circle與rectangle中分別實作其功能。

此題可以用C語言寫嗎?怎麼寫呢?

已更新項目:

因為題目是問說請使用C++撰寫

但我對C語言比較熟練,所以才問可否用C語言撰寫

5 個解答

評分
  • 卸貨
    Lv 5
    6 年前
    最佳解答

    用 C 嗎?可以呀,只怕你看不懂!

    static const float PI = 3.14159265;

    /* Shape */

    typedef struct shape_t;

    typedef float (*circumference_t)(const struct shape_t *obj);

    typedef float (*area_t)(const struct shape_t *obj);

    typedef struct shape_t

    {

    circumference_t circumference;

    area_t area;

    } shape_t;

    /* Circle */

    typedef struct circle_t

    {

    shape_t base;

    float diameter;

    } circle_t;

    float circle_circumference(const circle_t *obj)

    {

    return PI * obj->diameter;

    }

    float circle_area(const circle_t *obj)

    {

    return 0.25 * PI * obj->diameter * obj->diameter;

    }

    void circle_init(circle_t *obj, float diameter)

    {

    obj->base.circumference = circle_circumference;

    obj->base.area = circle_area;

    obj->diameter = meter;

    }

    /* Rectangle */

    typedef struct rectangle_t

    {

    shape_t base;

    float width;

    float height;

    } rectangle_t;

    float rectangle_circumference(const rectangle_t *obj)

    {

    return 2*( obj->width + obj->height );

    }

    float rectangle_area(const rectangle_t *obj)

    {

    return obj->width * obj->height;

    }

    void rectangle_init(rectangle_t *obj, float width, float height)

    {

    obj->base.circumference = rectangle_circumference;

    obj->base.area = rectangle_area;

    obj->width = width;

    obj->height = height;

    }

    /* Example to use */

    #include < stdio.h >

    void main(void)

    {

    shape_t circle, rectangle;

    circle_init(&circle, 7);

    rectangle_init(&rectangle, 3, 5);

    printf("circle diameter = %f\n", circle.diameter);

    printf("circle circumference = %f\n", circle.circumference(&circle));

    printf("circle area = %f\n", circle.area(&circle));

    printf("rectangle width = %d\n", rectangle.width);

    printf("rectangle height = %d\n", rectangle.height);

    printf("rectangle circumference = %f\n", rectangle.circumference(&rectangle));

    printf("rectangle area = %f\n", rectangle.area(&rectangle));

    return 0;

    }

    2013-12-06 15:32:44 補充:

    不好意思,大概一陣子沒寫程式了,上面的程式碼是有大問題的,雖然有表達到我要表達的東西。我把重新寫過測試過的程式碼重新貼上,但因為字數很多,所以慢慢貼,真貼不完的話我就寄到版主信箱。

    2013-12-06 15:33:05 補充:

    #include

    #include

    static const float PI = 3.14159265;

    /* Shape */

    struct shape_t;

    typedef void (*release_fn) (const struct shape_t *obj);

    typedef float (*circumference_fn)(const struct shape_t *obj);

    typedef float (*area_fn) (const struct shape_t *obj);

    2013-12-06 15:33:52 補充:

    typedef struct shape_t

    {

    release_fn release;

    circumference_fn circumference;

    area_fn area;

    } shape_t;

    /* Circle */

    typedef struct circle_t

    {

    shape_t base;

    float diameter;

    } circle_t;

    2013-12-06 15:34:16 補充:

    float circle_circumference(const circle_t *obj)

    {

    return PI * obj->diameter;

    }

    float circle_area(const circle_t *obj)

    {

    return 0.25 * PI * obj->diameter * obj->diameter;

    }

    void circle_release(circle_t *obj)

    {

    free(obj);

    }

    2013-12-06 15:34:45 補充:

    shape_t* circle_create(float diameter)

    {

    circle_t *obj = malloc(sizeof(circle_t));

    obj->base.release = (release_fn) circle_release;

    obj->base.circumference = (circumference_fn) circle_circumference;

    obj->base.area = (area_fn) circle_area;

    2013-12-06 15:35:09 補充:

    obj->diameter = diameter;

    return (shape_t*)obj;

    }

    /* Rectangle */

    typedef struct rectangle_t

    {

    shape_t base;

    float width;

    float height;

    } rectangle_t;

    float rectangle_circumference(const rectangle_t *obj)

    {

    return 2*( obj->width + obj->height );

    }

    2013-12-06 15:35:34 補充:

    float rectangle_area(const rectangle_t *obj)

    {

    return obj->width * obj->height;

    }

    void rectangle_release(rectangle_t *obj)

    {

    free(obj);

    }

    shape_t* rectangle_create(float width, float height)

    {

    rectangle_t *obj = malloc(sizeof(rectangle_t));

    2013-12-06 15:36:23 補充:

    obj->base.release = (release_fn) rectangle_release;

    obj->base.circumference = (circumference_fn) rectangle_circumference;

    obj->base.area = (area_fn) rectangle_area;

    obj->width = width;

    obj->height = height;

    return (shape_t*)obj;

    }

    2013-12-06 15:36:59 補充:

    /* Example to use */

    int main(void)

    {

    shape_t *circle = circle_create(7);

    shape_t *rectangle = rectangle_create(3,5);

    printf("circle circumference = %f\n", circle->circumference(circle));

    printf("circle area = %f\n", circle->area(circle));

    2013-12-06 15:37:25 補充:

    printf("rectangle circumference = %f\n", rectangle->circumference(rectangle));

    printf("rectangle area = %f\n", rectangle->area(rectangle));

    circle->release(circle);

    rectangle->release(rectangle);

    return 0;

    }

    2013-12-07 00:15:59 補充:

    其實版主的發問也很矛盾,一開始說「請用 C++ 撰寫...」,最後又說「這題可以用 C 來寫嗎?」

  • 匿名使用者
    6 年前

    台灣首家合法娛樂城開幕囉!

    體育博彩、真人對戰、現場遊戲、彩球

    投注高賠率,歡迎您來體驗!

    官方網站 aa777.net

    2013-12-18 18:09:48 補充:

    台灣首家合法娛樂城開幕囉!

    體育博彩、真人對戰、現場遊戲、彩球

    投注高賠率,歡迎您來體驗!

    官方網站 aa777.net

  • Tai
    Lv 5
    6 年前

    版主這是 C++ 題目, 就是要你練習 C++ 抽象類別(abstract class),衍生類別(derived class),介面(interface),你不能用 C 撰寫,這是兩碼子事情。

    UFO 兄辛苦了,但不對題,也可以說是被版主誤導了。

  • 阿明
    Lv 5
    6 年前

    有學過C語言嗎? C語言只有結構, 沒有這些東東 , 類別(class), 抽象類別(abstract class), 衍生類別(derived class)這些C++才有,C語言你要怎麼寫

    2013-12-06 18:15:10 補充:

    A TK UE 2AEO OR UFO 大大 很熱心幫他寫,沒錯C++的類別(class)是由C語言的 結構struct演化的,你沒看清楚,版主是要C++撰寫三個類別,都繼承抽象的形狀類別,寫這程式目的,應該是學校要他們瞭解C++各種類別繼承的關係及衍生類別型態,跟你用C語言的struct還是有差異,你沒等版主說清楚,不曉得他能不用

  • 您覺得這個回答如何?您可以登入為回答投票。
  • 6 年前

    題目都已經叫你"請使用C++撰寫".

還有問題?馬上發問,尋求解答。