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