| 
| 
查看: 2579|回复: 33
 | 
[原创]编程技术动脑筋 - 题目1, 题目2
[复制链接] |  
 |  | 
 
| 常常在这里逛, 看到的帖多数很公式化的编程技术,而且主要专注在数据库方面。 
 在学院/大专里学的problem solving 都派不上用场, 像Hanoi towel , n-Queen 等难题(我其实也不会这些)在现实工作上很少或几乎没有碰到。
 
 这也是编程员的悲哀, 编程是一种艺术, 不应该太公式化。
 
 我在编程员的生涯当中有几个算是有趣的难题, 希望喜欢编程的你, 可以享受下有趣的编程 。。
 
 当作游戏也好 。。
  
 [ Last edited by jangancari on 18-3-2005 at 11:06 AM ]
 | 
 |  |  |  |
 
|  |  |  
|  |  | 
 |  | 
 
 
 楼主|
发表于 18-3-2005 08:30 AM
|
显示全部楼层 
题目1 - 源代码格式化
| 题目背景: =========
 我第一份工就是做RPG/400 , 一个OS/400 上运行的编程语言。 我刚开始使用真的很不习惯。 为什么呢? 是因为它的源码竟然是没有idented 的。 且看以下源代码
 
 XPROD      IFEQ 'ABC'
 XTYPE      ANDEQ'F'
 XFLAG      DOWEQ'Y'
 MOVELXTYPE     WTYPE
 ENDDO
 ENDIF
 
 
 
 写成类似C 语言的syntax 是
 
 if(XPROD=='ABC' AND XTYPE=='F')
 {
 
 while(XFLAG='Y')
 {
 WTYPE = XTYPE
 }
 }
 
 虽然, 我们有个3rd party tool 来打印idented format 的源代码, 但是, 因为太旧了, 有些command 没有支援好。
 工作了两个月, 无意间, 我发现原来RPG/400 的源代码是收在数据库里的! 我花了几个星期的周末, 到公司, 终于做出了自己的打印idented format 的程序。
 
 题目 :
 ====
 写出你的概念, 你会如何做这个打印idented RPG/400源代码的程序。
 不明白?就当  “XPROD      IFEQ 'ABC'”,“XTYPE      ANDEQ'F'”每一行都是 data.
 
 输入:
 
 XPROD      IFEQ 'ABC'
 XTYPE      ANDEQ'F'
 XFLAG      DOWEQ'Y'
 MOVELXTYPE     WTYPE
 ENDDO
 ENDIF
 
 你要如何把它打印成以下 (输出)
 
 XPROD      IFEQ 'ABC'
 XTYPE      ANDEQ'F'
 XFLAG      |  DOWEQ'Y'
 |  | MOVELXTYPE     WTYPE
 |  ENDDO
 ENDIF
 
 记住, 因为是要打印整个源代码, 不能hardcode 咯 。。, 因为要考虑到巢形(nested) IF ,While 。
 
 (注: 因为RPG/400 的operators, command 都是在固定的位置, 所以没有parsing 的问题, 只要用substring 能parse 了。)
 
 [ Last edited by jangancari on 18-3-2005 at 10:57 AM ]
 | 
 |  |  |  |
 
|  |  |  
|  |  | 
 |  | 
 
 发表于 18-3-2005 09:24 PM
|
显示全部楼层 
| 好难..... 
 我不会.....跟本不明白....
  | 
 |  |  |  |
 
|  |  |  
|  |  | 
 |  | 
 
 
 楼主|
发表于 19-3-2005 12:52 AM
|
显示全部楼层 
|  johe07 于 18-3-2005 07:24 AM  说 : 好难.....
 
 我不会.....跟本不明白....
  
 不会很难的, 什么地方不明白?
 
 我再出题目二, 试试做吧 。。
 | 
 |  |  |  |
 
|  |  |  
|  |  | 
 |  | 
 
 
 楼主|
