1. 程式人生 > >第14周 專案二 oj虛擬函式計算圖形面積

第14周 專案二 oj虛擬函式計算圖形面積

/*
*程式的版權和版本宣告部分:
*Copyright(c)2014,煙臺大學計算機學院學生
*All rights reserved.
*檔名稱:
*作者:王魯峰
*完成日期:2014 年 5 月 27 日
*版本號:v1.0
*對任務及求解方法的描述部分:
*問題描述:編寫一個程式,定義抽象基類Shape,由它派生出5個派生類:Circle、Square、Rectangle、Trapezoid、Triangle
           用虛擬函式分別計算幾種圖形面積,並求它們之和。
           要求用基類指標陣列,使它每一個元素指向一個派生類物件。
*輸入描述: Input
           圓的半徑
           正方形的邊長
           矩形的邊長
           梯形的上底和下底,高
           三角形的底與高
*程式輸出:Output
           所有圖形面積之和(結果保留兩位小數)
*問題分析:
*演算法設計:
*/
#include <iostream>
#include <iomanip>
using namespace std;
class Shape
{
public:
    virtual double area()=0;
};
class Circle:public Shape
{
public:
    Circle(double R):r(R) {}
    double area();
private:
    double r;
};
class Square:public Shape
{
public:
    Square(double a1):a(a1) {}
    double area();
private:
    double a;
};
class Rectangle:public Shape
{
public:
    Rectangle(double l,double w):length(l),width(w) {}
    double area();
private:
    double length,width;
};
class Trapezoid:public Shape
{
public:
    Trapezoid(double l,double w,double h):length(l),width(w),high(h) {} //分別代表上底下底還有高
    double area();
private:
    double length,width,high;
};
class Triangle:public Shape
{
public:
    Triangle(double l,double h):length(l),high(h) {}
    double area();
private:
    double length,high;//分別代表底高
};
double Circle::area()
{
    double s;
    s=3.1415926*r*r;
    return s;
}
double Square::area()
{
    double s;
    s=a*a;
    return s;
}
double Rectangle::area()
{
    double s;
    s=length*width;
    return s;
}
double Trapezoid::area()
{
    double s;
    s=(length+width)*high/2;
    return s;
}
double Triangle::area()
{
    double s;
    s=length*high/2;
    return s;
}
int main()
{


    float r,a,b,w1,w2,w,h;


    cout<<fixed<<setprecision(2);


    cin>>r;


    Circle circle(r);


    cin>>a;


    Square square(a);


    cin>>a>>b;


    Rectangle rectangle(a,b);


    cin>>w1>>w2>>h;


    Trapezoid trapezoid(w1,w1,h);


    cin>>w>>h;


    Triangle triangle(w,h);


    Shape *pt[5]= {&circle,&square,&rectangle,&trapezoid,&triangle};


    double areas=0.0;


    for(int i=0; i<5; i++)


        areas=areas+pt[i]->area();


    cout<<"total of all areas="<<areas<<endl;


    return 0;


}

執行結果:

心得體會:

  一開始計算出來的面積是573.86,我以為是程式寫錯了,後來發現是PI定義的問題,應該定義成3.1415926.。。。