COBOL增加一个阵列 [英] COBOL adding an array

查看:201
本文介绍了COBOL增加一个阵列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想我的程序输出输入数组然后显示总金额Ⅰ输入。总价值是错误的和值在我的程序数组中的变化。我想我的问题是增加的部分。我应该如何解决?

 鉴定师。
 PROGRAM-ID。 FOREXCHANGE。
 数据分割。
 工薪存储部分。
   01 CURR-VAL。
      02美元PIC 999V99值46.59。
      02 AUS PIC 999V99值32.87。
      02 CND PIC 999V99值36.37。
      02 EUR PIC 999V99值52.32。
      02 YEN PIC 999V99值0.40。
      02 NZD PIC 999V99值30.04。
      02 OMN PIC 999V99值120.99。
      02 SGD PIC 999V99值32.52。
   77 AMOUNT PIC 9(6)V99。
   77的newval PIC 9(4)V99。
   77舍入PIC ZZZ,ZZ9.99。
   77 VALCUR PIC 9(6)V99。
   77 FORCUR PIC X(3)。
   77 TRANSAC PIC 9(4)时发生9999次。
   77 CURRENCIES PIC X(3)时发生9999次。
   77 AMOUNTARR PIC 9(6)V99 OCCURS 9999次。
   77 AMOUNTTOT PIC 9(6)V99 OCCURS 9999次。
   77 TRANSACNUM PIC 9(4)值0001。
   77 CTR PIC 9(4)零值。
   77 CTR1 PIC 9(4)零值。
   77 CURINDEX PIC 9 0值。
   77 CHOICE PIC X.
 PROCEDURE DIVISION。
  主菜单。
     显示ERASE。
     显示主菜单。
     显示1.交易。
     DISPLAY2.更新。
     DISPLAY3.摘要。
     DISPLAY4.退出。
     DISPLAYENTER CHOICE:如果没有进步。
     接受CHOICE。
     中频CHOICE =1
        PERFORM ADDTRANS
     ELSE IF CHOICE =2
        执行更新
     ELSE IF CHOICE =3
        PERFORM摘要
     ELSE IF CHOICE =4
        停止运行
     其他
        显示无效的选择!请再试一次!
        PERFORM主目录。  摘要。
     显示ERASE。
     显示摘要。
     DISPLAY交易编号货币金额。
     与测试中表现变后从CTR 1:1
           UNTIL CTR = CURINDEX             DISPLAYTRANSAC(CTR),没有前进式
             DISPLAY如果没有前进式
             DISPLAY的货币(CTR),没有前进式
             MOVE AMOUNTARR(CTR)舍入
             DISPLAY舍入
     END-PERFORM。
     与测试中表现变后从CTR 1:1
           UNTIL CTR = CURINDEX
                 ADD AMOUNTARR(CTR),以AMOUNTARR(CTR)
     END-PERFORM。     MOVE AMOUNTARR(CURINDEX)舍入。
     DISPLAYTOTAL PHP舍入。
     DISPLAY主菜单返回打印:?[Y / N]
             WITH NO推进中。
     接受CHOICE。
     如果CHOICE =Y
         PERFORM主目录
     否则,如果CHOICE =N
         PERFORM摘要
     其他
         显示无效的选择!要回主菜单
         PERFORM主目录。  ADDTRANS。
     显示ERASE。
     加1 CURINDEX。
     DISPLAY交易号:TRANSACNUM。
     MOVE TRANSACNUM TO TRANSAC(CURINDEX)。
     加1 TRANSACNUM。
     DISPLAYENTER外币:如果没有进步。
     接受FORCUR。
     中频FORCUR =USD
        MOVE美元TO VALCUR
        显示输入金额:$,没有前进式
        接受金额
     ELSE IF FORCUR =AUS
        MOVE AUS TO VALCUR
        显示输入金额:$,没有前进式
        接受金额
     ELSE IF FORCUR =来电显示
        MOVE CND TO VALCUR
        显示输入金额:$,没有前进式
        接受金额
     ELSE IF FORCUR =EUR
        MOVE EUR TO VALCUR
        显示输入金额:电子,没有前进式
        接受金额
     ELSE IF FORCUR =日元
        MOVE日元VALCUR
        显示输入金额:Y,没有前进式
        接受金额
     ELSE IF FORCUR =NZD
        MOVE NZD TO VALCUR
        显示输入金额:$,没有前进式
        接受金额
     ELSE IF FORCUR =OMN
        MOVE OMN TO VALCUR
        显示输入金额,R,没有前进式
        接受金额
     ELSE IF FORCUR =新元
        MOVE SGD TO VALCUR
        显示输入金额:$,没有前进式
        接受金额
     其他
        显示无效外币!请再试一次!
        减去1 FROM CURINDEX
        减去1 FROM TRANSACNUM
        PERFORM主目录。
     MOVE FORCUR货币(CURINDEX)。
     乘法量VALCUR GIVING AMOUNTARR(CURINDEX)。
     MOVE AMOUNTARR(CURINDEX)舍入。
     DISPLAYPHP舍入。
     DISPLAYENTER另一个事务:[Y / N]
             WITH NO推进中。
     接受CHOICE。
     如果CHOICE =Y
         PERFORM ADDTRANS
     否则,如果CHOICE =N
         PERFORM主目录
     其他
         显示无效的选择!要回主菜单
         PERFORM主目录。  更新。
     显示ERASE。
     DISPLAYENTER外币:如果没有进步。
     接受FORCUR。
     中频FORCUR =USD
        MOVE美元舍入
        DISPLAY最新值:舍入
        DISPLAY价格:$,没有前进式
        接受的newval
        MOVE的newval美元
     ELSE IF FORCUR =AUS
        MOVE AUS舍入
        DISPLAY最新值:舍入
        DISPLAY价格:$,没有前进式
        接受的newval
        MOVE的newval TO AUS
     ELSE IF FORCUR =来电显示
        MOVE CND舍入
        DISPLAY最新值:舍入
        DISPLAY价格:$,没有前进式
        接受的newval
        MOVE的newval TO CND
     ELSE IF FORCUR =EUR
        MOVE EUR舍入
        DISPLAY最新值:舍入
        DISPLAYRATE:EWITH NO前进式
        接受的newval
        MOVE的newval TO EUR
     ELSE IF FORCUR =日元
        MOVE日元四舍五入
        DISPLAY最新值:舍入
        DISPLAYRATE:Y,没有前进式
        接受的newval
        MOVE的newval颜
     ELSE IF FORCUR =NZD
        MOVE NZD舍入
        DISPLAY最新值:舍入
        DISPLAY价格:$,没有前进式
        接受的newval
        MOVE的newval TO NZD
     ELSE IF FORCUR =OMN
        MOVE OMN舍入
        DISPLAY最新值:舍入
        DISPLAYRATE:RWITH NO前进式
        接受的newval
        MOVE的newval TO OMN
     ELSE IF FORCUR =新元
        MOVE SGD舍入
        DISPLAY最新值:舍入
        DISPLAY价格:$,没有前进式
        接受的newval
        MOVE的newval新元
     其他
        显示无效外币!请再试一次!
        PERFORM主目录。
     DISPLAY--GO返回主菜单。
     PERFORM主目录。

