在 Rexx 中对数字求和有问题(创建 Luhn 算法)
Have a problem summing numbers in Rexx (Creating Luhn Algorithm)
你好,我是 Rexx 的新手,正在尝试在子例程中创建 luhn 算法,但在尝试将数字添加到变量以保存循环的每次迭代中的总和时出现错误。当我删除 'sumOfNum = sumOfNum + numToSum' 语句时,代码运行没有错误。
正在检查 7459274623941467
108 +++ sumOfNum = sumOfNum + numToSum
41 +++ 呼叫检查
IRX0041I 错误 运行 CCVIEW,第 108 行:错误的算术转换
准备就绪
INSPECT:
say 'inspecting' cc_digits
up = 1
flag = 0 /* for every other digit */
/* Loop to assess each digit in cc_digits */
do i = 0 to 16 by 1
/* Identify Numbers to sum */
digit = SUBSTR(cc_digits,up,1) /* Returns digit */
up = up + 1 /* for next digit */
/* to use only every other number */
if (if flag = 0) then
do
numToSum = 0
numToSum = digit * 2
flag = 1
end
/* Skip this digit */
else
do
Flag = 0
end
/*if digit > 9 sum digits of digit */
if (numToSum > 9) then
do
digit1 = SUBSTR(cc_digits,1,1)
digit2 = SUBSTR(cc_digits,2,1)
numToSum = digit1 + digit2
end
/* to accumulate sum */
sumOfNum = sumOfNum + numToSum
end
RETURN
问题是多方面的。
- 您没有初始化变量
sumOfNum
,因此在底部的加法中引用时它包含“SUMOFNUM”。因此“糟糕的算术转换”。
- 您的 if 语句
if (if flag = 0) then
没有按照您的预期执行。 REXX 将其解析为 if ( "IF 0" = 0 ) then...
或 if ( "IF 1" = 0 ) then...
,具体取决于变量 flag
的内容。括号内的表达式始终为假,与变量 flag
. 的内容无关
- 您没有验证变量
cc_digits
确实包含数字,只是。
- 您的主循环执行了 17 次,但您似乎只传递了一个 16 位数字。
我建议您开始使用 trace ?i
调试您的 REXX。这将显示带有中间步骤的每一行(trace 命令中的“i”),将显示语句执行的结果,然后等待您在执行下一条语句(trace 命令中的“?”)之前按回车).
请注意,当“trace”等待您时,您可以键入任何完整的 REXX 语句,这是 运行 在下一个语句之前。您可以显示变量的内容,例如say numToSum
,或 运行 程序当前上下文中的任何其他 REXX 语句。
你好,我是 Rexx 的新手,正在尝试在子例程中创建 luhn 算法,但在尝试将数字添加到变量以保存循环的每次迭代中的总和时出现错误。当我删除 'sumOfNum = sumOfNum + numToSum' 语句时,代码运行没有错误。
正在检查 7459274623941467 108 +++ sumOfNum = sumOfNum + numToSum 41 +++ 呼叫检查 IRX0041I 错误 运行 CCVIEW,第 108 行:错误的算术转换 准备就绪
INSPECT:
say 'inspecting' cc_digits
up = 1
flag = 0 /* for every other digit */
/* Loop to assess each digit in cc_digits */
do i = 0 to 16 by 1
/* Identify Numbers to sum */
digit = SUBSTR(cc_digits,up,1) /* Returns digit */
up = up + 1 /* for next digit */
/* to use only every other number */
if (if flag = 0) then
do
numToSum = 0
numToSum = digit * 2
flag = 1
end
/* Skip this digit */
else
do
Flag = 0
end
/*if digit > 9 sum digits of digit */
if (numToSum > 9) then
do
digit1 = SUBSTR(cc_digits,1,1)
digit2 = SUBSTR(cc_digits,2,1)
numToSum = digit1 + digit2
end
/* to accumulate sum */
sumOfNum = sumOfNum + numToSum
end
RETURN
问题是多方面的。
- 您没有初始化变量
sumOfNum
,因此在底部的加法中引用时它包含“SUMOFNUM”。因此“糟糕的算术转换”。 - 您的 if 语句
if (if flag = 0) then
没有按照您的预期执行。 REXX 将其解析为if ( "IF 0" = 0 ) then...
或if ( "IF 1" = 0 ) then...
,具体取决于变量flag
的内容。括号内的表达式始终为假,与变量flag
. 的内容无关
- 您没有验证变量
cc_digits
确实包含数字,只是。 - 您的主循环执行了 17 次,但您似乎只传递了一个 16 位数字。
我建议您开始使用 trace ?i
调试您的 REXX。这将显示带有中间步骤的每一行(trace 命令中的“i”),将显示语句执行的结果,然后等待您在执行下一条语句(trace 命令中的“?”)之前按回车).
请注意,当“trace”等待您时,您可以键入任何完整的 REXX 语句,这是 运行 在下一个语句之前。您可以显示变量的内容,例如say numToSum
,或 运行 程序当前上下文中的任何其他 REXX 语句。