Pascal Winter 2010/11 234319 Course
Introduction Imperative and procedural programming language Designed: 1968/9 Published: 1970 Static and strong typing Static binding We will use: FreePascal 2.4.0 http://www.freepascal.org/download.var These concepts will be explained in the lectures Winter 2010/11 234319 Course
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/11 234319 Course
A basic Pascal program Program Heading program HelloWorld; { Definitions are placed here - types, variables, procedures, functions, … } begin WriteLn(‘Hello World!’); { More statements can be added here } end. Program Heading Winter 2010/11 234319 Course
A basic Pascal program Block program HelloWorld; { Definitions are placed here - types, variables, procedures, functions, … } begin WriteLn(‘Hello World!’); { More statements can be added here } end. Block Winter 2010/11 234319 Course
A basic Pascal program Declaration Part program HelloWorld; { Definitions are placed here - types, variables, procedures, functions, … } begin WriteLn(‘Hello World!’); { More statements can be added here } end. Declaration Part Winter 2010/11 234319 Course
A basic Pascal program Statement Part program HelloWorld; { Definitions are placed here - types, variables, procedures, functions, … } begin WriteLn(‘Hello World!’); { More statements can be added here } end. Statement Part Winter 2010/11 234319 Course
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/11 234319 Course
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 : 1 .. 31; month : MonthType; year : 1900 .. 2100; end; Winter 2010/11 234319 Course
Arrays in Pascal Pascal arrays are defined as follow: array [<index-type>] of <element-type> May have multiple indexes (dimensions): array [1..5 , 2..6] 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); !!! Winter 2010/11 234319 Course
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(…); Winter 2010/11 234319 Course
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/11 234319 Course
Version 1 program Sum; function sumOfMatching(s, e : integer) : integer; var sum, i : integer; begin sum := 0; for i := s to e do if ( (i mod 3 = 0) or (i mod 5 = 0) ) then sum := sum + i; end; sumOfMatching := sum; WriteLn( sumOfMatching(1,1000) ); end. Winter 2010/11 234319 Course
Version 1 What if s<0? e<0? Auxiliary Function? program Sum; function sumOfMatching(s, e : integer) : integer; var sum, i : integer; begin sum := 0; for i := s to e do if ( (i mod 3 = 0) or (i mod 5 = 0) ) then sum := sum + i; end; sumOfMatching := sum; WriteLn( sumOfMatching(1,1000) ); end. What if s<0? e<0? Auxiliary Function? Winter 2010/11 234319 Course
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; sum := 0; for i := s to e do begin if ( isMatching(i) ) then sum := sum + i; sumOfMatching := sum; begin WriteLn( sumOfMatching(1,1000) ); end. What if s>e? Winter 2010/11 234319 Course
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; sum := 0; for i := s to e do begin if ( isMatching(i) ) then sum := sum + i; sumOfMatching := sum; begin WriteLn( sumOfMatching(1,1000) ); end. Winter 2010/11 234319 Course
Version 3 What is the difference? Can it be done in C/C++? 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; sum := 0; for i := s to e do begin if ( isMatching(i) ) then sum := sum + i; sumOfMatching := sum; begin WriteLn( sumOfMatching(1,1000) ); end. What is the difference? Can it be done in C/C++? ‘3’ and ‘5’ should be inputs / consts… Winter 2010/11 234319 Course
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; sum := 0; for i := s to e do begin if (isMatching(i,div1,div2)) then sum:=sum+i; sumOfMatching := sum; begin WriteLn( sumOfMatching(1,1000, 3, 5) ); end. Winter 2010/11 234319 Course
‘div1’ and ‘div2’ are already known to nested function ‘isMatching’! 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; sum := 0; for i := s to e do begin if (isMatching(i,div1,div2)) then sum:=sum+i; sumOfMatching := sum; begin WriteLn( sumOfMatching(1,1000, 3, 5) ); end. ‘div1’ and ‘div2’ are already known to nested function ‘isMatching’! Winter 2010/11 234319 Course
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; sum := 0; for i := s to e do begin if ( isMatching(i) ) then sum := sum + i; sumOfMatching := sum; begin WriteLn( sumOfMatching(1,1000, 3, 5) ); end. Winter 2010/11 234319 Course
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/11 234319 Course
Version 6 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/11 234319 Course
Version 6 – cont. Notice the syntax – ‘@’ ... 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; WriteLn( sumOfMatching(1, 1000, @m1) ); end. Notice the syntax – ‘@’ Winter 2010/11 234319 Course
So why learn Pascal?? Still quite useful Safety Speed and Size Mixing types leads to errors. No type casting and no pointer arithmetic. Speed and Size Pascal compiler still fast. Teaching Purposes Shown to be easier to learn. Less overhead and fewer ways for a student to get a program into trouble. Winter 2010/11 234319 Course
So why learn Pascal?? – cont. Still in the market Many small-scale freeware, shareware, and open-source programs are written in Pascal or in Delphi (“Object Pascal”). We will use Pascal and Pascal-like languages in many examples and most likely in some of the exam questions. So you need to know the basics of it… Winter 2010/11 234319 Course