Calendar - for "REAL" programmers: Difference between revisions

Content added Content deleted
m (→‎{{header|Racket}}: better module name)
(Initial entry for PL/I)
Line 574: Line 574:
REALPROGRAMMERSTHINKINUPPERCASEANDCHEATBYUSINGPRINT
REALPROGRAMMERSTHINKINUPPERCASEANDCHEATBYUSINGPRINT
; // MAGICAL SEMICOLON</lang>
; // MAGICAL SEMICOLON</lang>

=={{header|PL/I}}==
<lang PL/I>(SUBRG, SIZE, FOFL):
CALENDAR: PROCEDURE (YEAR) OPTIONS (MAIN);
DECLARE YEAR CHARACTER (4) VARYING;
DECLARE (A, B, C) (0:5,0:6) CHARACTER (3);
DECLARE NAME_MONTH(12) STATIC CHARACTER (9) VARYING INITIAL (
'JANUARY', 'FEBRUARY', 'MARCH', 'APRIL', 'MAY', 'JUNE',
'JULY', 'AUGUST', 'SEPTEMBER', 'OCTOBER', 'NOVEMBER', 'DECEMBER');
DECLARE I FIXED;
DECLARE (MM, MMP1, MMP2) PIC '99';

PUT EDIT (CENTER('CALENDAR FOR ' || YEAR, 67)) (A);
PUT SKIP (2);

DO MM = 1 TO 12 BY 3;
MMP1 = MM + 1; MMP2 = MM + 2;
CALL PREPARE_MONTH('01' || MM || YEAR, A);
CALL PREPARE_MONTH('01' || MMP1 || YEAR, B);
CALL PREPARE_MONTH('01' || MMP2 || YEAR, C);

PUT SKIP EDIT (CENTER(NAME_MONTH(MM), 23),
CENTER(NAME_MONTH(MMP1), 23),
CENTER(NAME_MONTH(MMP2), 23) ) (A);
PUT SKIP EDIT ((3)' M T W T F S S ') (A);
DO I = 0 TO 5;
PUT SKIP EDIT (A(I,*), B(I,*), C(I,*)) (7 A, X(2));
END;
END;

PREPARE_MONTH: PROCEDURE (START, MONTH);
DECLARE MONTH(0:5,0:6) CHARACTER (3);
DECLARE START CHARACTER (8);
DECLARE I PIC 'ZZ9';
DECLARE OFFSET FIXED;
DECLARE (J, DAY) FIXED BINARY (31);
DECLARE (THIS_MONTH, NEXT_MONTH, K) FIXED BINARY;

DAY = DAYS(START, 'DDMMYYYY');
OFFSET = WEEKDAY(DAY) - 1;
IF OFFSET = 0 THEN OFFSET = 7;
MONTH = '';
DO J = DAY BY 1;
THIS_MONTH = SUBSTR(DAYSTODATE(J, 'DDMMYYYY'), 3, 2);
NEXT_MONTH = SUBSTR(DAYSTODATE(J+1, 'DDMMYYYY'), 3, 2);
IF THIS_MONTH^= NEXT_MONTH THEN LEAVE;
END;
I = 1;
DO K = OFFSET-1 TO OFFSET+J-DAY-1;
MONTH(K/7, MOD(K,7)) = I; I = I + 1;
END;
END PREPARE_MONTH;

END CALENDAR;</lang>
See CALENDAR for result.


=={{header|Racket}}==
=={{header|Racket}}==