實習目標 | 由檔案讀取複數資料 使用 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 |