C_and_CPP 板


LINE

※ 引述《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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1608215772.A.2D2.html ※ 编辑: poyenc (123.193.76.216 台湾), 12/18/2020 01:46:42
1F:推 s4300026: 赞 12/18 08:19
2F:→ cuteSquirrel: 好猛 12/19 19:31
3F:推 unmolk: 推 12/20 06:17
4F:推 VictorTom: 推:) 12/21 14:00
5F:推 F04E: push 12/22 13:11
6F:推 KevinR: 曲高和寡 12/23 18:38
7F:推 Ryspon: 有点太舒服 12/25 10:37
8F:推 ohbravo: 学到一课 02/27 12:54







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:iOS站内搜寻

TOP