看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《handsomepow (handsomepow)》之銘言: : 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) : Dev C++ : 問題(Question): : 題目規定要用 : void multiply(const double** const mx, : const double* const vr, : int m,int n,double* const pt) : 但是如果不加上const就跑的出來 : 不知道是哪裡有問題 請高手指導一下 謝謝 : 程式碼(Code):(請善用置底文網頁, 記得排版) : http://codepad.org/oFbwP78W 先跟你說這介面定得爛爆, 以屬性來說 m, n 分別代表矩陣的列、 行數, 既然是矩陣的屬性, 參數在清單中的位置應該擺一起: void multiply(const double** const mx, const double* const vr, int m,int n,double* const pt) ↓ void multiply( const double** const mx, int m, int n const double* const vr, double* const pt ) 後面 vr(行向量) 因為也有相同的列數, 所以 n 不用再傳一個, 基本上多傳一個可以保持它的完整性, 但是那意味著你要測試的複 雜度相對變高. 其實我還蠻佩服很多人腦內的 mapping 機制都超強. double*是什 麼? 「它是一個列向量」既然是一個列向量, 你不會把它寫成: typedef double Element; typedef Element* Row; typedef Row* Matrix; 清爽多了嗎?看行就是行, 看列就是列, 矩陣的配置於是變成這樣: Matrix mx = new Row[ m ]; // 為矩陣配置 m 個列 for( size_t row = 0; row < m; ++row ) { mx[ row ] = new Element[ n ]; // 為每一列配置 n 個元素 } 然後 multiply() 可以變成這樣(版本2): typedef Element* Column; void multiply( Matrix mx, size_t m, size_t n, Column vr, Column pt ) 這樣雖然可以大概猜出函式在做什麼, 但並沒有明確講出 input/ output 變數有哪些, 這時還需要引進更多的 typedefs: typedef Element const ConstElement; // 此元素無法被更改 typedef ConstElement* const ConstRow; // 此列無法配置新元素 typedef ConstRow* const ConstMatrix; // 此矩陣無法配置新的列 typedef ConstElement* const ConstColumn; 矩陣和行向量相乘結果還是一個行向量, 最後 multiply() 的樣子 (版本3): void multiply( ConstMatrix mx, size_t m, size_t n, ConstColumn vr, Column pt ) 程式碼: http://codepad.org/1J3hXo30 配置的部份還需要定義函式把配置記憶體的細節(像是new)隱藏起來 , 不然 main() 程式碼還是相依於「指標」的操作太深, 整套作下 來還是直接用struct比較快, 印出輸入的部份也最好另外寫函式來 做, 不然對於operator[]的依賴太重, 導致實作偏向ptr to ptr這 邊來. 如果客戶碼有太多藍字(內建型態), 表示對實作型態相依太深, 雖 然你看目前程式碼稍微多了一點, 但是ADT定義的好, 後續維護跟可 讀性都會大大提高, 當你看到藍字一堆的程式碼, 應該考慮把它丟 掉而不要繼續殘害自己的眼睛. -- ★ ★ ███ ███ █▌█ ██◣ ███ ▋▋█ █▂█ █▃█ ███ █▆█ █▄█ ███ █ ◣ █ █ ▋██ █▆◤ ███ ███ Kim Jae Kyung Koh Woo Ri Cho Hyun Young Kim Ji Sook φwindyhorse No Eul Oh Seung A Jung Yoon Hye -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.121.197.115 ※ 編輯: loveme00835 來自: 140.121.197.115 (11/09 04:18)
purincess:我用的是terminal的vim 所以是綠字o( 艸 ) o 11/09 04:28
loveme00835:囧 11/09 04:39
purincess:哈 藍字代表我寫很多註解 未必是壞事(但也未必是好事.. 11/09 04:40
tropical72:推 :) ,另實作我一直都用 ptr 2 ptr 居多說,看 MFC 也 11/09 05:36
tropical72:大多都這樣搞. http://codepad.org/CIl6TMHg 類似這樣 11/09 05:36
handsomepow:非常感謝L大用心講解 11/09 08:30
xatier:推板主精美講解! 11/09 09:47
angleevil:有版神,快拜 11/09 13:03
x000032001:推! 11/09 13:22