第14周 專案二 oj虛擬函式計算圖形面積
阿新 • • 發佈:2019-01-30
/* *程式的版權和版本宣告部分: *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.。。。