好的,所以我正在做作业但后来发现我被要求为每4条记录添加页码和更改页面。由于这是一个在线课程,我认为讲座视频中没有关于页码的内容。所以主要问题是
我真的不知道该怎么做。
以下是我完成的代码:
ENVIRONMENT DIVISION.
FILE-CONTROL. SELECT STOCK-IN ASSIGN TO 'F:/CS201S13/PROJECT2.TXT'
ORGANIZATION IS LINE SEQUENTIAL.
SELECT STOCK-OUT ASSIGN TO 'F:/CS201S13/PROJECT2OUTPUT.TXT'
ORGANIZATION IS LINE SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD STOCK-IN.
01 STOCK-RECORD.
05 ST-TRANSACTION-INFORMATION.
10 ST-TRANSACTION-SHARES PIC 9(3).
10 ST-TRANSACTION-STOCK PIC X(14).
05 ST-PURCHASE-INFORMATION.
10 ST-PURCHASE-PRICE PIC 9(5)V99.
10 ST-PURCHASE-DATE.
15 ST-PURCHASE-YEAR PIC 99.
15 ST-PURCHASE-MONTH PIC 99.
15 ST-PURCHASE-DAY PIC 99.
05 ST-SALE-INFORMATION.
10 ST-SALE-PRICE PIC 9(5)V99.
10 ST-SALE-DATE.
15 ST-SALE-YEAR PIC 99.
15 ST-SALE-MONTH PIC 99.
15 ST-SALE-DAY PIC 99.
FD STOCK-OUT.
01 STOCK-RECORD-OUT.
05 ST-TRANSACTION-INFORMATION-OUT.
10 ST-TRANSACTION-SHARES-OUT PIC 9(3).
10 ST-TRANSACTION-STOCK-OUT PIC X(14).
05 TOTAL-PURCHASE PIC 9(8)V99.
05 PIC X(4).
05 TOTAL-SALE PIC 9(8)V99.
05 PIC X(4).
05 TOTAL-PROFIT PIC 9(8)V99.
05 PIC X(4).
05 ST-PURCHASE-DATE-OUT.
10 ST-PURCHASE-YEAR-OUT PIC 99.
10 PIC X VALUE '/'.
10 ST-PURCHASE-MONTH-OUT PIC 99.
10 PIC X VALUE '/'.
10 ST-PURCHASE-DAY-OUT PIC 99.
05 PIC X(4).
05 ST-SALE-DATE-OUT.
10 ST-SALE-YEAR-OUT PIC 99.
10 PIC X VALUE '/'.
10 ST-SALE-MONTH-OUT PIC 99.
10 PIC X VALUE '/'.
10 ST-SALE-DAY-OUT PIC 99.
05 PIC X(4).
05 RECORD-OUT PIC 9 VALUE 0.
05 PAGE-OUT PIC 9.
WORKING-STORAGE SECTION.
01 ARE-THERE-MORE-RECORDS PIC XXX VALUE 'YES'.
01 IS-THIS-PAGE-FULL PIC XXX VALUE 'NO '.
PROCEDURE DIVISION.
100-MAIN-PROCESS.
OPEN INPUT STOCK-IN
OUTPUT STOCK-OUT
MOVE ST-TRANSACTION-INFORMATION TO ST-TRANSACTION-INFORMATION-OUT
PERFORM UNTIL ARE-THERE-MORE-RECORDS = 'NO '
READ STOCK-IN
AT END
MOVE 'NO ' TO ARE-THERE-MORE-RECORDS
NOT AT END
PERFORM 200-PROCEDURE-RTN
ADD 1 TO RECORD-OUT
END-READ
END-PERFORM
CLOSE STOCK-IN
STOCK-OUT
STOP RUN.
200-PROCEDURE-RTN.
IF RECORD-OUT = 4
MOVE 'YES' TO IS-THIS-PAGE-FULL
MOVE 0 TO RECORD-OUT
MOVE 'NO ' TO IS-THIS-PAGE-FULL
ADD 1 TO PAGE-OUT
END-IF
MULTIPLY ST-PURCHASE-PRICE BY ST-TRANSACTION-SHARES GIVING TOTAL-PURCHASE
MULTIPLY ST-SALE-PRICE BY ST-TRANSACTION-SHARES GIVING TOTAL-SALE
SUBTRACT TOTAL-PURCHASE FROM TOTAL-SALE GIVING TOTAL-PROFIT
WRITE STOCK-RECORD-OUT.
答案 0 :(得分:5)
你们都很近,而且很远。
“关闭”,因为在将IS-THIS-PAGE-FULL设置为YES和NO之间需要一些代码。
“很远”因为你有很多事要做,而不仅仅是“修补”你拥有的东西。
程序是否正在编写输出文件(STOCK-OUT)和报告,或者是STOCK-OUT报告?如果是报告,请更改名称,以便明确它是报告,而不是输出文件。
如果这看起来很多,请不要担心。您应该学习如何在Cobol中编程,以及学习Cobol。不会在一夜之间发生。
没有特别的顺序:
你可能觉得这是很多工作。但是,将所有内容放在一起的“模板”文件中,然后每次将这些文件粘贴(甚至复制)到程序中。
您在FD中有VALUE子句。这些不符合您的想法。
您的页数有一位数,不太可能有一般申请。
为什么使用YES和NO作为文字?查看SET动词,与“条件名称”相关,使用88进行测试和“标志/开关”。
在输入打开之后但在读取记录之前,您有“移动ST-TRANSACTION-INFORMATION”,并且在程序中只有一个引用它。这不会起作用。
要阅读文件,请查看“启动阅读”方法。
读取输入 循环直到文件结束(文件状态为88) 处理数据 读输入 端环
这避免了AT END / NOT AT END,允许处理标题(如果存在)和“空文件”而不会堵塞主逻辑。代码“扩展”了标题/预告片(包括它们的正确数量),键的序列检查等,但你只需要编码一次然后“模板”它。
根据您FD中的VALUE子句,您希望RECORD-OUT为零,因此4的测试实际上会让您在第一页上获得5,之后会有4个。
您总是假设会有“利润”(正数),这是不现实的,但您不允许“利润”的签名值。
现在,报告。
对于您的报告FD,只需简单一点,即打印行的长度。
在WORKING-STORAGE中,定义所需标题和标题的数据。定义打印行的数据。由于您处于工作存储状态,因此在PROCEDURE DIVISION中为所有不具有MOVEd数据的内容添加VALUE。
如果您已经写了四个项目(或者当您的程序告诉您这个项目时)并且您有第五个项目,请编写标题和标题,记住更新页码。
我说“或者当你的程序告诉你这个”时,因为你可以将“写入的记录”的原始值设置为4.注释它,以便很清楚它是你想要的,以及为什么你想要它。原因是,你不必再处理“第一次”标题和其他事情。第一次,或者“控制中断”(我想你很快就会到达那里)将“已经在页面上完成”设置为页面的最大值,并且标题会在你想要的时候弹出。
格式化打印行。执行para打印(这是“页面已满”测试的位置)。
注意:您可以在日期中使用VALUE作为“/”s,或者您可以使用PICture中的“/”编辑字符,如下所示:
05 an-input-date PIC X(8) (can be other definitions).
...
05 date-to-print PIC X(4)/XX/XX.
...
MOVE an-input-date TO date-to-print
我喜欢看到你正在使用“最小全停/期间”。你可以再往前走一点。
MOVE an-input-date TO date-to-print
.
然后你在一个段落中得到你的最后一个句号/句号,而没有“附加”到任何特定的代码行,这使得“折腾代码”更容易,因为你不必考虑“我做需要/不需要那里的全停/句号“。
您还可以在这里查看一些Cobol问题,并了解一些常规技巧和建议。
答案 1 :(得分:2)
如果不支持LINAGE,这可能会有所帮助,也可能没有用,你必须做一些明确的计算。
*****************************************************************
* Example of LINAGE File Descriptor
* Author: Brian Tiffin
* Date: 10-July-2008
* Tectonics: $ cobc -x linage.cob
* $ ./linage <filename ["linage.cob"]>
* $ cat -n mini-report
*****************************************************************
IDENTIFICATION DIVISION.
PROGRAM-ID. linage-demo.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
select optional data-file assign to file-name
organization is line sequential
file status is data-file-status.
select mini-report assign to "mini-report".
DATA DIVISION.
FILE SECTION.
FD data-file.
01 data-record.
88 endofdata value high-values.
02 data-line pic x(80).
FD mini-report
linage is 16 lines
with footing at 15
lines at top 2
lines at bottom 2.
01 report-line pic x(80).
WORKING-STORAGE SECTION.
01 command-arguments pic x(1024).
01 file-name pic x(160).
01 data-file-status pic 99.
01 lc pic 99.
01 report-line-blank.
02 filler pic x(18) value all "*".
02 filler pic x(05) value spaces.
02 filler pic x(34)
VALUE "THIS PAGE INTENTIONALLY LEFT BLANK".
02 filler pic x(05) value spaces.
02 filler pic x(18) value all "*".
01 report-line-data.
02 body-tag pic 9(6).
02 line-3 pic x(74).
01 report-line-header.
02 filler pic x(6) VALUE "PAGE: ".
02 page-no pic 9999.
02 filler pic x(24).
02 filler pic x(5) VALUE " LC: ".
02 header-tag pic 9(6).
02 filler pic x(23).
02 filler pic x(6) VALUE "DATE: ".
02 page-date pic x(6).
01 page-count pic 9999.
PROCEDURE DIVISION.
accept command-arguments from command-line end-accept.
string
command-arguments delimited by space
into file-name
end-string.
if file-name equal spaces
move "linage.cob" to file-name
end-if.
open input data-file.
read data-file
at end
display
"File: " function trim(file-name)
" open error or empty"
end-display
go to early-exit
end-read.
open output mini-report.
write report-line
from report-line-blank
end-write.
move 1 to page-count.
accept page-date from date end-accept.
move page-count to page-no.
write report-line
from report-line-header
after advancing page
end-write.
perform readwrite-loop until endofdata.
display
"Normal termination, file name: "
function trim(file-name)
" ending status: "
data-file-status
end-display.
close mini-report.
* Goto considered harmful? Bah! :)
early-exit.
close data-file.
exit program.
stop run.
****************************************************************
readwrite-loop.
move data-record to report-line-data
move linage-counter to body-tag
write report-line from report-line-data
end-of-page
add 1 to page-count end-add
move page-count to page-no
move linage-counter to header-tag
write report-line from report-line-header
after advancing page
end-write
end-write
read data-file
at end set endofdata to true
end-read
.
*****************************************************************
* Commentary
* LINAGE is set at a 20 line logical page
* 16 body lines
* 2 top lines
* A footer line at 15 (inside the body count)
* 2 bottom lines
* Build with:
* $ cobc -x -Wall -Wtruncate linage.cob
* Evaluate with:
* $ ./linage
* This will read in linage.cob and produce a useless mini-report
* $ cat -n mini-report
*****************************************************************
END PROGRAM linage-demo.