b. Parametern n måste vara en VAR-parameter för att argumentvariablen x ska dubblas.
PROCEDURE dubbla(VAR n:INTEGER); BEGIN n:=2*n END dubbla;
PROCEDURE ReadLine(VAR s:ARRAY OF CHAR);
VAR i:CARDINAL; c:CHAR;
BEGIN
i:=0;
LOOP
Read(c);
IF NOT Done() OR (c=12C) THEN EXIT END;
IF i<=HIGH(s) THEN s[i]:=c END;
INC(i)
END;
IF i<=HIGH(s) THEN s[i]:=0C END
END ReadLine;
b.
PROCEDURE ReadCard(VAR n:CARDINAL);
VAR c:CHAR;
BEGIN
n:=0;
LOOP
Read(c);
IF NOT Done() OR (c<"0") OR (c>"9") THEN EXIT END;
n:=10*n+ORD(c)-ORD("0")
END
END ReadCard;
TYPE Month = (Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec);
Day = [1..31];
Date = RECORD
year:INTEGER;
month:Month;
day:Day
END;
b.
PROCEDURE WriteMonth(m:Month);
BEGIN
CASE m OF
Jan: WriteString("Januari")
|Feb: WriteString("Februari")
|Mar: WriteString("Mars")
|Apr: WriteString("April")
|May: WriteString("Maj")
|Jun: WriteString("Juni")
|Jul: WriteString("Juli")
|Aug: WriteString("Augusti")
|Sep: WriteString("September")
|Oct: WriteString("Oktober")
|Nov: WriteString("November")
|Dec: WriteString("December")
END
END WriteMonth;
PROCEDURE WriteDate(d:Date);
BEGIN
WriteCard(d.day,1); Write(" ");
WriteMonth(d.month); Write(" ");
WriteInt(d.year,1)
END WriteDate;
PROCEDURE swap(VAR a,b:CHAR);
(* En hjälpprocedur för att byta plats på två tecken *)
VAR t:CHAR;
BEGIN
t:=a; a:=b; b:=t
END swap;
PROCEDURE RevString(VAR s:ARRAY OF CHAR);
VAR n,i:INTEGER;
BEGIN
n:=Length(s);
FOR i:=0 TO n DIV 2 -1 DO
swap(s[i],s[n-1-i])
END
END RevString;
b.
PROCEDURE fac(n:CARDINAL):CARDINAL; BEGIN IF n<2 THEN RETURN 1 ELSE RETURN n*fac(n-1) END END fac;
MODULE histo;
FROM InOut IMPORT Read,Done,Write,WriteString,WriteCard,WriteLn;
TYPE Bokstav = ["A".."Z"];
Histogram = ARRAY Bokstav OF CARDINAL;
VAR b:Bokstav;
h:Histogram;
n:CARDINAL;
c:CHAR;
PROCEDURE stapel(n:CARDINAL);
VAR i:CARDINAL;
BEGIN
FOR i:=1 TO n DO
Write("*")
END;
WriteLn
END stapel;
BEGIN
FOR b:=MIN(Bokstav) TO MAX(Bokstav) DO
h[b]:=0
END;
LOOP
Read(c);
IF NOT Done() THEN EXIT END;
CASE CAP(c) OF
"A".."Z": INC(h[CAP(c)]);
ELSE
(* inget att göra *)
END
END;
FOR b:=MIN(Bokstav) TO MAX(Bokstav) DO
IF h[b]>0 THEN
Write(b); Write(" "); stapel(h[b])
END
END
END histo.
IMPLEMENTATION MODULE StringBag;
FROM Storage IMPORT ALLOCATE;
FROM InOut IMPORT WriteString,WriteCard,WriteLn;
FROM Strings IMPORT compare;
TYPE StringBag = POINTER TO Node;
Node = RECORD
str: String; (* en sträng *)
cnt: CARDINAL; (* antal kopior av denna sträng *)
left, right:StringBag
END;
PROCEDURE NewStringBag(VAR t:StringBag);
BEGIN
t:=NIL
END NewStringBag;
PROCEDURE NewLeaf(s:String):StringBag;
VAR t:StringBag;
BEGIN
NEW(t);
t^.str:=s;
t^.cnt:=1;
t^.left:=NIL;
t^.right:=NIL;
RETURN t
END NewLeaf;
PROCEDURE InsertString(s:String; VAR t:StringBag);
BEGIN
IF t=NIL THEN
t:=NewLeaf(s)
ELSE
CASE compare(s,t^.str) OF
-1: InsertString(s,t^.left)
| 1: InsertString(s,t^.right)
| 0: INC(t^.cnt)
END
END
END InsertString;
PROCEDURE CountString(s:String; t:StringBag):CARDINAL;
BEGIN
(* behövs ej *)
END CountString;
PROCEDURE WriteStringBag(t:StringBag);
BEGIN
IF t#NIL THEN
WriteStringBag(t^.left);
WriteString(t^.str); WriteCard(t^.cnt,5); WriteLn;
WriteStringBag(t^.right);
END
END WriteStringBag;
END StringBag.
b.
MODULE wordhisto;
FROM StringBag IMPORT String,StringBag,NewStringBag,InsertString,WriteStringBag;
FROM InOut IMPORT ReadString,Done;
VAR wb:StringBag;
s:String;
BEGIN
NewStringBag(wb);
LOOP
ReadString(s);
IF NOT Done() THEN EXIT END;
InsertString(s,wb)
END;
WriteStringBag(wb)
END wordhisto.