ソフトウェア演習Ⅱ〔課題 4:クラス継承と仮想関数〕青野雅樹 以下の問題に対する解答を、C++言語での以下のプログラム群 Shape.h(基底クラス、メンバ関数は含めても別に Shape.cpp を用意しても可) Polygon.h(派生クラス定義、メンバ関数は含めても別に Polygon.cpp を用意しても可) Circle.h(派生クラス定義、メンバ関数は含めても別に Circle.cpp を用意しても可) ShapeMain.cpp(main 関数等) を作成し,実行結果(kadai4.ps)をつけて Moodle にアップロードせよ。なお、必要に応 じて、これ以外のプログラムを用意するのは自由である。動作締め切りは 7 月 8 日(金) までとする。提出物は 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に変換してから確認するといいでしょう。
© Copyright 2024 Paperzz