APL课程作业错误处理求助:非数值输入的整数校验失效
解决APL自定义函数中的整数输入校验问题
嘿,这个问题我熟!用⌊(floor)和输入本身比较的方法,确实只能搞定数值里的非整数,但碰到字符、字符串这类完全不是数值的输入时,要么直接触发APL的内置类型错误,要么根本走不到你的校验逻辑——毕竟你没法对字符做floor运算对吧?
要解决这个问题,咱们得把校验分成两步:先检查输入是否是数值类型,再判断这个数值是不是整数。这样就能覆盖所有非整数的情况,包括字符、字符串这类非数值输入了。
基础版:校验单个标量输入
下面是一个完整的自定义函数示例,用Dyalog APL的语法实现:
CheckInt←{ ⍝ 功能:校验输入是否为整数,非法输入抛出错误并终止执行 ⍝ 参数:⍵ 待校验的输入 ⍝ 返回:合法整数则继续执行后续逻辑,否则抛出错误 ⍝ 第一步:检查是否是标量(如果你的函数允许数组输入,可以去掉这部分) :If 1≢≢⍴⊢⍵ '错误:输入必须是标量' ⎕SIGNAL 8 :EndIf ⍝ 第二步:检查是否为数值类型(整数/浮点数) ⍝ ⎕DR返回数据表示码:1=整数,2=浮点数,9=字符,10=字符串 :If ~(⎕DR⍵)∊1 2 '错误:输入必须是数值类型' ⎕SIGNAL 8 :EndIf ⍝ 第三步:检查是否为整数 :If ⍵≠⌊⍵ '错误:输入必须是整数' ⎕SIGNAL 8 :EndIf ⍝ 这里放函数后续要执行的业务逻辑 '输入合法,是整数:',⍕⍵ }
代码解释:
1≢≢⍴⊢⍵:判断输入是否不是标量,如果是数组就抛出错误(按需保留)。~(⎕DR⍵)∊1 2:用⎕DR(Data Representation)获取输入的类型码,判断是否不属于数值类型(整数/浮点数),如果是字符或字符串就触发错误。⍵≠⌊⍵:这部分就是你原来的逻辑,判断数值是否为整数。⎕SIGNAL 8:抛出用户自定义错误(错误码8是APL的标准用户错误码,也可以用其他合法码),抛出后函数会立即终止,不会执行后续代码。
简化版:用⎕IS函数(Dyalog APL 18.0+支持)
如果你的APL版本比较新(比如Dyalog 18.0及以上),可以用⎕IS函数更简洁地做类型检查:
CheckInt←{ :If ~⎕IS⍵('Scalar' 'Numeric') '错误:输入必须是数值标量' ⎕SIGNAL 8 :EndIf :If ⍵≠⌊⍵ '错误:输入必须是整数' ⎕SIGNAL 8 :EndIf '输入合法,是整数:',⍕⍵ }
⎕IS⍵('Scalar' 'Numeric')直接判断输入是否是数值标量,省去了手动判断类型码的步骤,代码更易读。
进阶版:校验整数数组
如果你的函数需要处理整数数组(比如所有元素都必须是整数),可以稍微修改代码,遍历检查每个元素:
CheckIntArray←{ ⍝ 功能:校验输入数组的所有元素是否为整数 :If ~∧/⎕IS¨⍵('Scalar' 'Numeric') '错误:数组所有元素必须是数值' ⎕SIGNAL 8 :EndIf :If ∨/⍵≠⌊⍵ '错误:数组所有元素必须是整数' ⎕SIGNAL 8 :EndIf '输入合法,是整数数组:',⍕⍵ }
代码解释:
∧/⎕IS¨⍵('Scalar' 'Numeric'):检查数组的每一个元素是否都是数值标量,∧/确保所有元素都满足条件。∨/⍵≠⌊⍵:只要有一个元素不是整数,就触发错误。
这样修改后,不管是单个字符、字符串,还是带小数的数值,都会触发对应的错误提示,完美覆盖你遇到的问题。
内容的提问来源于stack exchange,提问作者JSON K.
相关产品推荐
相关产品推荐

