2015-12-02 2 views
0

Я изучаю COBOL, и мне трудно понять, как сортировать эту таблицу. Я не думаю, что я даже правильно реализую эту таблицу, поэтому любая помощь в том, как улучшить этот код, будет отличной. Я потерян и смущен.Как отсортировать таблицу в COBOL?

IDENTIFICATION DIVISION. 
PROGRAM-ID. STUDENT. 

DATA DIVISION. 
WORKING-STORAGE SECTION. 
01 CLASSROOM-TABLE. 
    05 STUDENT OCCURS 5 TIMES. 
     10 STUDENT1. 
      15 STUDENT1-N PIC A(25). 
      15 STUDENT1-A PIC 99. 
     10 STUDENT2. 
      15 STUDENT2-N PIC A(25). 
      15 STUDENT2-A PIC 99. 
     10 STUDENT3. 
      15 STUDENT3-N PIC A(25). 
      15 STUDENT3-A PIC 99. 
     10 STUDENT4. 
      15 STUDENT4-N PIC A(25). 
      15 STUDENT4-A PIC 99. 
     10 TEMP-STUDENT. 
      15 STUDENT-N PIC A(25). 
FIND. 

END-METHOD. 
      15 STUDENT-A PIC 99. 
01 I PIC 9 VALUE 0. 
01 J PIC 9 VALUE 1. 

PROCEDURE DIVISION. 
MAIN-PARA. 
    MOVE "MICHAELA" TO STUDENT (1) (1:25). 
    MOVE 21 TO STUDENT (1) (26:2). 
    MOVE "KEVIN" TO STUDENT (2) (1:25). 
    MOVE 25 TO STUDENT (2) (26:2). 
    MOVE "KENNY" TO STUDENT (3) (1:25). 
    MOVE 16 TO STUDENT (3) (26:2). 
    MOVE "ANDREA" TO STUDENT (4) (1:25). 
    MOVE 18 TO STUDENT (4) (26:2). 

    PERFORM PUT-ORDER. 
    PERFORM PRINT. 
STOP RUN. 

PUT-ORDER. 
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 4 
    ADD 1 TO J 
    IF STUDENT(I)(26:2) > STUDENT(J)(26:2) 
     ADD 1 TO I 
     DISPLAY "INSIDE SORT" 
     MOVE STUDENT(I)(26:2) TO STUDENT(5)(26:2) 
     MOVE STUDENT(J)(26:2) TO STUDENT(I)(26:2) 
     MOVE STUDENT(5)(26:2) TO STUDENT(J)(26:2) 
    END-IF 
END-PERFORM. 

DISPLAY "SORT IS DONE". 

END-METHOD. 

PRINT. 
    DISPLAY STUDENT (1). 
    DISPLAY STUDENT (2). 
    DISPLAY STUDENT (3). 
    DISPLAY STUDENT (4). 
    END-METHOD. 

Я знаю, что код доходит до сортировки, так как он печатает как внутри сортировки, так и сортировки. Но когда он снова печатает таблицу, все будет одинаково. Я не думаю, что я правильно повторяю таблицу, но все другие способы, которые я пробовал, дают мне ошибки.

+0

Почему вы делаете СТУДЕНТА (I) (26: 2) ????, вы должны просто сделать Student-Name (I) –

ответ

2

Это как ответ и руководство по написанию Cobol

01 CLASSROOM-TABLE. 
    05 STUDENT OCCURS 5 TIMES. 
     10 STUDENT-Name   PIC A(25). 
     10 STUDENT-Age   PIC 99. 

и процедура становится

MOVE "MICHAELA" TO STUDENT-Name (1). 
MOVE 21   TO STUDENT-Age (1). 
MOVE "KEVIN" TO STUDENT-Name (2). 
MOVE 25   TO STUDENT-Age (2). 
    ... 

Вы также можете сделать

01 CLASSROOM-TABLE. 
    05 Student-Table. 
     10 STUDENT OCCURS 5 TIMES. 
     15 STUDENT-Name  PIC A(25). 
     15 STUDENT-Age  PIC 99. 

    05 redefines Student-Table. 
    10 filler    Pic X(25) value 'MICHAELA' 
    10 filler    pic 99  value 21. 
    10 filler    Pic X(25) value 'KEVIN' 
    10 filler    pic 99  value 25. 
     .... 

Вам также потребуется для определения временного St ЮДЕНТ

05 Temp-Student   Pic x(27). 

Кобол имеет Sort Verb

например,

SORT WORK-FILE 
    ON ASCENDING KEY SALEPERSON-SRT 
    ON ASCENDING KEY INVOICE-SORT 
    INPUT PROCEDURE IS 1000-PRE-SORT 
    OUTPUT PROCEDURE IS 2000-POST-SORT 

Если вы собираетесь сделать что-то вроде в коде, проще процедура сортировки осуществить это Bubble Sort. Вы можете google it

, но в основном, как сказал rcgldr, вам нужно 2 петли

perform varying i from 1 by 1 until i > 4 
    Add 1   to i giving j 
    perform until j > 5 
     if Student-Age(i) > Student-Age(j) 
      Move Student(i)  to Temp-Student 
      Move Student(j)  to Student(i) 
      Move Temp-Student to Student(j) 
     end-if 
     add 1     to j 
    end-perform 
end-perform 
+0

Я получаю ошибки с i + 1 во втором исполнении, есть неожиданный литерал. Я попытался исправить это, создав еще одну переменную со значением 1, но тогда ошибка неожиданна «+», ожидая BY. Скобки тоже не исправить. В чем проблема с этим? Кроме того, лучше ли писать таблицу, переопределяя способ? –

+0

вам обязательно понадобится i + 1 с пробелами вокруг +; но я подозреваю, что вам нужно будет сделать это как обновлено выше; Я также зафиксировал второе выполнение и один из индексов в движении –

0

Вам нужен внутренний цикл для J, и я только идет 3.

PERFORM VARYING I FROM 1 BY 1 UNTIL I > 3 
    PERFORM VARYING J FROM I+1 BY 1 UNTIL J > 4 
     IF ... 
     END-IF 
    END-PERFORM 
END-PEFORM 

Удалить ДОБАВЛЯТЬ 1 И.

Я не знаю, нужны ли другие изменения.

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