顺序文件输出计算GPA

时间:2015-02-09 03:37:20

标签: cobol

我需要一些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    

一个开始的地方会很好。

2 个答案:

答案 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更清晰。

您还没有任何输出,无论是文件还是屏幕。在这里和其他地方查看示例,看看情况如何。如果你遇到困难,最好问一个新问题,否则答案会变得太复杂。一次一件事。