看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《liptonbin (我還存在耶)》之銘言: : 請教一下 : 我有個 : 輸入: 一維arr[240]={0,1,2,3,4,5,.....239} : (為了方便記憶,寫有順序排列,之後陣列值會變動!) : 想轉成底下5x48陣列,排列如下 : 0, 1, 2, 3,.........47 : 48, 49, 50, 51,........95 : 96, 97, 98, 99,.......143 : 144,145,146,147,......191 : 192,193,194,195,..238,239 : 想做底下陣列運算 : 直列來看,二個一組相減,有點複雜,請問該怎麼寫c code>< : 示意圖如下: : https://ibb.co/mzM6Mqt : 想要輸出: : 48-0, 1-1, 50-2, 3-3,............47-47 : 48-48, 97-49, 50-50, 99-51,...........143-95 : 144-96, 97-97, 146-98, 99-99,..........143-143 : 144-144,193-145,146-146, 195-147,..........239-191 : 1-192,193-193, 3-194, 195-195,...47-238,239-239 : 想法是: : 要把一維陣列轉成5x48陣列,在做反轉陣列,變成48x5,在轉成一維陣列 : 目的是2個為一組,再作減法,比較有序, : 最後再把一維陣列轉回上面的圖>< 基本上你只要盡可能地把問題描述清楚, 有趣的是: 當你把問題描述完整的同 時, 自然就解掉它了. 讓我們來一步步分析它. 假設你現在是一個老闆, 需要 雇用一個工讀生幫你把圖裡紅線經過的位置依序唸出來 (0, 48, 96, ...), 好讓你可以兩兩去作相減, 你在徵才文裡會寫上哪些需求呢? 我想到的內容會 像下面這樣: 1. 給 [工讀生] 一組行 (column)(row) 值, 他要有辦法將陣列當作 虛擬的矩陣看待. 2. [工讀生] 要有辦法像圖裡紅線所標示的一樣, 依序給出序列 (0, 48, 96, 144, ...) 裡的值, 直到行 (column) x 列 (row) - 1 為止. 3. [工讀生] 要能知道什麼時候該結束, 並且通知你. 有了上面的描述, 我們就可以建立抽象資料型別 (Abstract Data Type) 出來 , 三個項目對應到三個介面. 這個流程在資料結構的書裡都會教, 細節不再贅 述. 我們把這裡的 [工讀生] 改叫作 Iterator: Abstract Data Type: Iterator ───────────────────────────── Iterator create(row: size_t, column: size_t) (constructor) size_t next(it: Iterator) bool hasNext(it: Iterator) 注意在這個階段型別並不是最重要的, 重要的是釐清每個介面應該做什麼事情. 然後身為雇主的你請了這個 [工讀生] 來, 剩下要做的就是每次和他拿兩個位 置過來, 得到陣列裡對應的值再做相減. 程式碼會像這樣 (介面實作就當練習 ): struct Iterator it = create(5, 48); while (hasNext(it)) { const size_t upper = next(&it); const size_t lower = next(&it); printf("%d-%d", arr[lower], arr[upper]); // other code goes here } 範例: https://godbolt.org/z/zEsdad 也許眼尖的人已經看出來這是《Design Patterns》裡的 Iterator Pattern, 因為原問題的本質是尋訪問題, 所以前面提到的抽象資料型別正是根據目前 的問題 (Problem) 以及情境 (Context) (原 PO 對 C 語言的理解) 所揉合 出來的解決方案 (Solution) (= Pattern). 也因為是尋訪問題, 如果今天把紅線從倒 N 字型改為 Z 字型, 在修改/維護 上將得利於使用了合適的設計樣式 (design pattern). -- [P1389R1] Standing Document for SG20: Guidelines for Teaching C++ to Beginners https://wg21.link/p1389r1 SG20 Education and Recommended Videos for Teaching C++ https://www.cjdb.com.au/sg20-and-videos -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.193.76.216 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1608215772.A.2D2.html ※ 編輯: poyenc (123.193.76.216 臺灣), 12/18/2020 01:46:42
s4300026: 讚 12/18 08:19
cuteSquirrel: 好猛 12/19 19:31
unmolk: 推 12/20 06:17
VictorTom: 推:) 12/21 14:00
F04E: push 12/22 13:11
KevinR: 曲高和寡 12/23 18:38
Ryspon: 有點太舒服 12/25 10:37
ohbravo: 學到一課 02/27 12:54