我正在IBM系统i上使用CL开始编程。我的任务是使用CL语言实现RPN计算器。通常,此计算器使用堆栈。但我不知道必须在CL中实现它。有人可以给我一些建议吗?也许* PTR变量是解决方案,但是有人可以给我一个如何使用它的例子吗?
提前致谢 JS
修改
CL语言是由我的导师强加的。
我的程序应该接收用户的标志(数字/数字,数学运算的符号) 收到每个标志后,程序应根据伪代码分析收到的内容,然后采取一些行动:
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顺序到达元素,我不知道结构最终将包含多少元素。
答案 0 :(得分: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查看运行中的代码结果。试试吧,如果您还有问题,请发布您的代码并询问有关该代码的具体问题。编程是关于编写代码,所以跳进去试试! : - )
答案 1 :(得分: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
当然没有溢出控制或其他什么,但它给你的想法:)
答案 2 :(得分:0)
创建* LIFO数据队列。发送到队列的条目可以以后进先出顺序接收。