发表于 19-3-2005 12:57 AM
|
显示全部楼层 
题目二 : BOM 列表
| 题目背景: =========
 我工作的公司去年以新编程语言重写ERP 软件, 当中有一个列表(Listing) 程序就曾经考倒了以前的编程员, 大家都不懂如何original 的ERP 软件是如何做到的。所以, 一向来大家都没去再想如何做。 在重写的时候, 上司对重写这列印程序都不乐观。 我因为是上手最快的编程员(大家都一起上training) , 也是对编写ERP 软件最有经验的员工(虽然我已经3年没碰了)的人,
 我“有幸”地被安排了这个“不可能的任务”。
 
 
 题目
 ====
 在ERP 软件里, BOM , Bill of Material 是一个重要的东西, 也是ERP 软件编程里属于难度高的技术。
 
 何谓BOM, 好, 这是一个制造业的专有名词。 首先, 要明白制成品(Finished Good), 半成品(Sub-assembly)和原料(Raw Material)。
 
 1。 制成品是由无数个半成品和原料组成。
 2。 半成品是由无数个半成品和原料组成, 或只由原料组成。
 
 所以, 一个制成品的构造大约如下
 
 制成品,A
 |
 +--------------------+
 |                    |
 半成品, AA            半成品,AB
 |                    |
 +----+----+          +----+----+
 |         |          |         |
 原料,AAB   原料,AAC  半成品,ABC  半成品,ABD
 |
 +----+---+
 |        |
 原料,ABCA    原料,ABCB
 
 Figure 1    制成品的构造
 
 
 那么, 这些资料是如何收藏在数据库里呢? 总不可能每个构造都用一个record 来表示吧?
 所以, 这些资料是以亲子关系收藏。
 以上面的构造, 以下是BOM 表的数据
 
 Parent       Child
 ------------------------
 A            AA
 A            AB
 AA           AAB
 AA           AAC
 AB           ABC
 AB           ABD
 ABC          ABCA
 ABC          ABCB
 
 Table 1   BOM 表的数据
 
 我们的问题不是要列印出Figure 1 的图, 我们只要简单点的。
 
 输入 : Table 1  ,  要列印构造的制成品 ,现在是指 A
 输出 : 以下的Listing 1
 
 
 A
 .AA
 ..AAB
 ..AAC
 .AB
 ..ABC
 ...ABCA
 ...ABCB
 ..ABD
 
 Listing 1  制成品的构造
 
 动一动脑筋吧! 不会难的, 有学过的。
 
 [ Last edited by jangancari on 18-3-2005 at 05:53 PM ]
 | 
 |  |  |  |
 
|  |  |  
|  |  | 
 |  | 
 
 发表于 19-3-2005 12:58 AM
|
显示全部楼层 
|  jangancari 于 19-3-2005 00:52  说 : 
 
 不会很难的, 什么地方不明白?
 
 我再出题目二, 试试做吧 。。
 有很多都不明白.....表紧, 我先再试试了解看...真的不动在问您....
  | 
 |  |  |  |
 
|  |  |  
|  |  | 
 |  | 
 
 发表于 19-3-2005 02:29 AM
|
显示全部楼层 
|  jangancari 于 18-3-2005 08:30 AM  说 : 题目背景:
 =========
 我第一份工就是做RPG/400 , 一个OS/400 上运行的编程语言。 我刚开始使用真的很不习惯。 为什么呢? 是因为它的源码竟然是没有idented 的。 且看以下源代码
 
 XPROD     ...
你要的是 indent 的 output 吗?
 | 
 |  |  |  |
 
|  |  |  
|  |  | 
 |  | 
 
 
 楼主|
发表于 19-3-2005 06:02 AM
|
显示全部楼层 
|  SeaBiscuit 于 18-3-2005 12:29 PM  说 : 
 你要的是 indent 的 output 吗?
对,
 输入:
 
 XPROD      IFEQ 'ABC'
 XTYPE      ANDEQ'F'
 XFLAG      DOWEQ'Y'
 MOVELXTYPE     WTYPE
 ENDDO
 ENDIF
 
 你要如何把它打印成以下 (输出)
 
 XPROD      IFEQ 'ABC'
 XTYPE      ANDEQ'F'
 XFLAG      |  DOWEQ'Y'
 |  | MOVELXTYPE     WTYPE
 |  ENDDO
 ENDIF
 
 这只是源代码的片段, 概念必须能格式化整个源代码。
 
 [ Last edited by jangancari on 18-3-2005 at 05:39 PM ]
 | 
 |  |  |  |
 
|  |  |  
|  |  | 
 |  | 
 
 发表于 19-3-2005 10:35 AM
|
显示全部楼层 
| 我知道答案,可是懒得去写code,在此给提示, 
 1。当遇到 Statement command 就 indent++, End Statement 就 indent--
 
 2。类似 TreeView 的 Node
 | 
 |  |  |  |
 
|  |  |  
|  |  | 
 |  | 
 
 
 楼主|
发表于 22-3-2005 12:40 AM
|
显示全部楼层 
| 白老大的答案正确。 
 1。 概念正确, 正是用一个flag 控制indent level。 还少了一个情况。 大家想想看。
 
 2。 概念正确。 不过还没说出一个重要的关键, 要如何去建立这个Treenode.  大家想想看。
 
 
 大家不需要写出code , 只要提出概念, 或pseudo code。
 | 
 |  |  |  |
 
|  |  |  
|  |  | 
 |  | 
 
 发表于 22-3-2005 08:58 AM
|
显示全部楼层 
|  白日梦 于 19-3-2005 10:35 AM  说 : 我知道答案,可是懒得去写code,在此给提示,
 
 1。当遇到 Statement command 就 indent++, End Statement 就 indent--
用RECURSIVE 和 PASS VALUE BY REFERENCE
 
 
  白日梦 于 19-3-2005 10:35 AM  说 : 我知道答案,可是懒得去写code,在此给提示,
 
 2。类似 TreeView 的 Node
 TREENODE 要有 LIST OF TREENODE(CHILDNODE)
 | 
 |  |  |  |
 
|  |  |  
|  |  | 
 |  | 
 
 发表于 22-3-2005 10:51 AM