更新:
我设法修复价值的变化在数组,但除了仍然是错误的。我发现了这个问题。数组中的最后一个值增加了自身。

 总结。
 显示ERASE。
 显示摘要。
 DISPLAY交易编号货币金额。
 与测试中表现变后从CTR 1:1
       UNTIL CTR = CURINDEX         DISPLAYTRANSAC(CTR),没有前进式
         DISPLAY如果没有前进式
         DISPLAY的货币(CTR),没有前进式
         MOVE AMOUNTARR(CTR)舍入
         DISPLAY舍入
 END-PERFORM。 与测试中表现变后从CTR1 1:1
       UNTIL CTR1 = CURINDEX
             MOVE AMOUNTARR(CTR1)TO AMOUNTTOT(CTR1)
             ADD AMOUNTTOT(CTR1)TO AMOUNTTOT(CTR1)
 END-PERFORM。


解决方案

您不能使用PERFORM你如何使用它。 a。执行不能以任何方式递归。

即使它可能,这将是意大利code:你不能告诉你在哪里,在节目中,除非你知道你从时间到了。您从一个曲折的路线wriggly去到另一个地方。

另外一个问题是,你所有的地方,通过下降。如果您在从行一个段落立即到达preceding它,该段将被执行。这说明你明显的随机补充。

在你的程序中的code大概是有的,但你需要完全重新构建它。如果你看看通过一些答案COBOL的问题在这里,你会看到一些样品code到你的总体思路。

这应该是这样的控制结构:

 接受CHOICE
 PERFORM UNTIL CHOICE等于4
     中频CHOICE =1
        PERFORM ADDTRANS
     ELSE IF CHOICE =2
        执行更新
     ELSE IF CHOICE =3
        PERFORM摘要
     其他
        显示无效的选择!请再试一次!
     万一
     万一
     万一
     接受CHOICE
 END-PERFORM

您应该修改嵌套-IF s到评估,你应该改变文字值<测试code> 88 S于该领域,COBOL的条件名称

