- 註冊時間
- 2012-7-22
- 最後登錄
- 2012-7-28
- 主題
- 查看
- 積分
- 94
- 閱讀權限
- 30
- 文章
- 59
- 相冊
- 0
- 日誌
- 0
![Rank: 3](static/image/common/star_level2.gif) ![Rank: 3](static/image/common/star_level1.gif)
狀態︰
離線
|
如果 計算 圖形面積 的函數 均有相同的架構如:
int LineArea(struct linesegment *L);
int TriangleArea(struct triangle *T);
int RectArea(struct rectangle *R);
int EllipseArea(struct ellipse *E);
int DiskArea(struct circle *C);
int PolygonArea(struct polygon *P);
我們可 設計 一函數 指標陣列 如下:
int (*fparray[FIGURESIZE])( void *);
註:
假設 FIGURESIZE 為 6。
由 int (*fp)( void *) 知 fp 為一函數指標,
因此, int( *fparray[6])( void *); 其中 fparray[6] 為 一陣列含 6 個分量, 每個 分量 都是 一函數 指標, 其 型態 即 為 fp 函數指標 的型態。
再由第 7.5 節的 Figure 與 node 的 資料型態,設 nodeList 表一 node 指向一平面 圖形, 今欲 計算 這些 圖形總面積, 我們可利用 下列 方法來計算。 令
fparray[0] = LineArea;
fparray[1] = TriangleArea;
fparray[2] = RectArea;
fparray[3] = DiskArea;
fparray[4] = EllipseArea;
fparray[5] = PolygonArea;
定義一 變數 pNode 及 totalArea 為
struct node *pNode;
int totalArea=0
再以 迴圈的方式 traverse 整個 linked-list nodeList,分別 取得圖形 並 呼叫 ComputeArea 以 取得 其面積。
pNode=nodeList;
while ( pNode != NULL)
{ totalArea = totalArea +
ComputeArea(&(pNode->aLine), fparray[ pNode->figure]);
pNode=pNode->next;
}
註 1: 由 pNode->figure 而知 圖形的 種類, 至於是 pNode->aLine 或是 pNode->aTriangle 或是其他, 我們只要取得其地址即可, 因此,由 &(pNode->aLine) 統一取其地址即可。 (Why?)
註 2: 由呼叫 函數 ComputeArea 傳 函數參數 TriangleArea 等, 主要是要避免使用 switch 指令, 或許 程式可以變短, 但可能變得 較難懂。
|
|