2015-02-09 5 views
0

Мне нужна помощь в выполнении некоторых домашних заданий COBOL. Я сделал несколько попыток, и они, похоже, не работают, как я надеюсь.Последовательные вычисления вывода файлов GPA

Мне нужно сделать программу, которая читает входной файл с информацией о студенте, а затем выводит его на терминал и выходной файл.

Мне также необходимо рассчитать 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  

место для начала было бы неплохо.

ответ

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) и сопровождается ЗАПОЛНИТЕЛЯ также X (1), чтобы представить пространство, которое следует за grade- письмо.

HOURS неявно является X (4); ЧАСЫ-9 допускает, что поле следует читать как 9,99

Тогда есть 2 пространства - другой наполнитель

Наконец, существуют точки. Это 5-значное поле с двумя макетами. Мы определяем, какой из макетов использовать (POINTS-9-99 или POINTS-99-99), глядя на POINTS-X (2) - точка означает использование POINTS-9-99, в противном случае используйте POINTS-99-99.

Я не знаю, что такое Semesterdetails.

Ваши расчетные значения должны находиться в РАБОЧЕМ ХРАНЕНИИ; вы не можете иметь предложение VALUE в FD.

Далее вы должны продумать свой процесс. Подумайте, Майкл Джексон. Шутки в сторону. Ох - не певец, компьютерный ученый.

Ваш процесс:

Начать с CURRENT-STUDENT содержащий SPACES.

Прочтите каждую запись. Если STUDENT-NAME не равно CURRENT-STUDENT (а также AT END), тогда (создайте строку отчета, обнулите ваши аккумуляторы и сохраните STUDENT-NAME в CURRENT-STUDENT.) И используйте поля в текущей записи для накопления требуемые данные.

Обратите внимание, что создание вашей строки отчета - это просто вопрос о создании различных накопленных полей в выходной записи и выполнении небольшой математической гимнастики для вычисления средних значений. Естественно, не беспокойтесь, если ТЕКУЩИЙ СТУДЕНТ содержит ПРОСТРАНСТВА.

Таким образом, предметы первой необходимости является

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 является

if current-student is not equal to spaces 
    calculate and move name, average, etc. to output-record 
    and write it 
end-if 
move student-name to current-student 
move zero to rec-counter etc, etc. 
+0

Спасибо за помощь! Это определенно поможет мне добиться большего прогресса. –

0

Как МагУ указал, что вам нужно, чтобы получить прямую запись четкости. Вы определили отдельные записи, когда вы определили каждый логический блок как отдельный уровень 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. 

Это, вероятно, не то, что вы хотите.

Посмотрите на документацию и поймите, что использует FILE STATUS на SELECT. У каждого IO должно быть (отдельно для каждого файла) поле FILE STATUS. Затем вы можете использовать поле FILE STATUS (через 88-уровневое значение со значением «10») для проверки конца файла, разрезая извилистое использование READ ... AT END ... NOT AT END .. ..

88-х годов хороши для ваших оценок, а не литералов. Обратите внимание, что при добавлении «4» лучше добавить хорошо обозначенное поле с VALUE из 4, чтобы читатель знал, что добавляется (что означает 4).

Если у вас нет сложных вычислений, вы можете предпочесть ADD 1 TO field-name над COMPUTE field-name = field-name + 1.

Если у вас есть свои оценки, вы можете использовать EVALUATE намного понятнее, чем вложенные или последовательные IF.

У вас пока нет вывода, ни файла, ни экрана. Осмотрите здесь и в других местах примеры и посмотрите, как это происходит. Лучше спросить новый вопрос, если вы застряли с этим, иначе ответы станут слишком сложными. Одна вещь за раз.

+0

Вы точно знаете, мне нужно было посмотреть больше примеров и документации, прежде чем прыгать прямо в это. Я думаю, что с самого начала меня перепутали, сделают это в будущем. Спасибо вам за помощь! –

Смежные вопросы