我需要一些COBOL家庭作业的帮助。我做了几次尝试,他们似乎没有像我希望的那样工作。
我需要创建一个程序,用一些学生信息读取输入文件,然后将其输出到终端和输出文件。
我还需要根据获得的小时数和质量积来计算GPA。
我目前在创建列标题时遇到了问题,并且还添加了值来获取GPA的累积值以及其他一些内容。我有输入文件和我到目前为止所附的代码。
IDENTIFICATION DIVISION.
PROGRAM-ID. TEST3.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT StudentFile ASSIGN TO "P2In.dat"
ORGANIZATION IS LINE SEQUENTIAL.
SELECT OutputFile ASSIGN TO "Report.dat"
ORGANIZATION IS LINE SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD StudentFile.
*>Student details will only be printed once
01 StudentDetails.
05 STUDENT-NAME PIC X(16).
05 STUDENT-ID PIC X(9).
*>Semester info that will be on one line and not repeated
01 SemesterDetails.
05 SEMESTER PIC X(9).
*> Details in the class that need to be seperate
01 ClassDetails.
05 CLASS-NAME PIC X(32).
05 GRADE PIC X(2).
05 HOURS PIC X(4).
05 POINTS PIC X(2).
*>values that need to be calculated
01 CalculatedValues.
05 CUMULATIVE-GPA-IN PIC 99v99 VALUE ZERO.
05 CUMULATIVE-QP-IN PIC 99v99 VALUE ZERO.
05 CUMULATIVE-HOURS-IN PIC 99v99 VALUE ZERO.
FD OutputFile.
01 PrintLine PIC X(70).
WORKING-STORAGE SECTION.
01 SWITCHES.
05 EOF-SWITCH PIC X VALUE "N".
01 COUNTERS.
05 REC-COUNTER PIC 9(3) VALUE 0.
01 CUMULATIVE.
05 CUMULATIVE-QP PIC ZZ.99.
PROCEDURE DIVISION.
*>main paragraph, everything starts here
Main.
PERFORM Begin.
PERFORM ProcessData.
PERFORM PrintLines
UNTIL EOF-SWITCH = "Y".
*>opening read
Begin.
OPEN INPUT StudentFile
OPEN OUTPUT OutputFile
READ StudentFile
AT END
MOVE "Y" TO EOF-SWITCH
NOT AT END
COMPUTE REC-COUNTER = REC-COUNTER + 1
END-READ.
ProcessData.
READ StudentFile
AT END
MOVE "Y" TO EOF-SWITCH
NOT AT END
IF GRADE = 'A'
COMPUTE CUMULATIVE-QP = CUMULATIVE-QP + 4
ELSE
IF GRADE = 'B'
COMPUTE CUMULATIVE-QP = CUMULATIVE-QP + 3
ELSE
IF GRADE = 'C'
COMPUTE CUMULATIVE-QP = CUMULATIVE-QP + 2
ELSE
IF GRADE = 'D'
COMPUTE CUMULATIVE-QP = CUMULATIVE-QP + 1
END-IF.
*>printing out our lines to terminal
PrintLines.
READ StudentFile
AT END
MOVE "Y" TO EOF-SWITCH
NOT AT END
DISPLAY CUMULATIVE-QP
END-READ.
输入文件如下所示
TERRY ETHELBERT W1234567 FALL2014 CMPS161 ALGORITHM DSGN/IMPLMNT A 3.00 12.00
TERRY ETHELBERT W1234567 FALL2014 CMPS280 ALGORITHM DSGN/IMPLMNTII B 3.00 9.00
TERRY ETHELBERT W1234567 FALL2014 CMPS431 OPERATING SYSTEMS C 3.00 6.00
TERRY ETHELBERT W1234567 FALL2014 ENG322 TECHNICAL WRITING A 3.00 12.00
TERRY ETHELBERT W1234567 SPNG2015 MATH380 STATISTICS B 3.00 9.00
TERRY ETHELBERT W1234567 SPNG2015 HIST202 HISTORY B 3.00 9.00
TERRY ETHELBERT W1234567 SPNG2015 BIOL152 GENERAL BIOLOGY A 3.00 12.00
TERRY ETHELBERT W1234567 SPNG2015 MATH200 CALCULUS I C 5.00 10.00
一个开始的地方会很好。
答案 0 :(得分:1)
第一个问题是让你的输入记录正确。 FD必须与行布局匹配,因此它应该类似于
01 StudentDetails.
05 STUDENT-NAME PIC X(16).
05 STUDENT-ID PIC X(9).
*> Details in the class that need to be seperate
*01 ClassDetails.
05 CLASS-NAME PIC X(32).
05 GRADE PIC X(1).
05 FILLER PIC X(1).
05 HOURS.
07 HOURS-9 PIC 9.99.
05 FILLER PIC X(2).
05 POINTS.
07 POINTS-X PIC X(1) OCCURS 5.
05 POINTS-9-99 REDEFINES POINTS.
07 POINTS-9-99 PIC 9.99.
05 POINTS-99-99 REDEFINES POINTS.
07 POINTS-99-99 PIC 99.99.
请注意GRADE
是X(1),后面跟一个FILLER X(1)来表示成绩字母后面的空格。
HOURS含蓄地是X(4); HOURS-9允许该字段读取为9.99
然后有2个空格 - 另一个填充
最后,有点。这是一个包含2个布局的5个字符的字段。我们通过查看POINTS-X(2)确定要使用的布局(POINTS-9-99或POINTS-99-99) - 点表示使用POINTS-9-99,否则使用POINTS-99-99。
我不知道Semesterdetails是什么。
您的计算值应该处于工作存储状态;你不能在FD中有VALUE
条款。
接下来,您应该仔细考虑您的流程。想想Michael Jackson。认真。哦 - 不是歌手,计算机科学家。
您的流程:
从包含CURRENT-STUDENT
的{{1}}开始。
阅读每条记录。如果STUDENT-NAME不等于CURRENT-STUDENT,(以及AT END)则(生成报告行,将累加器归零并将STUDENT-NAME存储到CURRENT-STUDENT中。)并使用当前记录中的字段累积所需的数据。
请注意,生成报告行只是将各种累积字段构建到输出记录中,并进行一些数学体操来计算平均值。当然,如果CURRENT-STUDENT包含空格,请不要打扰。
所以,要点是
SPACES
并且READ studentfile
at end perform write-report-line
not at end
if student-name is not equal to current-student
perform write-report-line
end-if
perform accumulate-data.
段落是
write-report-line
答案 1 :(得分:0)
正如Magoo指出的那样,你需要直接记录你的记录。当您将每个逻辑块定义为单独的01级时,您定义了单独的记录。这与您的数据不匹配(目前我们认为这是正确的)。目前还不清楚POINTS是什么,但你的定义与数据不符。
01 RecordDetails.
03 StudentDetails.
05 STUDENT-NAME PIC X(16).
05 STUDENT-ID PIC X(9).
03 SemesterDetails.
05 SEMESTER PIC X(9).
03 ClassDetails.
05 CLASS-NAME PIC X(32).
05 GRADE PIC X(2).
05 HOURS PIC X(4).
05 POINTS PIC X(2).
你已经定义了FD的下属,所以它作为你文件的记录:
01 CalculatedValues.
05 CUMULATIVE-GPA-IN PIC 99v99 VALUE ZERO.
05 CUMULATIVE-QP-IN PIC 99v99 VALUE ZERO.
05 CUMULATIVE-HOURS-IN PIC 99v99 VALUE ZERO.
这可能不是你想要的。
查看文档并了解使用SELECT上的FILE STATUS获取的内容。每个IO都应该有(每个文件分开)FILE STATUS字段选中。然后,您可以使用FILE STATUS字段(通过值为“10”的88级)来检查文件结尾,从而减少了READ ... AT END ... NOT AT END的曲折使用。 ..
88岁对你的成绩也有好处,而不是文字。请注意,如果添加“4”,最好添加一个值为4的名称良好的字段,以便读者知道要添加的内容(4意味着什么)。除非您进行复杂的计算,否则您可能希望ADD 1 TO field-name
优先于COMPUTE field-name = field-name + 1
。
如果你有成绩测试,你会发现EVALUATE比嵌套式或顺序式IF更清晰。
您还没有任何输出,无论是文件还是屏幕。在这里和其他地方查看示例,看看情况如何。如果你遇到困难,最好问一个新问题,否则答案会变得太复杂。一次一件事。