Download presentation
Presentation is loading. Please wait.
Published byKathryn Bradley Modified over 9 years ago
1
1 CMPE 104 Pascal (Modified slides of Tom Rethard)
2
2 Pascal Designed by Niklaus Wirth Development started in 1968 First working compiler in 1970 Pascal-70 Report was on 29 pages
3
3 Pascal Goals Goals It is teaching language Reliability Simplicity Efficiency Wirth: “the principle to include features that were well understood, in particular by implementers, and to leave out those that were still untried and unimplemented, proved to be the most successful single guideline.” 1. The language is suitable for teaching programming in a systematic way. 2. The implementation of the language is reliable and efficient, at compile-time and run-time, on all available computers.
4
4 Example Program AbsMean (input, output); const Max = 900; type index = 1.. Max; var N: 0.. Max; Data: array [index] of real; sum, avg, val: real; i: index; …
5
5 Example (con’t) begin sum := 0; readln (N); for i := 1 to N do begin readln (val); if val < 0 then Data[i] := val else Data[i] := val end; for i := 1 to N do sum = sum + Data[i]; avg := sum/N; writeln (avg); end.
6
6 Enumerations Type DayOfWeek = (Sun, Mon, Tue, Wed, Thu, Fri, Sat); Month = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec); var today, tomorrow: DayOfWeek; begin … today := Tue; tomorrow := today + 1; … today = Jan; /* type error …
7
7 Operations := succ pred = <> < > <= >=
8
8 Subrange Types var DayOfMonth 1.. 31; Restricts the range of values for DayOfMonth to the integer subrange of 1..31 Can also use in enumerations: Type WeekDay = Mon.. Fri;
9
9 Sets Set of (enumeration type(char,Boolean), subrange type) Var S, T: set of 1..10; S := [1, 2, 3, 5, 7]; T := [1..6]; If T = [1, 2, 3, 5] then …
10
10 Set Operations = <> <= subset or equal >= But: no !
11
11 Arrays Any upper or lower bound Can also use enumeration types as array indices Examples var A: array [1.. 100] of real; var HoursWorked: array [Mon.. Fri] of 0.. 24;
12
12 Arrays Var day: Mon.. Fri; TotalHours: 0..120; begin TotalHours := 0; for day := Mon to Fri do TotalHours := TotalHours + HoursWorked[day];
13
13 Arrays of Characters Any finite discrete type for index var Occur: array [char] of integer; … Occur[ch] := Occur[ch] + 1; … if Occur[‘e’] > Occur[‘t’] then …
14
14 More Complex Arrays var M: array [1..20] of array [1.. 100] of real; or var m: array [1.. 20, 1.. 100] of real;
15
15 More on Arrays Need to be static, not dynamic Must know types at compile time Dimensions are part of the array type Arrays are considered the same type if index types and base types both match
16
16 Type problems type vector = array [1.. 100] of real; var U, V, vector; function sum (x: vector): real; … begin … end {sum}; Can write var W: array [1..75] of real; But cannot write: Sum(W)
17
17 Type Problems Types of W and of x are not the same because the ranges of the indices are different!
18
18 Record Types Heterogeneous data Multiple components Various types
19
19 Records type person = record name: string; age: 16.. 100; salary: 10000.. 100000; sex: (male, female); birthdate: date; hiredate: date; end; string = packed array [1..30] of char; date = record mon: month; day: 1..31; year: 1900.. 2100; end; month = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec);
20
20 Using a Record To use a record: var newhire: person; just like any other type
21
21 Getting to the Components var newhire: person; today: date; … newhire.age := 25; newhire.sex := female; newhire.date := today;
22
22 More Possibilities if newhire.name[1] = ‘A’ then … type employeeNum = 1000.. 9999; var employees: array [employeeNum] of person; EN: employeeNum;
23
23 Making it Simpler with newhire begin age := 25; sex := female; date := today end;
24
24 Storage Groupings Homogeneous Arrays All elements are the same type Computed (dynamic) selector (subscript or index) Heterogeneous Records Elements (components) may be of different types Static selector
25
25 Variant Records Sometimes records vary from one record type to another. Think of this as a primitive form of subclassing
26
26 Variant Records type plane = record flight: 0.. 999; kind: (B727, B737, B747); status (inAir, onGround, atTerminal); altitude: 0.. 100000; heading: 0.. 359; arrival: time; destination: airport; location: airport; runway: runwayNumber; parked: airport; gate: 1.. 100; departure: time; end; {plane}
27
27 What’s Wrong? Not all data has meaning at the same time. Can imply a plane is located at one airport and is parked at another Violates security principle.
28
28 Variant Records type plane = record flight: 0.. 999; kind: (B727, B737, B747); case status: (inAir, onGround, atTerminal); inAir:( altitude: 0.. 100000; heading: 0.. 359; arrival: time; destination: airport); onGround: ( location: airport; runway: runwayNumber); atTerminal: ( parked: airport; gate: 1.. 100; departure: time); end; {plane}
29
29 Implementation flight kind status altitude heading arrival destination location runway parked gate departure
30
30 The Dreaded Pointer There is a problem with pointers and strong typing! Pascal solves this problem by typing pointers
31
31 Typed Pointers var p: ^real; x: real; c: char; begin new(p); p^ := 3.14159; c := p^; {illegal} end
32
32 Pointers with Records var p: ^plane; begin … p^.plane.parked[1] … … end;
33
33 Interpretations for equivalency Structural equivalence Structural descriptions of the types be the same Name equivalence Names must be same
34
34 Structural Equivalence var x: record id: integer; weight: real end; y: record id: integer; weight: real end; The above are the same because their structure is the same
35
35 But… Consider this type person = record id: integer; weight: real end; car = record id: integer; weight: real end; The above are the same because their structure is the same, so: car := person; according to structural equivalency is legal!
36
Name Equivalence var x: record id: integer; weight: real end; y: record id: integer; weight: real end; Is actually ambiguous, Different versions of Name Equivalence Rule differ on this example. If reinterpreted as follows, then they are different type T00029: record id: integer; weight: real end; T00030: record id: integer; weight: real end; var x: T00029; y: T00030;
37
37 Name Equivalence Issues type age = 0.. 150; var n: integer; a: age; Is n:= a legal? Pure name equivalence says no Logic says yes Revised Pascal Report says that a subrange of a type is still that type
38
38 Comparison Name Equivalence generally safer More restrictive Name Equivalence is easier to implement Simply a string comparison Structural equivalence requires a recursive function ISO Pascal specifies name Equivalence
39
39 Name Structures Pascal provides six types Constant bindings Type bindings Variable bindings Procedure and function bindings Implicit enumeration bindings Label bindings
40
40 Constant bindings const MaxData = 100; MaxData can be used almost anywhere All declarations Executable statements (for loops, etc.) Expressions BUT, not in other const declarations! const MaxDataMinus1 = MaxData –1; is not allowed
41
41 Constructors Record constructors Procedure/Function The major scope defining construct
42
42 Procedures procedure ( ); begin end;
43
43 A Problem procedure P (...);... begin... Q(...)... end; procedure Q (...);... begin... P(...)... end;
44
44 A Problem Solved procedure Q(...) forward; procedure P (...);... begin... Q(...)... end; procedure Q (...);... begin... P(...)... end;
45
45 Procedure Construction procedure ( ); begin end;
46
46 Pascal eliminates the block Simplifies name structure Complicates efficient use of memory
47
47 Control structures Reflects structured programming ideas
48
48 For Loop for := expression { to | downto } do Bounds of the loop are computed once, at loop entry => definite iterator
49
49 While Loop Also a “Leading Decision Indefinite Iterator” while do Checks at top of loop Can use “while true do....” for a loop exiting from the middle (Mid-Decision Iterator)
50
50 Repeat Loop Also “Trailing Decision Indefinite Iterator” repeat until Checks at bottom of loop
51
51 Unlabeled Case Statement Modeled according to Fortran computed goto case of,,... end case;
52
52 case I of begin... S 1... end; begin... S 2... end; begin... S 3... end; begin... S 4... end; end case; No labels are provided.
53
53 Labeled Case Statement Major contribution of Pascal case of ; ;... end case; Designed by C.A. Hoare: the most important of his many contributions to language design
54
54 Labeled Case Statement case I of 1: begin... S 1... end; 2: 3: begin... S 23... end; 4: begin... S 4... end; end case; Some dialects of Pascal add an otherwise case.
55
55 Parameter Passing Passing by reference Replaces Algol pass by name Intended to allow side effects (ie, I-O parameter usage) Passes only the address Passing by value Intended for input only parameters Side effects not allowed Done by copy-in
56
56 Pass as Constant Original specification contained this instead of pass by value Similar to C const parameter passing Allowed compiler to pass either address or value Called procedure could not modify it Elimination encourages call by reference
57
57 Procedure type vector=array[1..100] of real; var A:vector … procedure P(x:vextor); \*pass by constant begin writeln(x[1]); A[1]:=0; writeln(x[1]) end; begin P(A) end;
58
58 Pass as Constant Two orthogonal issues involved Should copy its value or use its address? Should be I or I-O parameter Approach violates the Orthogonality Principle
59
Procedure Procedure difsq (function f:real; x:real):real begin difsq:= f(x*x) – f(-x*x) end difsq(sin,theta)=sin(theta^2 ) – sin(-theta^2)
60
Procedure arguments The arguments of a formal procedure parameter shall be specified Procedure difsq (function f(y:real):real; x:real):real
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.