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

COBOL统计大小写字母:能否更简洁指定英文字母集合?

优化GnuCOBOL中字母统计的实现方案

问题背景

现有代码通过逐个枚举大小写英文字母('A','B',...,'Z','a','b',...,'z'),使用INSPECT语句统计字符串中的字母数量,这种写法繁琐且易出错,希望通过SPECIAL-NAMES定义字符类简化集合指定,但之前尝试的写法在GnuCOBOL中无效。

可行的SPECIAL-NAMES字符类方案

GnuCOBOL完全支持通过SPECIAL-NAMES的CLASS子句定义自定义字符类,正确写法是利用THRU指定字符范围,避免逐个枚举。

1. 定义通用字母类(大小写合并统计)

IDENTIFICATION DIVISION.
PROGRAM-ID. COUNT-ALPHA.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 INPUT-STRING PIC X(100) VALUE 'Hello COBOL! 2024, GnuCOBOL is great'.
01 TOTAL-ALPHA PIC 9(3) VALUE 0.
SPECIAL-NAMES.
    CLASS ALPHABETIC-ALL IS 'A' THRU 'Z', 'a' THRU 'z'.
PROCEDURE DIVISION.
    INSPECT INPUT-STRING TALLYING TOTAL-ALPHA FOR ALL CLASS ALPHABETIC-ALL.
    DISPLAY "Total alphabetic characters: " TOTAL-ALPHA.
    STOP RUN.

2. 分别定义大小写字母类(单独统计)

如果需要区分大小写统计,可拆分定义两个字符类:

SPECIAL-NAMES.
    CLASS UPPER-CASE IS 'A' THRU 'Z'.
    CLASS LOWER-CASE IS 'a' THRU 'z'.

PROCEDURE DIVISION.
    INSPECT INPUT-STRING TALLYING UPPER-COUNT FOR ALL CLASS UPPER-CASE.
    INSPECT INPUT-STRING TALLYING LOWER-COUNT FOR ALL CLASS LOWER-CASE.
    DISPLAY "Upper case count: " UPPER-COUNT.
    DISPLAY "Lower case count: " LOWER-COUNT.

关键注意事项

  • 避免逐个枚举字符:使用THRU指定范围是简化写法的核心,同时提升代码可读性和维护性。
  • GnuCOBOL编译默认支持该特性:无需额外编译选项,只要语法符合COBOL标准即可运行。
  • 字符类命名自定义:可以根据业务需求命名(如ALPHABETIC-ALL、UPPER-CASE等),增强代码语义。

其他替代方案(可选)

如果场景特殊,也可以通过FUNCTION TEST-ALPHABETIC结合循环遍历统计,但效率和简洁性不如INSPECT + CLASS的组合:

PROCEDURE DIVISION.
    PERFORM VARYING I FROM 1 BY 1 UNTIL I > LENGTH OF INPUT-STRING
        IF FUNCTION TEST-ALPHABETIC(INPUT-STRING(I:1))
            ADD 1 TO TOTAL-ALPHA
        END-IF
    END-PERFORM.

内容的提问来源于stack exchange,提问作者bugmagnet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 04:50:23