pascal 234319 coursewinter 2010/111. introduction imperative and procedural programming language...
TRANSCRIPT
PascalPascal
234319 CourseWinter 2010/11 1
IntroductionIntroduction• 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
Winter 2010/11 234319 Course
These concepts will be explained in the lectures
2
A basic Pascal programA basic Pascal programprogram HelloWorld;
{ Definitions are placed here - types, variables, procedures, functions, … }
beginWriteLn(‘Hello World!’);{ More statements can be added here }
end.
Winter 2010/11 234319 Course 3
A basic Pascal programA basic Pascal programprogram HelloWorld;
{ Definitions are placed here - types, variables, procedures, functions, … }
beginWriteLn(‘Hello World!’);{ More statements can be added here }
end.
Winter 2010/11 234319 Course
Program Heading
4
A basic Pascal programA basic Pascal programprogram HelloWorld;
{ Definitions are placed here - types, variables, procedures, functions, … }
beginWriteLn(‘Hello World!’);{ More statements can be added here }
end.
Winter 2010/11 234319 Course
Block
5
A basic Pascal programA basic Pascal programprogram HelloWorld;
{ Definitions are placed here - types, variables, procedures, functions, … }
beginWriteLn(‘Hello World!’);{ More statements can be added here }
end.
Winter 2010/11 234319 Course
Declaration Part
6
A basic Pascal programA basic Pascal programprogram HelloWorld;
{ Definitions are placed here - types, variables, procedures, functions, … }
beginWriteLn(‘Hello World!’);{ More statements can be added here }
end.
Winter 2010/11 234319 Course
Statement Part
7
Data TypesData 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 8
Data Types - cont.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 9
Arrays in PascalArrays in Pascal
Winter 2010/11 234319 Course 10
!!!
Functions and Procedures 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/11 234319 Course 11
A simple problem…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 12
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 1Version 1
Winter 2010/11 234319 Course 13
Version 1Version 1program 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?
AuxiliaryFunction?
Winter 2010/11 234319 Course 14
Version 2Version 2program 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/11 234319 Course 15
Version 3Version 3program 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/11 234319 Course 16
Version 3Version 3program 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/11 234319 Course 17
Version 4Version 4program 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/11 234319 Course 18
Version 4Version 4program 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/11 234319 Course 19
Version 5Version 5program 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/11 234319 Course 20
A more general solutionA 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 21
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 6Version 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, 1000, @m1) );end.
Winter 2010/11 234319 Course
Version 6 – cont.Version 6 – cont.
Notice the syntax – ‘@’
23