必须重组程序。此刻,它是不可行的,不可靠,非便携式而不是任何用途。然而,这仅仅是结构(可能)是错的。如果你得到关于如何构建一个程序,以及如何段落可以保持一个倒下的通/ GO TO'd(不这样做,除非你不明白的方式不是凭借经验,总有没有办法到)/执行。

有一个最近的问题对于这个问题的答案是跨越。有一个阅读:<一href=\"http://stackoverflow.com/a/32885852/1927206\">http://stackoverflow.com/a/32885852/1927206

记住,虽然结构是错误的,code是挽救。这是一个常见的​​错误,COBOL初学者做,所以不是一个大问题。适合学习。尝试例子来看看这里。

I want my program to output the inputted array then display the total amount i inputted. The total value is wrong and the value changes in the array in my program. I think my problem is the adding part. How should I fix it?

 IDENTIFICATION DIVISION.
 PROGRAM-ID. FOREXCHANGE.
 DATA DIVISION.
 WORKING-STORAGE SECTION.
   01 CURR-VAL.
      02 USD  PIC 999V99 VALUE 46.59.
      02 AUS  PIC 999V99 VALUE 32.87.
      02 CND  PIC 999V99 VALUE 36.37.
      02 EUR  PIC 999V99 VALUE 52.32.
      02 YEN  PIC 999V99 VALUE 0.40.
      02 NZD  PIC 999V99 VALUE 30.04.
      02 OMN  PIC 999V99 VALUE 120.99.
      02 SGD  PIC 999V99 VALUE 32.52.
   77 AMOUNT      PIC 9(6)V99.
   77 NEWVAL      PIC 9(4)V99.
   77 ROUNDOFF    PIC ZZZ,ZZ9.99.
   77 VALCUR      PIC 9(6)V99.
   77 FORCUR      PIC X(3).
   77 TRANSAC     PIC 9(4) OCCURS 9999 TIMES.
   77 CURRENCIES  PIC X(3) OCCURS 9999 TIMES.
   77 AMOUNTARR   PIC 9(6)V99 OCCURS 9999 TIMES.
   77 AMOUNTTOT   PIC 9(6)V99 OCCURS 9999 TIMES.
   77 TRANSACNUM  PIC 9(4) VALUE 0001.
   77 CTR         PIC 9(4) VALUE ZERO.
   77 CTR1        PIC 9(4) VALUE ZERO.
   77 CURINDEX    PIC 9 VALUE 0.
   77 CHOICE      PIC X. 
 PROCEDURE DIVISION.
  MAIN-MENU.
     DISPLAY ERASE.
     DISPLAY "MAIN MENU".
     DISPLAY "1. TRANSACTION".
     DISPLAY "2. UPDATE".
     DISPLAY "3. SUMMARY".
     DISPLAY "4. EXIT".
     DISPLAY "ENTER CHOICE: " WITH NO ADVANCING.
     ACCEPT CHOICE.
     IF CHOICE = "1"
        PERFORM ADDTRANS
     ELSE IF CHOICE = "2"
        PERFORM UPDATES
     ELSE IF CHOICE = "3"
        PERFORM SUMMARIES 
     ELSE IF CHOICE = "4"
        STOP RUN
     ELSE 
        DISPLAY "INVALID CHOICE! PLEASE TRY AGAIN!"
        PERFORM MAIN-MENU.

  SUMMARIES.
     DISPLAY ERASE.
     DISPLAY "SUMMARY".
     DISPLAY "TRANSACTION NUMBER   CURRENCY   AMOUNT".
     PERFORM WITH TEST AFTER VARYING CTR FROM 1 BY 1 
           UNTIL CTR = CURINDEX

             DISPLAY "          " TRANSAC(CTR) WITH NO ADVANCING
             DISPLAY "         " WITH NO ADVANCING
             DISPLAY CURRENCIES(CTR)WITH NO ADVANCING
             MOVE AMOUNTARR(CTR) TO ROUNDOFF
             DISPLAY "      " ROUNDOFF
     END-PERFORM.
     PERFORM WITH TEST AFTER VARYING CTR FROM 1 BY 1 
           UNTIL CTR = CURINDEX
                 ADD AMOUNTARR(CTR) TO AMOUNTARR(CTR)
     END-PERFORM.

     MOVE AMOUNTARR(CURINDEX) TO ROUNDOFF.
     DISPLAY "TOTAL PHP" ROUNDOFF.
     DISPLAY "GO BACK TO MAIN MENU?:[Y/N] " 
             WITH NO ADVANCING.
     ACCEPT CHOICE.
     IF CHOICE = "Y"
         PERFORM MAIN-MENU
     ELSE IF CHOICE = "N"
         PERFORM SUMMARIES
     ELSE
         DISPLAY "INVALID CHOICE! GOING BACK TO MAIN MENU"
         PERFORM MAIN-MENU. 

  ADDTRANS. 
     DISPLAY ERASE.
     ADD 1 TO CURINDEX.
     DISPLAY "TRANSACTION NUMBER: " TRANSACNUM.
     MOVE TRANSACNUM TO TRANSAC(CURINDEX).
     ADD 1 TO TRANSACNUM. 
     DISPLAY "ENTER FOREIGN CURRENCY: " WITH NO ADVANCING.
     ACCEPT FORCUR.
     IF FORCUR = "USD"
        MOVE USD TO VALCUR
        DISPLAY "ENTER AMOUNT: $" WITH NO ADVANCING
        ACCEPT AMOUNT
     ELSE IF FORCUR = "AUS"
        MOVE AUS TO VALCUR
        DISPLAY "ENTER AMOUNT: $" WITH NO ADVANCING
        ACCEPT AMOUNT
     ELSE IF FORCUR = "CND"
        MOVE CND TO VALCUR
        DISPLAY "ENTER AMOUNT: $" WITH NO ADVANCING
        ACCEPT AMOUNT
     ELSE IF FORCUR = "EUR"
        MOVE EUR TO VALCUR
        DISPLAY "ENTER AMOUNT: E" WITH NO ADVANCING
        ACCEPT AMOUNT
     ELSE IF FORCUR = "YEN"
        MOVE YEN TO VALCUR
        DISPLAY "ENTER AMOUNT: Y" WITH NO ADVANCING
        ACCEPT AMOUNT
     ELSE IF FORCUR = "NZD"
        MOVE NZD TO VALCUR
        DISPLAY "ENTER AMOUNT: $" WITH NO ADVANCING
        ACCEPT AMOUNT
     ELSE IF FORCUR = "OMN"
        MOVE OMN TO VALCUR
        DISPLAY "ENTER AMOUNT: R" WITH NO ADVANCING
        ACCEPT AMOUNT
     ELSE IF FORCUR = "SGD"
        MOVE SGD TO VALCUR
        DISPLAY "ENTER AMOUNT: $" WITH NO ADVANCING
        ACCEPT AMOUNT
     ELSE
        DISPLAY "INVALID FOREIGN CURRENCY! PLEASE TRY AGAIN!" 
        SUBTRACT 1 FROM CURINDEX
        SUBTRACT 1 FROM TRANSACNUM
        PERFORM MAIN-MENU.
     MOVE FORCUR TO CURRENCIES(CURINDEX).
     MULTIPLY AMOUNT BY VALCUR GIVING AMOUNTARR(CURINDEX).
     MOVE AMOUNTARR(CURINDEX) TO ROUNDOFF.
     DISPLAY "PHP " ROUNDOFF.
     DISPLAY "ENTER ANOTHER TRANSACTION?:[Y/N] " 
             WITH NO ADVANCING.
     ACCEPT CHOICE.
     IF CHOICE = "Y"
         PERFORM ADDTRANS
     ELSE IF CHOICE = "N"
         PERFORM MAIN-MENU
     ELSE
         DISPLAY "INVALID CHOICE! GOING BACK TO MAIN MENU"
         PERFORM MAIN-MENU.

  UPDATES.
     DISPLAY ERASE.
     DISPLAY "ENTER FOREIGN CURRENCY: " WITH NO ADVANCING.
     ACCEPT FORCUR.
     IF FORCUR = "USD"
        MOVE USD TO ROUNDOFF
        DISPLAY "RECENT VALUE: " ROUNDOFF
        DISPLAY "RATE: $" WITH NO ADVANCING
        ACCEPT NEWVAL
        MOVE NEWVAL TO USD
     ELSE IF FORCUR = "AUS"
        MOVE AUS TO ROUNDOFF
        DISPLAY "RECENT VALUE: " ROUNDOFF
        DISPLAY "RATE: $" WITH NO ADVANCING
        ACCEPT NEWVAL
        MOVE NEWVAL TO AUS
     ELSE IF FORCUR = "CND"
        MOVE CND TO ROUNDOFF
        DISPLAY "RECENT VALUE: " ROUNDOFF
        DISPLAY "RATE: $" WITH NO ADVANCING
        ACCEPT NEWVAL
        MOVE NEWVAL TO CND
     ELSE IF FORCUR = "EUR"
        MOVE EUR TO ROUNDOFF
        DISPLAY "RECENT VALUE: " ROUNDOFF
        DISPLAY "RATE: E" WITH NO ADVANCING
        ACCEPT NEWVAL
        MOVE NEWVAL TO EUR
     ELSE IF FORCUR = "YEN"
        MOVE YEN TO ROUNDOFF
        DISPLAY "RECENT VALUE: " ROUNDOFF
        DISPLAY "RATE: Y" WITH NO ADVANCING
        ACCEPT NEWVAL
        MOVE NEWVAL TO YEN
     ELSE IF FORCUR = "NZD"
        MOVE NZD TO ROUNDOFF
        DISPLAY "RECENT VALUE: " ROUNDOFF
        DISPLAY "RATE: $" WITH NO ADVANCING
        ACCEPT NEWVAL
        MOVE NEWVAL TO NZD
     ELSE IF FORCUR = "OMN"
        MOVE OMN TO ROUNDOFF
        DISPLAY "RECENT VALUE: " ROUNDOFF
        DISPLAY "RATE: R" WITH NO ADVANCING
        ACCEPT NEWVAL
        MOVE NEWVAL TO OMN
     ELSE IF FORCUR = "SGD"
        MOVE SGD TO ROUNDOFF
        DISPLAY "RECENT VALUE: " ROUNDOFF
        DISPLAY "RATE: $" WITH NO ADVANCING
        ACCEPT NEWVAL
        MOVE NEWVAL TO SGD
     ELSE
        DISPLAY "INVALID FOREIGN CURRENCY! PLEASE TRY AGAIN!" 
        PERFORM MAIN-MENU.
     DISPLAY "--GO BACK TO MAIN MENU".
     PERFORM MAIN-MENU.

