ソフトウェア演習Ⅱ〔課題 4:クラス継承と仮想関数〕

ソフトウェア演習Ⅱ〔課題 4:クラス継承と仮想関数〕青野雅樹
以下の問題に対する解答を、C++言語での以下のプログラム群
Shape.h(基底クラス、メンバ関数は含めても別に Shape.cpp を用意しても可)
Polygon.h(派生クラス定義、メンバ関数は含めても別に Polygon.cpp を用意しても可)
Circle.h(派生クラス定義、メンバ関数は含めても別に Circle.cpp を用意しても可)
ShapeMain.cpp(main 関数等)
を作成し,実行結果(kadai4.ps)をつけて Moodle にアップロードせよ。なお、必要に応
じて、これ以外のプログラムを用意するのは自由である。動作締め切りは 7 月 10 日(月)
までとする。できたら、提出物は ZIP 等でアーカイブすること。
① Shape(2 次元図形)クラスを名前 Shape.h で基底クラスとして作成し、その中に純
粋仮想関数として面積計算する area 関数と、図形の周囲長を計算する perimeter 関
数と、PostScript 形式でプリントする print 関数を用意せよ。ほかに、色(R,G,B)を
double 型で private 領域に保持せよ。さらに public な関数で getR(), getG(), getB()
を用意すること。いずれも double 型を返す関数とする。
② Polygon クラスを名前 Polygon.h で Shape クラスの派生クラスとして作成せよ。
③ Circle クラスを名前 Circle.h で Shape クラスの派生クラスとして作成せよ。
④ main 関数を含む ShapeMain.cpp を作成し、多角形と円を合計 N 個(3<=N<=30)
(位置や大きさを)ランダムに発生させ、最後に、Shape クラスのプリント関数(print
関数)ならびに area 関数と perimeter 関数を呼んで、発生させた図形の総面積と総
長を PostScript 内(末尾)にプリントせよ。また、PostScript の出だしにコメント
で、氏名と学籍番号もコメントとして出力すること。
【コメントとヒント】
PostScript に発生する図形に関して、3≤N≤30, 0≤R,G,B ≤1.0, 0<x<580.0, 0<y<700.0 と
してください。円の中心座標は(x,y)に準じてください。半径も x 値に準じてください。多角
形の辺の数は3~10の間で、ランダムに発生させてください。
今回の課題の要点は、クラスの継承とポリモルフィズム(仮想関数を通しての関数のオー
バーライド)です。Shape クラスは基底クラス(スーパークラス)と呼ばれ、これを継承す
る Polygon クラス、Circle クラスを派生クラス(サブクラス)と呼びます。基底クラスで
宣言された純粋仮想関数(area 関数, perimeter 関数, ならびに print 関数)を、派生クラ
スで同じ型、同じ引数、同じ名前の関数として定義して使います。実際、たとえば面積の計
算は図形によって異なりますが、アクセスする場合は、いずれも area()関数を呼び出せばい
いことになります。PostScript での円の出力は、以下のように x y
r
0 360 arc の
行(stroke の直前の行)が円を定義しており、(x,y) は円の中心座標で r が半径を表します。
%%円
0.1 0.2 0.91 setrgbcolor
newpath
151.0 400.1 124.5 0 360
stroke
arc
多角形の描画は、出だしの色と最後の stroke は円と同じで、違うのは、まず最初の頂点
に x y moveto で移動し、以降、x y lineto で線分を結ぶことで行います。なお、最後に
closepath で図形を閉じてください。辺と辺がクロスしても結構です。詳細は、後述のサン
プルを参照してください。
周囲長は、円が 2 r で、多角形は任意の隣接する 2 頂点をユークリッド距離で計算した
総和を多角形ごとに計算してください。
1 n 1
 xi yi 1  xi 1 yi で計算できます。ただし、xn  x0 で
2 i 0
yn  y0 。正負の値があり得ますので、最終的な総和が負の場合もあります。n  8 の場合は
多角形の符号付き面積は、 Area 
次頁の図のように、左回りに頂点を定義したときに正となる量です。
以下は、出力される PostScript ファイル(kadai4.ps)の例です(一部のみ)
%%!PS-Adobe-2.0
%%File: kadai4.ps
%%Author: 青野
雅樹: 01162069
%%1番目の図形は円です
%% 円:面積
= 1201.81
%% 円:周囲長 = 122.892
0.0491955 0.132967 0.221833 setrgbcolor
newpath
24.8572 313.589 19.5589 0 360 arc
stroke
%%2番目の図形は4角形です
%% 多角形:符号付面積
= 58302.3
%% 多角形:周囲長 = 1717.74
0.039378 0.268526 0.973954 setrgbcolor
newpath
17.7338
396.943 moveto
122.603
551.555 lineto
308.191
24.4174 lineto
( x6 , y6 )
489.42 482.546 lineto
17.7338
396.943 lineto
( x7 , y7 )
( x5 , y5 )
closepath
stroke
…..(N個の図形)
( x0 , y0 )
( x4 , y4 )
( x1 , y1 )
( x3 , y3 )
%% 総面積は 54.5787です。
%% 総長は 40854.6です
showpage
( x2 , y2 )
PostScript(kadai4.ps)の可視化例です。Macではそのまま可視化できます。Windows
では、Acrobatやフリーのps2pdf等でPDFに変換してから確認するといいでしょう。