Nesta seção: |
Este tópico discute a subrotina MTHNAM como um exemplo. A subrotina MTHNAM converte um número representando um mês em seu nome completo. A subrotina processa da seguinte forma:
Referência: |
A subrotina MTHNAM pode ser gravada em FORTRAN, COBOL, PL/I, BAL Assembler e C.
Esta é uma versão FORTRAN da subrotina MTHNAM, onde:
É o número de precisão dupla no argumento de entrada.
É o nome do mês. Já que a string de caracteres 'September' contém nove letras, MONTH é uma matriz de três elementos. A subrotina retorna os três elementos para o seu aplicativo, que os concatena em um campo.
É uma matriz bidimensional de 13 por 3 que contém os nomes dos meses. Os três últimos elementos contêm a mensagem de erro.
É o número inteiro que representa o mês.
A subrotina é:
SUBROUTINE MTHNAM (MTH,MONTH) REAL*8 MTH INTEGER*4 MONTH(3),A(13,3),IMTH DATA + A( 1,1)/'JANU'/, A( 1,2)/'ARY '/, A( 1,3)/' '/, + A( 2,1)/'FEBR'/, A( 2,2)/'UARY'/, A( 2,3)/' '/, + A( 3,1)/'MARC'/, A( 3,2)/'H '/, A( 3,3)/' '/, + A( 4,1)/'APRI'/, A( 4,2)/'L '/, A( 4,3)/' '/, + A( 5,1)/'MAY '/, A( 5,2)/' '/, A( 5,3)/' '/, + A( 6,1)/'JUNE'/, A( 6,2)/' '/, A( 6,3)/' '/, + A( 7,1)/'JULY'/, A( 7,2)/' '/, A( 7,3)/' '/, + A( 8,1)/'AUGU'/, A( 8,2)/'ST '/, A( 8,3)/' '/, + A( 9,1)/'SEPT'/, A( 9,2)/'EMBE'/, A( 9,3)/'R '/, + A(10,1)/'OCTO'/, A(10,2)/'BER '/, A(10,3)/' '/, + A(11,1)/'NOVE'/, A(11,2)/'MBER'/, A(11,3)/' '/, + A(12,1)/'DECE'/, A(12,2)/'MBER'/, A(12,3)/' '/, + A(13,1)/'**ER'/, A(13,2)/'ROR*'/, A(13,3)/'* '/ IMTH=MTH+0.000001 IF (IMTH .LT. 1 .OR. IMTH .GT. 12) IMTH=13 DO 1 I=1,3 1 MONTH(I)=A(IMTH,I) RETURN END
Esta é uma versão COBOL da subrotina MTHNAM, onde:
É um campo que contém os nomes dos meses e a mensagem de erro.
É uma matriz de 13 elementos que redefine o campo MONTH-TABLE. Cada elemento (chamado A) contém o nome do mês; o último elemento contém a mensagem de erro.
É um elemento na matriz MLINE.
É um campo inteiro que indexa MLINE.
É o número inteiro que representa o mês.
É o número de precisão dupla no argumento de entrada.
É o nome do mês que corresponde ao número inteiro em IMTH.
A subrotina é:
IDENTIFICATION DIVISION. PROGRAM-ID. MTHNAM. ENVIRONMENT DIVISION. CONFIGURATION SECTION. SOURCE-COMPUTER. IBM-370. OBJECT-COMPUTER. IBM-370. DATA DIVISION. WORKING-STORAGE SECTION. 01 MONTH-TABLE. 05 FILLER PIC X(9) VALUE 'JANUARY '. 05 FILLER PIC X(9) VALUE 'FEBRUARY '. 05 FILLER PIC X(9) VALUE 'MARCH '. 05 FILLER PIC X(9) VALUE 'APRIL '. 05 FILLER PIC X(9) VALUE 'MAY '. 05 FILLER PIC X(9) VALUE 'JUNE '. 05 FILLER PIC X(9) VALUE 'JULY '. 05 FILLER PIC X(9) VALUE 'AUGUST '. 05 FILLER PIC X(9) VALUE 'SEPTEMBER'. 05 FILLER PIC X(9) VALUE 'OCTOBER '. 05 FILLER PIC X(9) VALUE 'NOVEMBER '. 05 FILLER PIC X(9) VALUE 'DECEMBER '. 05 FILLER PIC X(9) VALUE '**ERROR**'. 01 MLIST REDEFINES MONTH-TABLE. 05 MLINE OCCURS 13 TIMES INDEXED BY IX. 10 A PIC X(9). 01 IMTH PIC S9(5) COMP. LINKAGE SECTION. 01 MTH COMP-2. 01 MONTH PIC X(9). PROCEDURE DIVISION USING MTH, MONTH. BEG-1. ADD 0.000001 TO MTH. MOVE MTH TO IMTH. IF IMTH < +1 OR > 12 SET IX TO +13 ELSE SET IX TO IMTH. MOVE A (IX) TO MONTH. GOBACK.
Esta é uma versão PL/I da subrotina MTHNAM, onde:
É o número de precisão dupla no argumento de entrada.
É o nome do mês que corresponde ao número inteiro em MONTHNUM.
É o número inteiro que representa o mês.
É a matriz de 13 elementos que contém os nomes dos meses. O último elemento contém a mensagem de erro.
A subrotina é:
MTHNAM: PROC(MTHNUM,FULLMTH) OPTIONS(COBOL); DECLARE MTHNUM DECIMAL FLOAT (16) ; DECLARE FULLMTH CHARACTER (9) ; DECLARE MONTHNUM FIXED BIN (15,0) STATIC ; DECLARE MONTH_TABLE(13) CHARACTER (9) STATIC INIT ('JANUARY', 'FEBRUARY', 'MARCH', 'APRIL', 'MAY', 'JUNE', 'JULY', 'AUGUST', 'SEPTEMBER', 'OCTOBER', 'NOVEMBER', 'DECEMBER', '**ERROR**') ; MONTHNUM = MTHNUM + 0.00001 ; IF MONTHNUM < 1 | MONTHNUM > 12 THEN MONTHNUM = 13 ; FULLMTH = MONTH_TABLE(MONTHNUM) ; RETURN; END MTHNAM;
Esta é uma versão em BAL Assembler da subrotina MTHNAM:
* ===================================================================== * * A SIMPLE MAIN ASSEMBLE ROUTINE THAT CALLS THE LE CALLABLE SERVICES * * ===================================================================== MTHNAM CEEENTRY PPA=MAINPPA,AUTO=WORKSIZE,MAIN=NO USING WORKAREA,13 * L 3,0(0,1) LOAD ADDR OF FIRST ARG INTO R3 LD 4,=D'0.0' CLEAR OUT FPR4 AND FPR5 LE 6,0(0,3) FP NUMBER IN FPR6 LPER 4,6 ABS VALUE IN FPR4 AW 4,=D'0.00001' ADD ROUNDING CONSTANT AW 4,DZERO SHIFT OUT FRACTION STD 4,FPNUM MOVE TO MEMORY L 2,FPNUM+4 INTEGER PART IN R2 TM 0(3),B'10000000' CHECK SIGN OF ORIGINAL NO BNO POS BRANCH IF POSITIVE LCR 2,2 COMPLEMENT IF NEGATIVE * POS LR 3,2 COPY MONTH NUMBER INTO R3 C 2,=F'0' IS IT ZERO OR LESS? BNP INVALID YES. SO INVALID C 2,=F'12' IS IT GREATER THAN 12? BNP VALID NO. SO VALID INVALID LA 3,13(0,0) SET R3 TO POINT TO ITEM 13 (ERROR) * VALID SR 2,2 CLEAR OUT R2 M 2,=F'9' MULTIPLY BY SHIFT IN TABLE * LA 6,MTH(3) GET ADDR OF ITEM IN R6
L 4,4(0,1) GET ADDR OF SECOND ARG IN R4 MVC 0(9,4),0(6) MOVE IN TEXT * * TERMINATE THE CEE ENVIRONMENT AND RETURN TO THE CALLER * CEETERM RC=0 * ==================================================================== * CONSTANTS * ==================================================================== DS 0D ALIGNMENT FPNUM DS D FLOATING POINT NUMBER DZERO DC X'4E00000000000000' SHIFT CONSTANT MTH DC CL9'DUMMYITEM' MONTH TABLE DC CL9'JANUARY' DC CL9'FEBRUARY' DC CL9'MARCH' DC CL9'APRIL' DC CL9'MAY' DC CL9'JUNE' DC CL9'JULY' DC CL9'AUGUST' DC CL9'SEPTEMBER' DC CL9'OCTOBER' DC CL9'NOVEMBER' DC CL9'DECEMBER' DC CL9'**ERROR**' * MAINPPA CEEPPA CONSTANTS DESCRIBING THE CODE BLOCK * ==================================================================== * THE WORKAREA AND DSA * ==================================================================== WORKAREA DSECT ORG *+CEEDSASZ LEAVE SPACE FOR THE DSA FIXED PART PLIST DS 0D PARM1 DS A PARM2 DS A PARM3 DS A PARM4 DS A PARM5 DS A * FOCPARM1 DS F SAVE FIRST PARAMETER PASSED FOCPARM2 DS F SAVE SECOND PARAMETER PASSED * DS 0D WORKSIZE EQU *-WORKAREA CEEDSA MAPPING OF THE DYNAMIC SAVE AREA CEECAA MAPPING OF THE COMMON ANCHOR AREA * END MTHNAM NOMINATE MTHNAM AS THE ENTRY POINT /*
Esta é uma versão na linguagem C da subrotina MTHNAM:
void mthnam(double *,char *); void mthnam(mth,month) double *mth; char *month; { char *nmonth[13] = {"January ", "February ", "March ", "April ", "May ", "June ", "July ", "August ", "September", "October ", "November ", "December ", "**Error**"}; int imth, loop; imth = *mth + .00001; imth = (imth < 1 || imth > 12 ? 13 : imth); for (loop=0;loop < 9;loop++) month[loop] = nmonth[imth-1][loop]; }
É possível chamar a subrotina MTHNAM a partir da solicitação de relatório.
O comando DEFINE extrai a porção do mês da data de pagamento. Em seguida, a subrotina MTHNAM a converte no nome completo do mês e armazena o nome no campo PAY_MONTH. A solicitação de relatório imprime o pagamento mensal de Alfred Stevens.
DEFINE FILE EMPLOYEE MONTH_NUM/M = PAY_DATE; PAY_MONTH/A12 = MTHNAM (MONTH_NUM, PAY_MONTH); END TABLE FILE EMPLOYEE PRINT PAY_MONTH GROSS BY EMP_ID BY FIRST NAME BY LAST_NAME BY PAY_DATE IF LN IS STEVENS END
A saída é:
EMP_ID FIRST NAME LAST_NAME PAY_DATE PAY_MONTH GROSS ------- ---------- --------- -------- --------- ------- 071382660 ALFRED STEVENS 81/11/30 NOVEMBER $833.33 81/12/31 DECEMBER $833.33 82/01/29 JANUARY $916.67 82/02/26 FEBRUARY $916.67 82/03/31 MARCH $916.67 82/04/30 APRIL $916.67 82/05/28 MAY $916.67 82/06/30 JUNE $916.67 82/07/30 JULY $916.67 82/08/31 AUGUST $916.67
Information Builders |