作者poyenc (髮箍)
看板C_and_CPP
標題Re: [問題] 請問陣列運算
時間Thu Dec 17 22:36:06 2020
※ 引述《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