UPDATE: I managed to fix the changing of the value in an array but the addition is still wrong. I found out the problem. The last value in an array adds to itself.

SUMMARIES.
 DISPLAY ERASE.
 DISPLAY "SUMMARY".
 DISPLAY "TRANSACTION NUMBER   CURRENCY   AMOUNT".
 PERFORM WITH TEST AFTER VARYING CTR FROM 1 BY 1 
       UNTIL CTR = CURINDEX

         DISPLAY "          " TRANSAC(CTR) WITH NO ADVANCING
         DISPLAY "         " WITH NO ADVANCING
         DISPLAY CURRENCIES(CTR)WITH NO ADVANCING
         MOVE AMOUNTARR(CTR) TO ROUNDOFF
         DISPLAY "      " ROUNDOFF
 END-PERFORM.

 PERFORM WITH TEST AFTER VARYING CTR1 FROM 1 BY 1 
       UNTIL CTR1 = CURINDEX
             MOVE AMOUNTARR(CTR1) TO AMOUNTTOT(CTR1)
             ADD AMOUNTTOT(CTR1) TO AMOUNTTOT(CTR1)
 END-PERFORM.

解决方案

You can't use PERFORM how you are using it. A PERFORM cannot be in any way recursive.

Even if it could, this would be "spaghetti" code: you can't tell where you are in the program, unless you know where you came from at the time. You go from one tortuous wriggly route to another.

