270 likes | 668 Views
Pascal. 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. A basic Pascal program.
E N D
Pascal 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.0http://www.freepascal.org/download.var These concepts will be explained in the lectures 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. 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. Program Heading 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. Block 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. Declaration Part 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. Statement Part 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 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; 234319 Course
Arrays in Pascal • Pascal arrays are defined as follow: array [<index-type>] of <element-type> • May have multiple indexes: • array [1..5 , 8..10] of … • Example: • var A : array [1..5] ofreal; • var pens : array [Red..Green] ofrecord • width : 1..3; • kind : (Regular,Bold); • end; • Forcol := Red to Yellow do • writeLn(pens[col].width); !!! 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(…); begin … end; 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. 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 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. 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 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? 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; 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? 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; 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. 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; 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 is the difference? Can it be done in C/C++? ‘3’ and ‘5’ should be inputs / consts… 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; 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. 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; 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’! 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; 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. 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. 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; ... 234319 Course
Version 6 – cont. ... 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. Notice the syntax – ‘@’ 234319 Course