000600 IDENTIFICATION DIVISION. 000700 PROGRAM-ID. HC07. 000800 AUTHOR. DANIELE GIACOMINI. 000900 DATE-WRITTEN. 1985-06-19. 001000 001100 001200 ENVIRONMENT DIVISION. 001300 001400 001500 DATA DIVISION. 001600 001700 001800 WORKING-STORAGE SECTION. 001900 002000 01 RECORD-STACKS. 002100 02 SAVEZ OCCURS 100 TIMES PIC 9. 002200 02 SAVEK OCCURS 100 TIMES PIC 9. 002300 002400 01 STACK-POINTER. 002500 02 SP PIC 999. 002600 002700 01 VARIABILI-SCALARI. 002800 02 A PIC 9 VALUE 1. 002900 02 Z PIC 9. 003000 02 K PIC 9. 003100 02 TEMP PIC 9. 003200 02 J PIC 99. 003300 003400 01 RECORD-LISTA. 003500 02 LISTA OCCURS 10 TIMES PIC 9. 003600 003700 003800 PROCEDURE DIVISION. 003900 004000 MAIN. 004100 004200 DISPLAY "INSERISCI IL NUMERO DI ELEMENTI DA PERMUTARE". 004300 DISPLAY "(UNA CIFRA)". 004400 ACCEPT Z. 004500* 004600* si genera la prima permutazione con numeri in ordine 004700* crescente 004800* 004900 MOVE SPACES TO RECORD-LISTA. 005000 PERFORM GEN-PRIMA-PERMUTAZIONE VARYING J FROM 1 BY 1 005100 UNTIL J > Z. 005200 005300 PERFORM PERMUTA. 005400 005500 STOP RUN. 005600 005700 005800 GEN-PRIMA-PERMUTAZIONE. 005900 006000 MOVE J TO LISTA(J). 006100 006200 006300 PERMUTA. 006400 006500 IF Z > A 006600 THEN 006700* 006800* push 006900* 007000 COMPUTE SP = SP + 1, 007100 COMPUTE SAVEK(SP) = K, 007200* 007300* chiamata 007400* 007500 COMPUTE K = Z, 007600 PERFORM SCAMBIO-CHIAMATA-SCAMBIO, 007700* 007800* pop 007900* 008000 COMPUTE K = SAVEK(SP), 008100 COMPUTE SP = SP - 1, 008200 008300 ELSE 008400 008500 DISPLAY RECORD-LISTA. 008600 008700 008800 SCAMBIO-CHIAMATA-SCAMBIO. 008900 009000 IF K >= A 009100 THEN 009200* 009300* scambio di LISTA(K) con LISTA(Z) 009400* 009500 MOVE LISTA(K) TO TEMP, 009600 MOVE LISTA(Z) TO LISTA (K), 009700 MOVE TEMP TO LISTA (Z), 009800* 009900* push 010000* 010100 COMPUTE SP = SP + 1, 010200 COMPUTE SAVEZ(SP) = Z, 010300* 010400* chiamata 010500* 010600 COMPUTE Z = Z - 1, 010700 PERFORM PERMUTA, 010800* 010900* pop 011000* 011100 COMPUTE Z = SAVEZ(SP), 011200 COMPUTE SP = SP - 1, 011300* 011400* scambio di LISTA(K) con LISTA(Z) 011500* 011600 MOVE LISTA(K) TO TEMP, 011700 MOVE LISTA(Z) TO LISTA (K), 011800 MOVE TEMP TO LISTA (Z), 011900* 012000* push 012100* 012200 COMPUTE SP = SP + 1, 012300 COMPUTE SAVEK(SP) = K, 012400* 012500* chiamata 012600* 012700 COMPUTE K = K - 1, 012800 PERFORM SCAMBIO-CHIAMATA-SCAMBIO, 012900* 013000* pop 013100* 013200 COMPUTE K = SAVEK(SP), 013300 COMPUTE SP = SP - 1. 013400