|
显示全部楼层 
|  AquaMax 于 22-3-2005 08:58 AM  说 : 
 用RECURSIVE 和 PASS VALUE BY REFERENCE
 
 
 
 TREENODE 要有 LIST OF TREENODE(CHILDNODE)
 RPG/400可以用 RECURSIVE 和 PASS VALUE BY REFERENCE 吗 ?
 | 
 |  |  |  |
 
|  |  |  
|  |  | 
 |  | 
 
 发表于 22-3-2005 10:52 AM
|
显示全部楼层 
| 我有问题要请教: 
 1. 从学校开始至今,我还是很不明白Pass by Reference VS Pass by Value,可以解释吗?
 2. 你们所说的TREENODE, TREEVIEW, RECURSIVE,indent 可以解释吗?
 
 谢谢。
 | 
 |  |  |  |
 
|  |  |  
|  |  | 
 |  | 
 
 
 楼主|
发表于 22-3-2005 11:38 AM
|
显示全部楼层 
|  johe07 于 21-3-2005 08:52 PM  说 : 我有问题要请教:
 
 1. 从学校开始至今,我还是很不明白Pass by Reference VS Pass by Value,可以解释吗?
 你要明白这个概念, 你首先要明白一个variable 的value 是如何收在记忆体(memory)。
 既然variable收藏在记忆体里的其中一个位置, 那么它是收藏在那个位置呢?
 那程序要如何取得在记忆体里variable 的value 呢?
 程序要取得在记忆体里variable 的value, 就是靠reference , 可以解为记忆体的第n个位置。
 
 
 Ref.       Value
 ____________________
 | 2000   | 'A'     |   charA <- variable
 |--------+---------|
 | 2001   | 'B'     |   charB <- variable
 |--------+---------|
 |        |         |
 |--------|---------|
 
 如果要pass charA by reference , pass 的是 2000 。
 如果要pass charA by value , pass 的是 'A', 而且会在收藏在记忆体的另外一边 。
 | 
 |  |  |  |
 
|  |  |  
|  |  | 
 |  | 
 
 发表于 22-3-2005 12:14 PM
|
显示全部楼层 
| 那么,它们之间的优弱点呢?怎样的情况下用它们其中一个呢? 我们竟常用的方法是pass by value的方法来取得varial 的值,是吗?
 
 
 (我是不是在问很笨的问题啊?)
  | 
 |  |  |  |
 
|  |  |  
|  |  | 
 |  | 
 
 发表于 22-3-2005 01:12 PM
|
显示全部楼层 
|  reylina_g 于 22-3-2005 10:51 AM  说 : 
 
 RPG/400可以用 RECURSIVE 和 PASS VALUE BY REFERENCE 吗 ?
 errr....只是要打印SOURCE CODE吧了.....可以用任何LANGUAGE吧....
 | 
 |  |  |  |
 
|  |  |  
|  |  | 
 |  | 
 
 发表于 23-3-2005 08:56 AM
|
显示全部楼层 
|  jangancari 于 22-3-2005 12:40 AM  说 : 1。 概念正确, 正是用一个flag 控制indent level。 还少了一个情况。 大家想想看。
就是 AND / OR 的情况下,我之前看漏了。
  
  jangancari 于 22-3-2005 12:40 AM  说 : 2。 概念正确。 不过还没说出一个重要的关键, 要如何去建立这个Treenode.  大家想想看。
读进 Array(reccount(),3), Array(recno(),3) 等于 _node,
 _node = 0 是 \root
 _node = 1 是 \\child node level 1
 _node = 2 是 \\\child node level 2
 | 
 |  |  |  |
 
|  |  |  
|  |  | 
 |  | 
 
 发表于 23-3-2005 10:00 AM
|
显示全部楼层 
| 我还是问号在头上乱飞。。。而且越来越多。。。。    | 
 |  |  |  |
 
|  |  |  
|  |  | 
 |  | 
 
 发表于 23-3-2005 06:28 PM
|
显示全部楼层 
| 我在想,题目二的table设计有问题 象以下的这个node,我们已经不需要他的parent了,
 只需要记录他本身的node就可以了,因为从它的
 node已经很清楚说明了他的parents是谁了。
 
 node
 ----
 AAA  --> parent = AA
 BAB  --> parent = BA
 
 如果设计成我所说的那样,那就只要把你的query sort了,
 list出来的就是你要的东西啦,然后再针对你有几个char-1
 ident几次。
 
 我比较会偷鸡,所以都是那样设计的
 | 
 |  |  |  |
 
|  |  |  
|  |  | 
 |  | 
 
 发表于 23-3-2005 06:34 PM
|
显示全部楼层 
|  jangancari 于 22-3-2005 12:40 AM  说 : 白老大的答案正确。
 
 1。 概念正确, 正是用一个flag 控制indent level。 还少了一个情况。 大家想想看。
 
 2。 概念正确。 不过还没说出一个重要的关键, 要如何去建立这个Treenode.  大家想想看。
 
 
 大家 ...
 题目一,要用到stack的push & pop,不是吗?
 | 
 |  |  |  |
 
|  |  |  
|  |  |  |  | 
            本周最热论坛帖子 |