查看: 2357|回复: 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,不是吗? |
|
|
|
|
|
|
| |
本周最热论坛帖子
|