佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 2357|回复: 33

[原创]编程技术动脑筋 - 题目1, 题目2

[复制链接]
发表于 18-3-2005 08:28 AM | 显示全部楼层 |阅读模式
常常在这里逛, 看到的帖多数很公式化的编程技术,而且主要专注在数据库方面。

在学院/大专里学的problem solving 都派不上用场, 像Hanoi towel , n-Queen 等难题(我其实也不会这些)在现实工作上很少或几乎没有碰到。

这也是编程员的悲哀, 编程是一种艺术, 不应该太公式化。

我在编程员的生涯当中有几个算是有趣的难题, 希望喜欢编程的你, 可以享受下有趣的编程 。。

当作游戏也好 。。

[ Last edited by jangancari on 18-3-2005 at 11:06 AM ]
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 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  说 :


不会很难的, 什么地方不明白?

我再出题目二, 试试做吧 。。


有很多都不明白.....表紧, 我先再试试了解看...真的不动在问您....
回复

使用道具 举报

Follow Us
发表于 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 ]
回复

使用道具 举报


ADVERTISEMENT

发表于 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吧....
回复

使用道具 举报


ADVERTISEMENT

发表于 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,不是吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 1-12-2024 07:15 PM , Processed in 0.150072 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表