Calendar - for "REAL" programmers: Difference between revisions

Add Seed7 example
(Add Seed7 example)
Line 1,367:
27 28 29 30 31 24 25 26 27 28 29 30 28 29 30 26 27 28 29 30 31 23 24 25 26 27 28 29 28 29 30 31
31 30 </pre>
 
=={{header|Seed7}}==
Seed7 keywords are lower case, so this silly solution uses the whole Calendar Task code, with small changes and all in upper case, in a text file named "CALENDAR.TXT":
<pre>$ INCLUDE "SEED7_05.S7I";
INCLUDE "TIME.S7I";
CONST FUNC STRING: CENTER (IN STRING: STRI, IN INTEGER: LENGTH) IS
RETURN ("" LPAD (LENGTH - LENGTH(STRI)) DIV 2 <& STRI) RPAD LENGTH;
CONST PROC: PRINTCALENDAR (IN INTEGER: YEAR, IN INTEGER: COLS) IS FUNC
LOCAL
VAR TIME: DATE IS TIME.VALUE;
VAR INTEGER: DAYOFWEEK IS 0;
CONST ARRAY STRING: MONTHNAMES IS [] ("JANUARY", "FEBRUARY", "MARCH", "APRIL", "MAY", "JUNE",
"JULY", "AUGUST", "SEPTEMBER", "OCTOBER", "NOVEMBER", "DECEMBER");
VAR ARRAY ARRAY STRING: MONTHTABLE IS 12 TIMES 9 TIMES "";
VAR STRING: STR IS "";
VAR INTEGER: MONTH IS 0;
VAR INTEGER: POSITION IS 0;
VAR INTEGER: ROW IS 0;
VAR INTEGER: COLUMN IS 0;
VAR INTEGER: LINE IS 0;
BEGIN
FOR MONTH RANGE 1 TO 12 DO
MONTHTABLE[MONTH][1] := " " & CENTER(UPPER(MONTHNAMES[MONTH]), 20);
MONTHTABLE[MONTH][2] := UPPER(" MO TU WE TH FR SA SU");
DATE := DATE(YEAR, MONTH, 1);
DAYOFWEEK := DAYOFWEEK(DATE);
FOR POSITION RANGE 1 TO 43 DO
IF POSITION >= DAYOFWEEK AND POSITION - DAYOFWEEK < DAYSINMONTH(DATE.YEAR, DATE.MONTH) THEN
STR := SUCC(POSITION - DAYOFWEEK) LPAD 3;
ELSE
STR := "" LPAD 3;
END IF;
MONTHTABLE[MONTH][3 + PRED(POSITION) DIV 7] &:= STR;
END FOR;
END FOR;
WRITELN(CENTER(UPPER("[SNOOPY PICTURE]"), COLS * 24 + 4));
WRITELN(CENTER(STR(YEAR),COLS * 24 + 4));
WRITELN;
FOR ROW RANGE 1 TO SUCC(11 DIV COLS) DO
FOR LINE RANGE 1 TO 9 DO
FOR COLUMN RANGE 1 TO COLS DO
IF PRED(ROW) * COLS + COLUMN <= 12 THEN
WRITE(" " & MONTHTABLE[PRED(ROW) * COLS + COLUMN][LINE]);
END IF;
END FOR;
WRITELN;
END FOR;
END FOR;
END FUNC;
CONST PROC: MAIN IS FUNC
BEGIN
PRINTCALENDAR(1969, 3);
END FUNC;</pre>
 
Then in another program the file CALENDAR.TXT is [http://seed7.sourceforge.net/libraries/getf.htm#getf%28in_string%29 read], converted, [http://seed7.sourceforge.net/libraries/progs.htm#parseStri%28in_string,in_parseOptions,in_array_string,in_string%29 parsed] and [http://seed7.sourceforge.net/libraries/progs.htm#execute%28in_program,in_array_string,in_parseOptions,in_string%29 executed]:
<lang seed7>$ include "seed7_05.s7i";
include "getf.s7i";
include "progs.s7i";
 
const proc: main is func
local
var string: source is "";
begin
source := lower(getf("CALENDAR.TXT"));
source := replace(source, "dayofweek", "dayOfWeek");
source := replace(source, "daysinmonth", "daysInMonth");
execute(parseStri(source));
end func;</lang>
 
{{out}}
<pre> [SNOOPY PICTURE]
1969
 
JANUARY FEBRUARY MARCH
MO TU WE TH FR SA SU MO TU WE TH FR SA SU MO TU WE TH FR SA SU
1 2 3 4 5 1 2 1 2
6 7 8 9 10 11 12 3 4 5 6 7 8 9 3 4 5 6 7 8 9
13 14 15 16 17 18 19 10 11 12 13 14 15 16 10 11 12 13 14 15 16
20 21 22 23 24 25 26 17 18 19 20 21 22 23 17 18 19 20 21 22 23
27 28 29 30 31 24 25 26 27 28 24 25 26 27 28 29 30
31
APRIL MAY JUNE
MO TU WE TH FR SA SU MO TU WE TH FR SA SU MO TU WE TH FR SA SU
1 2 3 4 5 6 1 2 3 4 1
7 8 9 10 11 12 13 5 6 7 8 9 10 11 2 3 4 5 6 7 8
14 15 16 17 18 19 20 12 13 14 15 16 17 18 9 10 11 12 13 14 15
21 22 23 24 25 26 27 19 20 21 22 23 24 25 16 17 18 19 20 21 22
28 29 30 26 27 28 29 30 31 23 24 25 26 27 28 29
30
JULY AUGUST SEPTEMBER
MO TU WE TH FR SA SU MO TU WE TH FR SA SU MO TU WE TH FR SA SU
1 2 3 4 5 6 1 2 3 1 2 3 4 5 6 7
7 8 9 10 11 12 13 4 5 6 7 8 9 10 8 9 10 11 12 13 14
14 15 16 17 18 19 20 11 12 13 14 15 16 17 15 16 17 18 19 20 21
21 22 23 24 25 26 27 18 19 20 21 22 23 24 22 23 24 25 26 27 28
28 29 30 31 25 26 27 28 29 30 31 29 30
OCTOBER NOVEMBER DECEMBER
MO TU WE TH FR SA SU MO TU WE TH FR SA SU MO TU WE TH FR SA SU
1 2 3 4 5 1 2 1 2 3 4 5 6 7
6 7 8 9 10 11 12 3 4 5 6 7 8 9 8 9 10 11 12 13 14
13 14 15 16 17 18 19 10 11 12 13 14 15 16 15 16 17 18 19 20 21
20 21 22 23 24 25 26 17 18 19 20 21 22 23 22 23 24 25 26 27 28
27 28 29 30 31 24 25 26 27 28 29 30 29 30 31
</pre>
 
=={{header|Tcl}}==