Pascal CourseWinter 2010/111
Introduction Imperative and procedural programming language Designed: 1968/9 Published: 1970 Static and strong typing Static binding We will use: – FreePascal Winter 2010/ Course These concepts will be explained in the lectures 2
A basic Pascal program program HelloWorld; { Definitions are placed here - types, variables, procedures, functions, … } begin WriteLn(‘Hello World!’); { More statements can be added here } end. Winter 2010/ Course3
A basic Pascal program program HelloWorld; { Definitions are placed here - types, variables, procedures, functions, … } begin WriteLn(‘Hello World!’); { More statements can be added here } end. Winter 2010/ Course Program Heading 4
A basic Pascal program program HelloWorld; { Definitions are placed here - types, variables, procedures, functions, … } begin WriteLn(‘Hello World!’); { More statements can be added here } end. Winter 2010/ Course Block 5
A basic Pascal program program HelloWorld; { Definitions are placed here - types, variables, procedures, functions, … } begin WriteLn(‘Hello World!’); { More statements can be added here } end. Winter 2010/ Course Declaration Part 6
A basic Pascal program program HelloWorld; { Definitions are placed here - types, variables, procedures, functions, … } begin WriteLn(‘Hello World!’); { More statements can be added here } end. Winter 2010/ Course Statement Part 7
Data Types Pascal has 4 primitive types: – integer, boolean, real, char We can also create our own types: – Enumerated types: type Color = (Red, Green, Blue, Yellow); type MonthType = (January, February,...,December); Enumerated types are comparable: Red < Blue = true, succ(Red) = Green, pred(Blue) = Green, ord(Yellow) = 3 Winter 2010/ Course8
Data Types - cont. – Subrange types: type Letter = ‘A’.. ’Z’; Index = 3.. 8; ColorList = Red.. Blue; – Records (Complex types like C structs): type date = record day : ; month : MonthType; year : ; end; Winter 2010/ Course9
Arrays in Pascal Winter 2010/ Course10 Pascal arrays are defined as follow: array [ ] of May have multiple indexes: array [1..5, 8..10] of … Example: var A : array [1..5] of real; var pens : array [Red..Green] of record width : 1..3; kind : (Regular,Bold); end; For col := Red to Yellow do writeLn(pens[col].width); !!!
Functions and Procedures Pascal functions always return a value function myFunc(…) : int; begin … myFunc := 13; {note how we set the value} … end; A function that doesn’t return anything is a procedure. procedure myProc(…); begin … end; Winter 2010/ Course11
A simple problem… Given a range of positive numbers: – Summarize all numbers in range that divide by 3 or 5. – Print the result. Winter 2010/ Course12
program Sum; function sumOfMatching(s, e : integer) : integer; var sum, i : integer; begin sum := 0; for i := s to e do begin if ( (i mod 3 = 0) or (i mod 5 = 0) ) then sum := sum + i; end; sumOfMatching := sum; end; begin WriteLn( sumOfMatching(1,1000) ); end. Version 1 Winter 2010/ Course13
Version 1 program Sum; function sumOfMatching(s, e : integer) : integer; var sum, i : integer; begin sum := 0; for i := s to e do begin if ( (i mod 3 = 0) or (i mod 5 = 0) ) then sum := sum + i; end; sumOfMatching := sum; end; begin WriteLn( sumOfMatching(1,1000) ); end. What if s<0? e<0? Auxiliary Function? Winter 2010/ Course14
Version 2 program Sum; type positiveInt = 1..MAXINT; function isMatching(i : integer) : boolean; begin isMatching := ((i mod 3 = 0) or (i mod 5 = 0)); end; function sumOfMatching(s, e : positiveInt) : integer; var sum, i : integer; begin sum := 0; for i := s to e do begin if ( isMatching(i) ) then sum := sum + i; end; sumOfMatching := sum; end; begin WriteLn( sumOfMatching(1,1000) ); end. What if s>e? Winter 2010/ Course15
Version 3 program Sum; type positiveInt = 1..MAXINT; function SumOfMatching(s, e : positiveInt) : Integer; var sum, i : integer; function isMatching(i : integer) : boolean; begin isMatching := ((i mod 3 = 0) or (i mod 5 = 0)); end; begin sum := 0; for i := s to e do begin if ( isMatching(i) ) then sum := sum + i; end; sumOfMatching := sum; end; begin WriteLn( sumOfMatching(1,1000) ); end. Winter 2010/ Course16
Version 3 program Sum; type positiveInt = 1..MAXINT; function SumOfMatching(s, e : positiveInt) : Integer; var sum, i : integer; function isMatching(i : integer) : boolean; begin isMatching := ((i mod 3 = 0) or (i mod 5 = 0)); end; begin sum := 0; for i := s to e do begin if ( isMatching(i) ) then sum := sum + i; end; sumOfMatching := sum; end; begin WriteLn( sumOfMatching(1,1000) ); end. ‘3’ and ‘5’ should be inputs / consts… What is the difference? Can it be done in C/C++? Winter 2010/ Course17
Version 4 program Sum; type positiveInt = 1..MAXINT; function sumOfMatching(s,e,div1,div2:positiveInt):integer; var sum, i : integer; function isMatching(i, d1, d2 : integer) : boolean; begin isMatching := ((i mod d1=0) or (i mod d2=0)); end; begin sum := 0; for i := s to e do begin if (isMatching(i,div1,div2)) then sum:=sum+i; end; sumOfMatching := sum; end; begin WriteLn( sumOfMatching(1,1000, 3, 5) ); end. Winter 2010/ Course18
Version 4 program Sum; type positiveInt = 1..MAXINT; function sumOfMatching(s,e,div1,div2:positiveInt):integer; var sum, i : integer; function isMatching(i, d1, d2 : integer) : boolean; begin isMatching := ((i mod d1=0) or (i mod d2=0)); end; begin sum := 0; for i := s to e do begin if (isMatching(i,div1,div2)) then sum:=sum+i; end; sumOfMatching := sum; end; begin WriteLn( sumOfMatching(1,1000, 3, 5) ); end. ‘div1’ and ‘div2’ are already known to nested function ‘isMatching’! Winter 2010/ Course19
Version 5 program Sum; type positiveInt = 1..MAXINT; function sumOfMatching(s,e,div1,div2:positiveInt):integer; var sum, i : Integer; function isMatching(i : Integer) : boolean; begin isMatching:=((i mod div1=0) or (i mod div2=0)); end; begin sum := 0; for i := s to e do begin if ( isMatching(i) ) then sum := sum + i; end; sumOfMatching := sum; end; begin WriteLn( sumOfMatching(1,1000, 3, 5) ); end. Winter 2010/ Course20
A more general solution We can also change ‘ isMatching ’ to receive a matcher - a pointer to a function, as an argument, and call it with any integer→boolean function we desire. Winter 2010/ Course21
program Sum; type positiveInt = 1..MAXINT; type matcher = function ( i:integer ) : boolean; { defining a matcher } function m1( i : integer ) : boolean; begin m1 := ((i mod 7 = 0) or (i mod 13 = 0)); end;... Winter 2010/ Course Version 6 22
... function sumOfMatching( s, e : positiveInt ; isMatching : matcher ) : integer; var sum, i : Integer; begin... for i := s to e do begin if ( isMatching(i) ) then sum := sum + i; end;... end; begin WriteLn( sumOfMatching(1, ); end. Winter 2010/ Course Version 6 – cont. Notice the syntax – 23