2013-03-24 45 views
2

我开始在IBM系统i上使用CL进行编程。我的任务是使用CL语言实现RPN计算器。通常,这个计算器使用堆栈。但我不知道必须在CL中实现它。有人可以给我一些建议吗?也许* PTR变量是解决方案,但有人可以给我一个例子如何使用它?CL程序中的堆栈实现(OS400/iSeries)

在此先感谢 JS

编辑:

CL语言是我的导师罚款。

我的程序应该接收用户的标志(数字/数字,数学运算符号)。
接收每个星座的程序应该analize收到什么,然后采取一些行动,根据伪代码后:

Do when new sign was entered: 
if: entered sign is a number 
    then push it into stack 
else if: entered sign is a sign of mathematical operation 
    then 
    - pop two elements from stack 
    - make operation using this elements and entered sign 
    - push result into stack 

我的问题是如何实现或分别代替这个堆栈。需要按照LIFO顺序到达元素,我不知道结构最终会包含多少元素。

回答

2

了解CL不适合这个。以下未经测试:

DCL &ARRAY *CHAR 50 
DCL &PTR *PTR ADDRESS(&ARRAY) 
DCL &ELEM *CHAR 10 STG(*BASED) BASPTR(&PTR) 
DCL &i *DEC (9 0) 
... 
/* Loop through the array */ 
DOFOR VAR(&i) FROM(1) TO(5) BY(1) 
    CHGVAR %OFFSET(&PTR) (%OFFSET(&PTR) + 10) 
    /* &ELEM is the current array element */ 
ENDDO 

发表一些代码;你尝试了什么?如果你不能发布任何代码,发布伪代码并解释你想要的代码。

编辑: 上面的代码片段实现了一个数组。这与堆栈非常相似。 LIFO跟踪最新的数组索引一样简单。在上面的代码片段中,CHGVAR向指针添加了10个字节。它是10个字节,因为每个数组元素/堆栈元素都是10个字节(DCL & ELEM)。这个特殊的堆栈有5个条目 - 5次10 = 50(DCL & ARRAY)。添加10个字节是PUSH,减去10个字节是POP。目前& PTR是最新的堆栈条目。

您的下一步应该是为大纲中的每个主要操作编写一个子例程。从PUSH开始。如果您不熟悉IBM i上的调试器,请使用DMPCLPGM查看正在运行的代码的结果。尝试一下,如果你仍然有问题,请发布你的代码并询问关于该代码的具体问题。编程是关于编写代码,所以跳入并尝试! :-)

+0

我在第一篇文章中添加了一些细节。 – user2204293 2013-03-24 19:44:33

+0

巴克,非常感谢!你的指针短代码是我所需要的。现在我有了所有程序的想法:)我会写,以防万一出现新的问题。 – user2204293 2013-03-24 23:49:20

1

据我记得,导师说,堆栈应该只有4个实体大小(10将是一个矫枉过正)。除非我们不谈论同一个导师(pwr?)。

谢谢您的回答巴克,让我进一步了解指针如何工作的感谢:)

我实现栈这一特定问题的办法是:

PGM                 
DCL  VAR(&STACK) TYPE(*CHAR) LEN(20)       
DCL  VAR(&STACKPTR) TYPE(*PTR) ADDRESS(&STACK)     
DCL  VAR(&STACKVAL) TYPE(*CHAR) STG(*BASED) BASPTR(&STACKPTR) LEN(5)             

/* ----------------------------------------------------- */ 
/* code that uses PUSH and POP subroutines when required */ 
/* ----------------------------------------------------- */ 

SUBR  SUBR(PUSH)                
    CHGVAR  VAR(&STACKVAL) VALUE(&WYRAZENIE)     
    CHGVAR  VAR(%OFFSET(&STACKPTR)) VALUE(%OFFSET(&STACKPTR)+5) 
ENDSUBR               
SUBR  SUBR(POP)            
    CHGVAR  VAR(%OFFSET(&STACKPTR)) VALUE(%OFFSET(&STACKPTR)-5)    
ENDSUBR               
ENDPGM               

当然没有溢出控制或任何,但它给你的想法:)

+0

干得好!入门有时是最难的部分。 :-) – 2013-03-25 01:54:56

0

创建一个* LIFO数据队列。发送到队列的条目可以按后进先出顺序接收。