首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在COBOL中验证ISBN并计算校验和数字?

如何在COBOL中验证ISBN并计算校验和数字?
EN

Stack Overflow用户
提问于 2022-03-25 11:32:56
回答 1查看 300关注 0票数 0

我的问题是,我得到了一个不同的输出,我应该得到:看看下面的输出想要的。这是我得到的输出:

代码语言:javascript
复制
978-1734314502   (correct and valid)

978-1734314509   (incorrect, contains a non-digit)

978-1788399081   (correct and valid)

978-1788399083   (incorrect, contains a non-digit)

以下是我要做的问题:

  1. 做了一个现代的Cobol程序,对存储在用户输入文件中的一系列10位的ISBN进行ISBN验证。

  1. 以段落的形式包括三个“子程序”:

2.1。readISBNnum -向用户提供包含ISBN编号列表的ASCII文件的名称。读取ISBN数字的值并对其进行处理。如果文件不存在,程序应生成错误消息并重新提示文件名。

2.2。isValidate -检查ISBN的有效性,即它是否包含

它不应该包含的字符。响应应该包括一个数字是否包含错误字符的指示。

2.3。checkSUM -提取单个数字,并计算校验和数字.

  1. 为文件中的每个ISBN数字生成一个输出,标识它是否有效

以下是我迄今所做的工作:

代码语言:javascript
复制
  IDENTIFICATION DIVISION.
     
           PROGRAM-ID. testSubs.
           ENVIRONMENT DIVISION.
     
           CONFIGURATION SECTION.
           REPOSITORY.
               FUNCTION ALL INTRINSIC
               FUNCTION validISBN13.
     
           INPUT-OUTPUT SECTION.
           FILE-CONTROL.
     
           DATA DIVISION.
     
           FILE SECTION.
     
           WORKING-STORAGE SECTION.
     
           01  IX                          PIC S9(4) COMP.
           01  TEST-ISBNS.
               02  FILLER                  PIC X(14) VALUE '978-1734314502'.
               02  FILLER                  PIC X(14) VALUE '978-1734314509'.
               02  FILLER                  PIC X(14) VALUE '978-1788399081'.
               02  FILLER                  PIC X(14) VALUE '978-1788399083'.
           01  TEST-ISBN                   REDEFINES TEST-ISBNS
                                           OCCURS 4 TIMES
                                           PIC X(14).
     
           PROCEDURE DIVISION.
     
           MAIN-PROCEDURE.
     
               PERFORM 
                 VARYING IX 
                 FROM 1
                 BY 1
                 UNTIL IX > 4
     
                 DISPLAY TEST-ISBN (IX) '   ' WITH NO ADVANCING
                 END-DISPLAY
                 IF validISBN13(TEST-ISBN (IX)) = -1
                   DISPLAY '(incorrect, contains a non-digit)'
                 ELSE
                   DISPLAY '(correct and valid)'
                 END-IF
     
               END-PERFORM.
     
               GOBACK.
     
           END PROGRAM testSubs.
    IDENTIFICATION DIVISION.
     
           FUNCTION-ID. validISBN13.
           ENVIRONMENT DIVISION.
     
           CONFIGURATION SECTION.
           REPOSITORY.
               FUNCTION ALL INTRINSIC.
     
           INPUT-OUTPUT SECTION.
           FILE-CONTROL.
     
           DATA DIVISION.
     
           FILE SECTION.
     
           WORKING-STORAGE SECTION.
     
           01  PASSED-SIZE                 PIC S9(6) COMP-5.
           01  IX                          PIC S9(4) COMP.
     
           01  WORK-FIELDS.
               02  WF-DIGIT                PIC X.
               02  WF-COUNT                PIC 9(2).
                   88  WEIGHT-1  VALUE 1, 3, 5, 7, 9, 11, 13.
                   88  WEIGHT-3  VALUE 2, 4, 6, 8, 10, 12.
               02  WF-SUM                  PIC S9(8) COMP.
     
           LINKAGE SECTION.
     
           01  PASSED-ISBN                 PIC X ANY LENGTH.
           01  RETURN-VALUE                PIC S9.
     
           PROCEDURE DIVISION USING PASSED-ISBN
                              RETURNING RETURN-VALUE.
     
               CALL 'C$PARAMSIZE'
                 USING 1
                 GIVING PASSED-SIZE
               END-CALL.
     
           COMPUTE-CKDIGIT.
     
               INITIALIZE WORK-FIELDS.
               PERFORM 
                 VARYING IX 
                 FROM 1 
                 BY 1
                 UNTIL IX GREATER THAN PASSED-SIZE
     
                   MOVE PASSED-ISBN (IX:1) TO WF-DIGIT
                   IF WF-DIGIT IS NUMERIC
                     ADD 1 TO WF-COUNT
                     IF WEIGHT-1
                       ADD NUMVAL(WF-DIGIT) TO WF-SUM
                     ELSE
                       COMPUTE WF-SUM = WF-SUM + 
                         (NUMVAL(WF-DIGIT) * 3)
                       END-COMPUTE
                     END-IF
                   END-IF
     
               END-PERFORM.
     
               IF MOD(WF-SUM, 10) = 0
                 MOVE +0 TO RETURN-VALUE
               ELSE
                 MOVE -1 TO RETURN-VALUE
               END-IF.
     
               GOBACK.
    ===================================================================================
