Lab4-1: Process an array of complex numbers

   
實習目標 由檔案讀取複數資料
使用 vector 物件記錄讀入的資料
使用 iterator 存取容器物件內資料物件
使用 sort 來依照每一個複數的大小 (絕對值) 來排序列印
   
步驟一 請另外產生一個 專案 (步驟請參考上一個實習的步驟二), 請 下載 實習 3-1, 把上次做的 Complex 類別拷貝過來, 就是把 Complex.h 和 Complex.cpp 兩個檔案拷貝過來, 然後請將這兩個檔案加入專案中。
步驟二 在 main() 函式中宣告一個 vector<Complex> 的容器物件, 寫一個
void readFile(vector<Complex> *pVector)
{
    ...
}
的函式由檔案 complex.dat 中讀取複數資料, complex.dat 中資料格式如下:
    2 3.2
    4.1 5
    6 7
    ...
    

每一列代表一個複數, 例如第一列代表 2 + 3.2 i

如果你讀檔案時發現奇怪的最後一列好像多讀一次的錯誤... 請參閱

步驟三 讀到的資料請設定到 Complex 類別的物件內, 並且存放到 vector 的容器物件中
步驟四 在 main() 中 請使用 vector<...>::iterator 將所有的複數資料全部乘起來, 並且將結果列印出來

下面的範例是使用 vector 物件的 iterator 將先前實習的 DataRecord 裡的 value 欄位資料加起來的範例

    ...
    vector<DataRecord> dataContainer;
    vector<DataRecord>::iterator iter;
    ...
    int sum=0;
    for (iter=dataContainer.begin(); 
         iter<dataContainer.end(); iter++)
        sum += iter->value;
    ....
    
iterator 使用起來像是一個指標, 可以用 ++, <, >, =, *, -> 等等運算去移動, 擷取資料, 你可以抽象地把它想像成是指標, 目前內部實作也是指標, 但是請不要去把它真的轉型為指標,
    DataRecord *ptr = (DataRecord *)iter; // 錯誤
    
compiler 廠商並不保證它的實作一定是指標

參考範例程式

步驟五 上一個步驟的結果是 -8.96419 + -3.24387 i, 請寫一個 assert 敘述來自動確認這個結果。
步驟六 請撰寫一個比較複數點到原點距離大小的函式 greater() 以供 sort 使用來比較兩個複數的大小, 然後請在 main 函式中呼叫 sort 由小到大排序 (sort 的用法請參考 前次實習 步驟三)
步驟七 請用陣列的存取方式 (ex. dataContainer[i].value) 寫一個迴圈依序將所有的複數資料列印出來
步驟八 請助教檢查後, 將所完成的 專案 (只需保留 .cpp, .h, .sln 以及 .vcxproj 檔案即可; 刪除掉 .suo, .sdf, .filters, .users, debug\ 資料匣, 以及 ipch\ 資料匣下的所有內容) 壓縮起來, 選擇 Lab4-1 上傳, 後面的實習課程可能需要使用這裡所完成的程式
偵錯 有的時候同學在做這個實習的時後, 會遇見不太容易找的 bug, 比如說發現 最後結果有一些誤差, 例如 -8.96419 + -3.24251 i, 到底是哪裡錯了, 是 Complex 裡面寫錯了? 還是 testComplex 這裡的運算寫錯了? 因為計算過程中都是浮點數, 常常看到了有錯誤的東西也不容易察覺出來, 這是很討厭的狀況。

不過因為我們現在是建立封裝良好的物件, 物件如果你懷疑它的功能有問題, 例如 Complex 物件, 最簡單的方法就是換一個相同規格的物件來測試比對一下 (就好像你如果發現電視遙控器電池好像沒電了, 怎麼辦? 當然是拿一個新的把原來的換掉測試一下囉), 例如你可以下載 ComplexObj.rar, 建立一個新的專案, 把你的 testComplex.cpp 還有 ComplexObj.rar 裡面的 Complex.h 和 Complex.obj 三個檔案, 運用 "加入現有項目" 把它加到專案裡面, 稍微調整一下介面函式的名稱, 然後編譯測試, 看看結果是不是對的, 如果是對的, 就表示你原來用的 Complex 裡面的功能有一些問題...

回 C++ 物件導向程式設計課程 首頁

製作日期: 03/13/2013 by 丁培毅 (Pei-yih Ting)
E-mail: pyting@mail.ntou.edu.tw TEL: 02 24622192x6615
海洋大學 電機資訊學院 資訊工程學系 Lagoon