【问题标题】:How to make a loop in Cobol Language that displays like a pyramid如何在 Cobol 语言中创建一个像金字塔一样显示的循环
【发布时间】:2022-01-15 23:26:52
【问题描述】:
   IDENTIFICATION DIVISION.
   PROGRAM-ID. HELLO-WORLD.
   DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 NAME PIC A(9) VALUE 'FELIX'.

还有其他的循环方式吗?

   PROCEDURE DIVISION.
       PERFORM A-PARA THRU E-PARA.

   A-PARA.
   DISPLAY 'L'.

   B-PARA.
   DISPLAY 'I I I'.

   C-PARA.
   DISPLAY 'A A A A A'.

   D-PARA.
   DISPLAY 'M M M M M M M'.

  This is the Output:
  L
  III
  AAAAA
  MMMMMMM

  My expecting Output Should be:
      L
     III
    AAAAA
   MMMMMMM

感谢您提前回复。我是这种编程语言的新手,而且非常令人困惑。

【问题讨论】:

  • 对于“循环”:查看 PERFORM VARYING(您可以使用 OCCURS 将数据移动到表中,以便变量可以为您提供索引,或使用大变量和引用修改(随着大小的增加 [BY 2]):如果您检查前导空格 - 然后添加它们。
  • 查看这个答案:maybe you will find it useful
  • 检查这个答案,也许它对你有用。 pyramid

标签: loops cobol


【解决方案1】:

真的不应该让别人做你的功课。 . .

我是在一台 openvms 机器上完成的。您必须针对所使用的任何 COBOL 环境进行调整。

$ cob/reserved_words=200x PYRAMID.COB
$ LINK PYRAMID
$ RUN PYRAMID
    *     
   ***    
  *****   
 *******  
********* 

如果您可以使用良好的 VT-100 模拟器,您可以在同一个地方获得一个免费帐户。

https://eisner.decus.org/

IDENTIFICATION DIVISION.
PROGRAM-ID.    A.

*>  COB/RESERVED_WORDS=200X PYRAMID.COB
*>  LINK PYRAMID
*>  RUN PYRAMID

DATA DIVISION.
     WORKING-STORAGE SECTION.
     

     01 MY-NUMBERS.
        05 START-POS    PIC 9(4) USAGE IS COMP VALUE IS ZERO.
        05 END-POS      PIC 9(4) USAGE IS COMP VALUE IS ZERO.
        05 SUB-POS      PIC 9(4) USAGE IS COMP.
        05 DISTANCE     PIC 9(4) USAGE IS COMP.


     77 MAX-WIDTH       PIC 9(4) USAGE IS COMP VALUE IS 10.
     77 CENTER-POS      PIC 9(4) USAGE IS COMP VALUE IS 5.

     01 MY-DISPLAYS.
        05 DISPLAY-LINE.
           10 DISPLAY-CELL   PIC X OCCURS 10.


PROCEDURE DIVISION.
A000-MAIN.

     PERFORM B000-CREATE-PYRAMID
        VARYING DISTANCE FROM 0 BY 1
        UNTIL DISTANCE IS GREATER THAN 4.

    STOP RUN.

B000-CREATE-PYRAMID.
    MOVE SPACES TO DISPLAY-LINE.

    SUBTRACT DISTANCE FROM CENTER-POS GIVING START-POS.
    ADD DISTANCE TO CENTER-POS GIVING END-POS.

    PERFORM C000-FILL-LINE
        VARYING SUB-POS FROM START-POS BY 1
        UNTIL SUB-POS IS GREATER THAN END-POS.

    DISPLAY DISPLAY-LINE.

C000-FILL-LINE.
    MOVE '*' TO DISPLAY-CELL (SUB-POS).

【讨论】:

    【解决方案2】:

    要在 COBOL 中制作基于字符的金字塔,首先要确定金字塔底部的宽度。这取决于级别的数量和边的“斜率”。对于示例 1,在每行一个字符的斜率处,基数将为 (2 * (number-of-levels - 1)) + 1,或基数宽度为 (2 * (4 - 1)) + 1 = 7。

    接下来找到金字塔顶部的起始位置(中点)。这是(width-of-base + 1) / 2。对于示例 1,(7 + 1) / 2 = 4。

    对于金字塔的每一层 (PERFORM VARYING),将起始位置减少 1,宽度增加 2。

    对于示例 2,使用了每行两个字符的“斜率”。底数为13,起始位置为7,起始位置减少2(“坡度”),宽度增加4。

    对于示例 1 和 2,星号(* 或 * )插入到要放置预期字符的位置,然后使用 INSPECT 语句将星号更改为正确的字符。 INSPECT 也是一个“循环”语句(内部)。

    对于示例 3,“斜率”为 1 的金字塔状结构是由文本构建的。层数、宽度和起点根据要显示的文本长度计算。


    代码:

       data division.
       working-storage section.
       1 pyramid-chars pic x(4) value "LIAM".
       1 level-number comp pic 9(4).
       1 start-point comp pic 9(4).
       1 width comp pic 9(4).
       1 display-line pic x(50).
       1 number-of-levels comp pic 9(4).
       1 max-move comp pic 9(4).
       1 text-ptr comp pic 9(4).
       1 para-text pic x(116) value "This is a long paragraph to "
           & "demonstrate building a pyramid from text. The only "
           & "explicit loop is the PERFORM VARYING.".
       procedure division.
      * Example 1
           move space to display-line
           move 4 to start-point
           move 1 to width
           perform varying level-number from 1 by 1
           until level-number > 4
               move all "*" to display-line (start-point:width)
               inspect display-line replacing
                   all "*" by pyramid-chars (level-number:1)
               subtract 1 from start-point
               add 2 to width
               display display-line
           end-perform
      * Example 2
           display space
           move space to display-line
           move 7 to start-point
           move 1 to width
           perform varying level-number from 1 by 1
           until level-number > 4
               move all "* " to display-line (start-point:width)
               inspect display-line replacing
                   all "*" by pyramid-chars (level-number:1)
               subtract 2 from start-point
               add 4 to width
               display display-line
           end-perform
      * Example 3
           display space
           compute number-of-levels = ( function sqrt
               ( 16 * function length (para-text) ) ) / 4
           if (number-of-levels *
                   (2 + 2 * (number-of-levels - 1))) / 2
                 < function length (para-text)
               add 1 to number-of-levels
           end-if
           compute start-point =
               ( 2 * (number-of-levels - 1) + 1 ) / 2 + 1
           move 1 to width
           move 1 to text-ptr
           move space to display-line
           perform varying level-number from 1 by 1
           until level-number > number-of-levels
               compute max-move = function min ( (function length
                 (para-text) - text-ptr + 1) width )
               move para-text (text-ptr:max-move)
                   to display-line (start-point:width)
               add max-move to text-ptr
               subtract 1 from start-point
               add 2 to width
               display display-line
           end-perform
           stop run
           .
    

    输出:

       L
      III
     AAAAA
    MMMMMMM
    
          L
        I I I
      A A A A A
    M M M M M M M
    
              T
             his
             is a
            long p
          aragraph
         to demonstr
        ate building
       a pyramid from
      text. The only ex
     plicit loop is the
    PERFORM VARYING.
    

    【讨论】:

      【解决方案3】:

      在cobol中有几种循环方式

      1. go tohow to use GO TO in COBOL(不推荐使用)
      2. perform 声明 https://www.tutorialspoint.com/cobol/cobol_loop_statements.htm

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-26
        • 1970-01-01
        • 2016-11-21
        • 1970-01-01
        • 1970-01-01
        • 2022-08-02
        • 2021-12-09
        相关资源
        最近更新 更多