En esta sección: |
Este tema trata la subrutina MTHNAM a modo de ejemplo. La subrutina MTHNAM convierte un número que representa un mes en su nombre completo. La subrutina se procesa de la siguiente forma:
Referencia: |
La subrutina MTHNAM puede escribirse en FORTRAN, COBOL, PL/I, BAL Assembler o C.
Ésta es una versión FORTRAN de la subrutina MTHNAM, donde:
Es el número de doble precisión en el argumento de entrada.
Es el nombre del mes. Puesto que la cadena de caracteres 'September' tiene nueve letras, MONTH es una matriz de tres elementos. La subrutina pasa los tres elementos de vuelta a su aplicación, que los concatena en un campo.
Es una matriz de 13 por tres, bidimensional con los nombres de los meses. Los tres últimos elementos contienen el mensaje de error.
Es el número entero que representa el mes.
La subrutina es:
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
Ésta es una versión COBOL de la subrutina MTHNAM, donde:
Es un campo que contiene los nombres de los meses y el mensaje de error.
Es una matriz de 13 elementos que redefine el campo MONTH-TABLE. Cada elemento (llamado A) contiene el nombre de un mes; el último contiene el mensaje de error.
Es un elemento de la matriz MLINE.
En un campo de número entero que indexa MLINE.
Es el número entero que representa el mes.
Es el número de doble precisión en el argumento de entrada.
Es el nombre del mes correspondiente al número entero en IMTH.
La subrutina es:
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.
Ésta es una versión PL/I de la subrutina MTHNAM, donde:
Es el número de doble precisión en el argumento de entrada.
Es el nombre del mes correspondiente al número entero en MONTHNUM.
Es el número entero que representa el mes.
Es una matriz de 13 elementos con los nombres de los meses. El último elemento contiene el mensaje de error.
La subrutina es:
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;
Ésta es una versión BAL Assembler de la subrutina MTHNAM, donde:
* ===================================================================== * * 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 /*
Ésta es una versión C Assembler de la subrutina 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]; }
Puede llamar a la subrutina MTHNAM desde una solicitud de informe.
El comando DEFINE extrae la porción correspondiente al mes de la fecha de pago. A continuación, la subrutina MTHNAM la convierte al nombre completo del mes, que queda almacenado en el campo PAY_MONTH. La solicitud de informe imprime el sueldo mensual 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
La salida es:
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 |