Another problem is that you are "falling through" all over the place. If you arrive at a paragraph from the line immediately preceding it, the paragraph will execute. This explains your apparently random additions.

The code in your program is probably about there, but you need to restructure it entirely. If you look through some of the answers to COBOL questions here, you'll see some sample code to you the general idea.

This should be something like your controlling structure:

 ACCEPT CHOICE
 PERFORM UNTIL CHOICE EQUAL TO "4"
     IF CHOICE = "1"
        PERFORM ADDTRANS
     ELSE IF CHOICE = "2"
        PERFORM UPDATES
     ELSE IF CHOICE = "3"
        PERFORM SUMMARIES 
     ELSE 
        DISPLAY "INVALID CHOICE! PLEASE TRY AGAIN!"
     END-IF
     END-IF
     END-IF
     ACCEPT CHOICE
 END-PERFORM

You should change the nested-IFs to EVALUATE and you should change the tests for literal values to 88s on the field, COBOL's condition-names.

You must restructure your program. At the moment, it is unworkable, unreliable, non-portable and not of any use. However, it is only the structure (probably) that is wrong. If you get a hold on how to structure a program, and how paragraphs can be fallen-through/GO TO'd (don't do it unless you don't see a way not to, with experience there is always a way not to)/PERFORMed.

There was a recent question for which the answer was "fall-through". Have a read of that: http://stackoverflow.com/a/32885852/1927206

Remember, although the structure is wrong, the code is salvageable. It is a common mistake that COBOL beginners make, so not a big problem. Good for learning. Try to look at examples here.

这篇关于COBOL增加一个阵列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