IDENTIFICATION DIVISION.
PROGRAM-ID. sedol.
 
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
    SELECT sedol-file ASSIGN "sedol.txt"
        ORGANIZATION LINE SEQUENTIAL
        FILE STATUS sedol-file-status.
 
DATA DIVISION.
FILE SECTION.
FD  sedol-file.
01  sedol                               PIC X(6).
 
WORKING-STORAGE SECTION.
01  sedol-file-status                   PIC XX.
    88  sedol-file-ok                   VALUE "00".
 
01  digit-num                           PIC 9 COMP.
 
01  digit-weights-area                  VALUE "1317391".
    03  digit-weights                   PIC 9 OCCURS 7 TIMES.
 
01  weighted-sum-parts-area.
    03  weighted-sum-parts              PIC 9(3) COMP OCCURS 6 TIMES.
 
01  weighted-sum                        PIC 9(3) COMP.
 
01  check-digit                         PIC 9.
 
PROCEDURE DIVISION.
    OPEN INPUT sedol-file
    PERFORM UNTIL NOT sedol-file-ok
        READ sedol-file
            AT END
                EXIT PERFORM
        END-READ
 
        MOVE FUNCTION UPPER-CASE(sedol) TO sedol
 
        PERFORM VARYING digit-num FROM 1 BY 1 UNTIL digit-num > 6
            EVALUATE TRUE
                WHEN sedol (digit-num:1) IS ALPHABETIC-UPPER
                    IF sedol (digit-num:1) = "A" OR "E" OR "I" OR "O" OR "U"
                        DISPLAY "Invalid SEDOL: " sedol
                        EXIT PERFORM CYCLE
                    END-IF
 
                    COMPUTE weighted-sum-parts (digit-num) =
                        (FUNCTION ORD(sedol (digit-num:1)) - FUNCTION ORD("A")
                        + 10) * digit-weights (digit-num)
 
                WHEN sedol (digit-num:1) IS NUMERIC
                    MULTIPLY FUNCTION NUMVAL(sedol (digit-num:1))
                        BY digit-weights (digit-num)
                        GIVING weighted-sum-parts (digit-num)
 
                WHEN OTHER
                    DISPLAY "Invalid SEDOL: " sedol
                    EXIT PERFORM CYCLE
            END-EVALUATE
        END-PERFORM
 
        INITIALIZE weighted-sum
        PERFORM VARYING digit-num FROM 1 BY 1 UNTIL digit-num > 6
            ADD weighted-sum-parts (digit-num) TO weighted-sum
        END-PERFORM
 
        COMPUTE check-digit =
            FUNCTION MOD(10 - FUNCTION MOD(weighted-sum, 10), 10)
 
        DISPLAY sedol check-digit
    END-PERFORM
 
    CLOSE sedol-file
    .
