Cobol 第一次执行后GO TO语句的问题
在使用GO-TO语句时遇到问题。假设此操作一直运行到用户键入“END”。如果我在第一次打开程序时键入“END”,它将关闭,但如果我在第一次通过时输入有效数据后键入,它将继续返回用户输入数据屏幕Cobol 第一次执行后GO TO语句的问题,cobol,goto,Cobol,Goto,在使用GO-TO语句时遇到问题。假设此操作一直运行到用户键入“END”。如果我在第一次打开程序时键入“END”,它将关闭,但如果我在第一次通过时输入有效数据后键入,它将继续返回用户输入数据屏幕 ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT USED-CAR-FILE-OUT ASSIGN TO 'USED-CAR.RPT' ORGANI
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT USED-CAR-FILE-OUT
ASSIGN TO 'USED-CAR.RPT'
ORGANIZATION IS LINE SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD USED-CAR-FILE-OUT.
01 USED-CAR-RECORD-OUT PIC X(80).
WORKING-STORAGE SECTION.
01 FIRST-RECORD PIC X(3) VALUE 'YES'.
01 ID-CODE PIC X(3).
01 TOTAL-CASH-PAYMENT PIC 9(5).
01 MONTHLY-PAYMENT PIC 9(4).
01 NUMBER-OF-MONTHS PIC 9(3).
01 TOTAL-BALANCE PIC S9(6)V99 VALUE ZEROS.
01 INTEREST-COLLECTED PIC 99V99 VALUE ZEROS.
01 MONTH-DIFF PIC 99 VALUE ZEROS.
01 MONTH-NUM PIC 99 VALUE ZEROS.
01 YEAR-NUM PIC 99 VALUE ZEROS.
01 ID-HOLD PIC X(3) VALUE SPACES.
01 PAYMENT-HOLD PIC X(3) VALUE SPACES.
01 DETAIL-LINE.
05 ID-CODE-DL PIC X(3).
05 PIC X(3) VALUE SPACES.
05 PIC X(4) VALUE 'Yr='.
05 YEAR-NUMBER-DL PIC Z9.
05 PIC X(4) VALUE SPACES.
05 PIC X(4) VALUE 'MO='.
05 MONTH-NUMBER-DL PIC Z9.
05 PIC X(4) VALUE SPACES.
05 PIC X(5) VALUE 'Pmt='.
05 PAYMENT-DL PIC $$$,$$$.
05 PIC X(4) VALUE SPACES.
05 PIC X(5) VALUE 'Int='.
05 INTEREST-EARNED-DL PIC $$$$.99.
05 PIC X(3) VALUE SPACES.
05 PIC X(5) VALUE 'Bal='.
05 BALANCE-DL PIC $$$,$$$.99.
PROCEDURE DIVISION.
100-MAIN.
OPEN OUTPUT USED-CAR-FILE-OUT
PERFORM 200-USER-INPUT THRU 299-EXIT
CLOSE USED-CAR-FILE-OUT
STOP RUN.
200-USER-INPUT.
DISPLAY 'Used Car Sales Report'
DISPLAY 'Enter the ID code (or END) - maxium three char.'
ACCEPT ID-CODE
IF ID-CODE = 'END'
GO TO 299-EXIT
END-IF
DISPLAY 'Enter the Total Cash Payment - maximum five digits'
ACCEPT TOTAL-CASH-PAYMENT
DISPLAY 'Enter the Monthly Payment - maximum four digits'
ACCEPT MONTHLY-PAYMENT
DISPLAY 'Enter the Number of Months - maximum three digits'
ACCEPT NUMBER-OF-MONTHS
PERFORM 300-RECORD-PROCESS.
299-EXIT.
EXIT.
300-RECORD-PROCESS.
IF TOTAL-CASH-PAYMENT > 0
IF FIRST-RECORD = 'YES'
MOVE ID-CODE TO ID-CODE-DL
MOVE 1 TO YEAR-NUMBER-DL
MOVE 1 TO YEAR-NUM
move 1 to MONTH-NUMBER-DL
MOVE TOTAL-CASH-PAYMENT TO PAYMENT-DL
MOVE PAYMENT-DL TO MONTHLY-PAYMENT
ADD MONTHLY-PAYMENT TO TOTAL-BALANCE
MOVE 'NO' TO FIRST-RECORD
END-IF
COMPUTE INTEREST-COLLECTED ROUNDED = TOTAL-BALANCE
* .0175 / 12
MOVE INTEREST-COLLECTED TO INTEREST-EARNED-DL
ADD INTEREST-COLLECTED TO TOTAL-BALANCE
MOVE TOTAL-BALANCE TO BALANCE-DL
ADD 1 TO MONTH-DIFF
MOVE MONTH-DIFF TO MONTH-NUMBER-DL
IF MONTH-NUMBER-DL > 13
ADD 1 TO MONTH-NUM
MOVE MONTH-NUM TO MONTH-NUMBER-DL
END-IF
IF MONTH-NUMBER-DL = 13
MOVE 1 TO MONTH-NUM
MOVE MONTH-NUM TO MONTH-NUMBER-DL
END-IF
IF MONTH-NUM = 1
ADD 1 TO YEAR-NUM
MOVE YEAR-NUM TO YEAR-NUMBER-DL
END-IF
MOVE DETAIL-LINE TO USED-CAR-RECORD-OUT
WRITE USED-CAR-RECORD-OUT
AFTER ADVANCING 1 LINE
MOVE ID-HOLD TO ID-CODE-DL
IF MONTH-DIFF < NUMBER-OF-MONTHS
PERFORM 300-RECORD-PROCESS
END-IF
PERORM 200-USER-INPUT
END-IF
IF MONTHLY-PAYMENT > 0
IF FIRST-RECORD = 'YES'
MOVE ID-CODE TO ID-CODE-DL
MOVE 1 TO YEAR-NUMBER-DL
MOVE 1 TO YEAR-NUM
move 1 to MONTH-NUMBER-DL
MOVE 'NO' TO FIRST-RECORD
END-IF
MOVE MONTHLY-PAYMENT TO PAYMENT-DL
MOVE PAYMENT-DL TO MONTHLY-PAYMENT
ADD MONTHLY-PAYMENT TO TOTAL-BALANCE
COMPUTE INTEREST-COLLECTED ROUNDED = TOTAL-BALANCE
* .0175 / 12
MOVE INTEREST-COLLECTED TO INTEREST-EARNED-DL
ADD INTEREST-COLLECTED TO TOTAL-BALANCE
MOVE TOTAL-BALANCE TO BALANCE-DL
ADD 1 TO MONTH-DIFF
MOVE MONTH-DIFF TO MONTH-NUMBER-DL
IF MONTH-NUMBER-DL > 13
ADD 1 TO MONTH-NUM
MOVE MONTH-NUM TO MONTH-NUMBER-DL
END-IF
IF MONTH-NUMBER-DL = 13
MOVE 1 TO MONTH-NUM
MOVE MONTH-NUM TO MONTH-NUMBER-DL
END-IF
IF MONTH-NUM = 1
ADD 1 TO YEAR-NUM
MOVE YEAR-NUM TO YEAR-NUMBER-DL
END-IF
MOVE DETAIL-LINE TO USED-CAR-RECORD-OUT
WRITE USED-CAR-RECORD-OUT
AFTER ADVANCING 1 LINE
MOVE ID-HOLD TO ID-CODE-DL
IF TOTAL-CASH-PAYMENT > 0
MOVE 0 TO TOTAL-CASH-PaYMENT
MOVE 0 TO PAYMENT-DL
END-IF
IF MONTH-DIFF < NUMBER-OF-MONTHS
PERFORM 300-RECORD-PROCESS
END-IF
PERFORM 200-USER-INPUT
END-IF.
环境部。
输入输出部分。
文件控制。
选择二手车归档
分配到“USED-CAR.RPT”
组织是按行顺序的。
数据司。
文件部分。
FD二手车档案。
01二手车记录图X(80)。
工作和储存科。
01第一次记录PIC X(3)值“是”。
01识别码图X(3)。
01总现金支付图9(5)。
01月付款图9(4)。
01月数图9(3)。
01总平衡PIC S9(6)V99值为零。
01利息收集PIC 99V99值为零。
01个月差异PIC 99值为零。
01 MONTH-NUM PIC 99值为零。
01 YEAR-NUM PIC 99值为零。
01 ID-HOLD PIC X(3)个值空间。
01付款挂起PIC X(3)个值空间。
01详图-LINE。
05 ID-CODE-DL图X(3)。
05 PIC X(3)值空间。
05 PIC X(4)值“Yr=”。
05岁数字-DL图Z9。
05 PIC X(4)值空间。
05 PIC X(4)值“MO=”。
05月号-DL图Z9。
05 PIC X(4)值空间。
05 PIC X(5)值“Pmt=”。
05付款-DL PIC$$$,$$$。
05 PIC X(4)值空间。
05 PIC X(5)值“Int=”。
05利息收入-DL PIC$$$.99。
05 PIC X(3)值空间。
05 PIC X(5)值“Bal=”。
05余额-DL PIC$$$,$$$.99。
程序司。
100-MAIN。
打开输出二手车文件输出
通过299-EXIT执行200-USER-INPUT
关闭二手车档案
停,跑。
200-用户输入。
显示“二手车销售报告”
显示“输入ID代码(或结束)-最大三字符”
接受识别码
如果ID-CODE='END'
去299号出口
端到端IF
显示“输入现金支付总额-最多五位数”
接受全额现金支付
显示“输入每月付款-最多四位数”
接受按月付款
显示“输入月数-最多三位数”
接受月数
执行300-RECORD-PROCESS。
299-出口。
出口
300-记录过程。
如果现金支付总额>0
如果第一条记录='是'
将ID-CODE移动到ID-CODE-DL
将1移到年份编号DL
将1移到第1年
将1移动到MONTH-NUMBER-DL
将“现金支付总额”移动到“付款总额”
将PAYMENT-DL移至MONTHLY-PAYMENT
将每月付款添加到总余额中
将“否”移动到第一记录
端到端IF
计算计息四舍五入=总余额
* .0175 / 12
将已收利息移动到已赚利息DL
将收取的利息添加到总余额中
将TOTAL-BALANCE移至BALANCE-DL
将1添加到月差
将月差移动到月数DL
如果月数DL>13
将1添加到MONTH-NUM
将MONTH-NUM移动到MONTH-NUMBER-DL
端到端IF
如果月数DL=13
将1移动到月数
将MONTH-NUM移动到MONTH-NUMBER-DL
端到端IF
如果MONTH-NUM=1
将1添加到YEAR-NUM
将YEAR-NUM移动到YEAR-NUMBER-DL
端到端IF
将明细行移动到二手车记录输出
写出二手车记录
前进1行后
将ID-HOLD移动到ID-CODE-DL
如果月差<月数
执行300记录过程
端到端IF
PERORM 200-用户输入
端到端IF
如果每月付款>0
如果第一条记录='是'
将ID-CODE移动到ID-CODE-DL
将1移到年份编号DL
将1移到第1年
将1移动到MONTH-NUMBER-DL
将“否”移动到第一记录
端到端IF
将每月付款移动到每月付款
将PAYMENT-DL移至MONTHLY-PAYMENT
将每月付款添加到总余额中
计算计息四舍五入=总余额
* .0175 / 12
将已收利息移动到已赚利息DL
将收取的利息添加到总余额中
将TOTAL-BALANCE移至BALANCE-DL
将1添加到月差
将月差移动到月数DL
如果月数DL>13
将1添加到MONTH-NUM
将MONTH-NUM移动到MONTH-NUMBER-DL
端到端IF
如果月数DL=13
将1移动到月数
将MONTH-NUM移动到MONTH-NUMBER-DL
端到端IF
如果MONTH-NUM=1
将1添加到YEAR-NUM
将YEAR-NUM移动到YEAR-NUMBER-DL
端到端IF
将明细行移动到二手车记录输出
写出二手车记录
前进1行后
将ID-HOLD移动到ID-CODE-DL
如果现金支付总额>0
将0移动到现金支付总额
将0移动到PAYMEN
repeat until end of input
get some input
if there is input to process
process the input
PERFORM 200-USER-INPUT
UNTIL ID-CODE = 'END'.
IF NOT USER-INPUT-ENDED
DISPLAY 'Enter the Total Cash Payment - maximum five digits'
ACCEPT TOTAL-CASH-PAYMENT
...
ACCEPT NUMBER-OF-MONTHS
PERFORM 300-RECORD-PROCESS.
IF NOT USER-INPUT-ENDED
PERFORM 210-ACCEPT-DETAILS.
210-ACCEPT-DETAILS.
DISPLAY 'Enter the Total Cash Payment - maximum five digits'.
ACCEPT TOTAL-CASH-PAYMENT.
...
ACCEPT NUMBER-OF-MONTHS.
PERFORM 300-RECORD-PROCESS.
PERFORM 300-RECORD-PROCESS
UNTIL TOTAL-BALANCE = 0.
MAIN:perform user-input until end-detected.
user-input: get user data; perform calculations until balance is zero.
calculations: one month's calculations at a time.
IF MONTHLY-PAYMENT IS LESS THAN INTEREST-COLLECTED
MOVE 'ERR' TO ID-CODE.
100-MAIN.
PERFORM 200-USER-INPUT THRU 299-EXIT
200-USER-INPUT.
IF some condition GO TO 299-EXIT
...
PERFORM 300-RECORD-PROCESS
.
299-EXIT.
300-RECORD-PROCESS.
...
PERFORM 200-USER-INPUT