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 |