END PROGRAM sedol.

但是,我应该让输出如下所示:

代码语言:javascript
复制
1856266532 correct and valid
0864500572 correct and valid with leading zero
0201314525 correct and valid with leading zero
159486781X correct and valid with trailing uppercase X
159486781x correct and valid with trailing lowercase X
0743287290 correct and valid with leading and training zero
081185213X correct and valid with leading zero, trailing X
1B56266532 incorrect, contains a non-digit
159486781Z incorrect, contains a non-digit/X in check digit
1856266537 correct, but not valid (invalid check digit)
EN

回答 1

Stack Overflow用户

发布于 2022-06-24 11:04:40

根据文章中给出的分配,下面的代码为10位ISBN和3. identifies each sample ISBN as valid or not实现了2.3 checkSUM2.3 checkSUM过程。

代码:

代码语言:javascript
复制
   data division.
   working-storage section.
   01 isbn-table.
     03 isbn-test-numbers.
       05 pic x(10) value "1856266532".
       05 pic x(10) value "0864500572".
       05 pic x(10) value "0201314525".
       05 pic x(10) value "159486781X".
       05 pic x(10) value "159486781x".
       05 pic x(10) value "0743287290".
       05 pic x(10) value "081185213X".
       05 pic x(10) value "1B56266532".
       05 pic x(10) value "159486781Z".
       05 pic x(10) value "1856266537".
     03 isbn-10-number redefines isbn-test-numbers
          pic x(10) occurs 10 indexed isbn-idx.
   01 isbn-work.
     03 isbn-digit pic 9 occurs 9.
     03 pic x.
   01 check-digit.
     03 check-digit-9 pic 9.
   01 digit-position comp pic 9(4).
   01 digit-weight comp pic 9(4).
   01 weighted-sum comp pic 9(4).
   01 validation-flags.
   88 no-messages value all "0".
     03 pic 9.
     88 invalid-checksum value 1.
     03 pic 9.
     88 invalid-content value 1.
   01 isbn-message pic x(50).
   procedure division.
       perform varying isbn-idx from 1 by 1
       until isbn-idx > 10
           move isbn-10-number (isbn-idx) to isbn-work
           perform isValidate
           display isbn-message
       end-perform
       stop run
       .

   isValidate.
       set no-messages to true
       if isbn-work (1:9) is numeric
           perform checkSUM
           if function upper-case (isbn-work (10:1))
             not equal check-digit
               set invalid-checksum to true
           end-if
       else
           set invalid-content to true
       end-if
       move spaces to isbn-message
       evaluate true
       when invalid-checksum
           string isbn-work " invalid checksum"
           delimited size into isbn-message
       when invalid-content
           string isbn-work " invalid content"
           delimited size into isbn-message
       when other
           string isbn-work " valid ISBN"
           delimited size into isbn-message
       end-evaluate
       .

    checkSUM.
       move 0 to weighted-sum
       perform varying digit-position from 1 by 1
       until digit-position > 9
           compute digit-weight = (11 - digit-position)
           compute weighted-sum = weighted-sum
               + (isbn-digit (digit-position) * digit-weight)
       end-perform
       compute weighted-sum = 11 - function mod (weighted-sum 11)
       compute weighted-sum = function mod (weighted-sum 11)
       if weighted-sum = 10
           move "X" to check-digit
       else
           move weighted-sum to check-digit-9
       end-if
       .

输出:

代码语言:javascript
复制
1856266532 valid ISBN
0864500572 valid ISBN
0201314525 valid ISBN
159486781X valid ISBN
159486781x valid ISBN
0743287290 valid ISBN
081185213X valid ISBN
1B56266532 invalid content
159486781Z invalid checksum
1856266537 invalid checksum
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71616280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档