You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:58:10