Zeller Pascal

  1. Zeller Pascal
  2. Zeller Java
  3. validDate Revisited – Python
  4. validDate Revisited – Java
  5. Java GUI
  6. GUI – Refinements – ComboBoxes
  7. GUI – Refinements – Error Messages
  8. GUI Refinements – Focus
  9. GUI Refinements – Today

It was my birthday this week so I got to thinking about one of my old Pascal Programs which was a program that used Zellers Algorithm or Congruence to calculate the day of the week from a given date. In this post all I wanted was to share my old Pascal program. In my next section I will go into more detail of how Zeller’s Algorithm works and then create a new solution in a more up-to-date language.

PROGRAM Zeller (input, output);

USES crt;

VAR
   day, month, year, 
   year1, year2, month1, year3, year4 : INTEGER;
   answer1, answer2 : INTEGER;
   rep : CHAR;

PROCEDURE input;
BEGIN
     WRITE('Enter Day   :- ');
     READLN(day);
     WRITE('Enter Month :- ');
     READLN(month);
     WRITE('Enter Year  :- ');
     READLN(year);
END;

PROCEDURE calculate;
BEGIN
     Year1   := TRUNC(year/100);
     Year2   := year-(year1*100);
     Year3   := TRUNC(year1/4);
     Year4   := TRUNC(year2/4);
     month1  := TRUNC((2.6*month)-5.39);
     answer1 := year3+year4+month1+day+year2-(2*year1);
     answer2 := answer1 mod 7;
     IF (answer2 < 6) AND (answer2 <> 0) THEN
        BEGIN
             answer2 := answer2 + 7;
        END;
     IF answer2 > 6 THEN
        BEGIN
             answer2 := answer2 - 7;
        END;
END;

PROCEDURE output;
BEGIN
     WRITE('The ',day,'/',month,'/',year,' was a ');
     CASE answer2 OF
          0: BEGIN
                  WRITELN('Sunday');
                  WRITELN('A child which is born on the Sabbath Day is');
                  WRITELN('fair and wise and good and gay');
             END;
          1: BEGIN
                  WRITELN('Monday');
                  WRITELN('Mondays Child is fair of face');
             END;
          2: BEGIN
                  WRITELN('Tuesday');
                  WRITELN('Tuesdays Child if Full of Grace');
             END;
          3: BEGIN
                  WRITELN('Wednesday');
                  WRITELN('Wednesdays Child is Full of Woe');
             END;
          4: BEGIN
                  WRITELN('Thursday');
                  WRITELN('Thursdays Child has Far to Go');
             END;
          5: BEGIN
                  WRITELN('Friday');
                  WRITELN('Fridays Child is Loving and Giving');
             END;
          6: BEGIN
                  WRITELN('Saturday');
                  WRITELN('Saturdays Child Works hard for its living');
             END;
     END;
END;

BEGIN
     REPEAT
           clrscr;
           input;
           IF (month = 1) OR (month = 2) THEN
              BEGIN
                   month := month + 12;
                   year  := year - 1;
              END;
           calculate;
           IF month > 12 THEN
              BEGIN
                   month := month - 12;
                   year  := year + 1;
              END;
           clrscr;
           output;
           WRITE('Do you wish to go again :- ');
           READLN(rep)
     UNTIL(rep = 'n');
END.