Sökning O(n) | Sökning O(log n) | Sökning O(1) | |
---|---|---|---|
Insättning O(n) | c | ||
Insättning O(log n) | d | ||
Insättning O(1) | a, b |
PROCEDURE IsPalindrome(s:ARRAY OF CHAR):BOOLEAN; VAR i,j:CARDINAL; PROCEDURE SkipChar(c:CHAR):BOOLEAN; (* Är c ett blank- eller skiljetecken *) BEGIN RETURN c<"A" (* fusklösning, eftersom siffror räknas som skiljetecken *) END SkipChar; BEGIN i:=0; j:=Length(s)-1; WHILE i<j DO WHILE SkipChar(s[i]) AND (i<j) DO INC(i) END; WHILE SkipChar(s[j]) AND (j>i) DO DEC(j) END; IF CAP(s[i])#CAP(s[j]) THEN RETURN FALSE END; INC(i); DEC(j) END; RETURN TRUE; END IsPalindrome;
TYPE Athlete = RECORD name: ARRAY [1..30] OF CHAR; country: ARRAY [1..3] OF CHAR; birth: RECORD date:Date; place:ARRAY [1..20] OF CHAR END; height,weight: REAL; shoes: ARRAY [1..20] OF CHAR; married: BOOLEAN END;
b.
(* FROM InOut IMPORT WriteString,WriteReal,WriteLn; *) PROCEDURE WriteAthlete(a:Athlete); BEGIN WriteString("Country: "); WriteString(a.country); WriteLn; WriteString("Name : "); WriteString(a.name); WriteLn; WriteString("Birth : "); WriteDate(a.birth.date); WriteString(" "); WriteString(a.birth.place); WriteLn; WriteString("Height : "); WriteReal(a.height,5,2); WriteString(" m"); WriteLn; WriteString("Weight : "); WriteReal(a.weight,5,1); WriteString(" kg"); WriteLn; WriteString("Shoes : "); WriteString(a.shoes); WriteLn; IF a.married THEN WriteString("not ") END; WriteString("married"); WriteLn END WriteAthlete;
DEFINITION MODULE Tape; FROM Movie IMPORT Movie,Minutes; TYPE RecordingList; Tape = RECORD length:Minutes; recordings:RecordingList END; PROCEDURE RecordNewMovie(VAR tape:Tape; m:Movie; VAR ok:BOOLEAN; (* blir TRUE om filmen får plats *) VAR where:Minutes); (* + fler användbara procedurer *) END Tape.
b.
IMPLEMENTATION MODULE Tape; FROM Storage IMPORT ALLOCATE; FROM Movie IMPORT Movie,Minutes,MovieLength; TYPE RecordingList = POINTER TO Recording; Recording = RECORD position: Minutes; (* var på bandet inspelningen börjar *) movie: Movie; (* vilken film som är inspelad *) next: RecordingList (* nästa film *) (* Listan ska hållas sorterad. *) END; PROCEDURE NewRecording(pos:Minutes; m:Movie; next:RecordingList):RecordingList; VAR new:RecordingList; BEGIN NEW(new); new^.position:=pos; new^.movie:=m; new^.next:=next; RETURN new END NewRecording; PROCEDURE RecordNewMovie(VAR tape:Tape; movie:Movie; VAR ok:BOOLEAN; VAR where:Minutes); PROCEDURE findFreeSpace(pos:Minutes; VAR r:RecordingList); (* pos = en position på bandet, * r = lista med inspelningar som börjar efter positionen pos *) VAR freeSpace:Minutes; BEGIN (* Räkna först ut hur mycket ledig plats det finns från pos * till början på nästa inspelning (eller slutet på banded) *) IF r=NIL THEN freeSpace:=tape.length-pos ELSE freeSpace:=r^.position-pos END; IF freeSpace>=MovieLength(movie) THEN (* Filmen får plats på position pos. *) ok:=TRUE; where:=pos; (* Stoppa in filmen på rätt plats i listan. *) r:=NewRecording(pos,movie,r) ELSIF r#NIL THEN (* Filmen får inte plats på positionen pos, men det finns fler * inspelningar på bandet. * Fortsätt med att prova vid slutet av nästa inspelning. *) findFreeSpace(pos+MovieLength(r^.movie),r^.next) ELSE (* Filmen får inte plats på positionen pos och det finns inga fler * inspelningar på bandet. Vi har alltså testat den sista luckan. * Filmen får inte plats på bandet. *) ok:=FALSE END END findFreeSpace; BEGIN (* Proceduren leter upp den första luckan där filmen får plats. *) (* Börja med att testa om filmen får plats före första inspelningen. *) findFreeSpace(0,tape.recordings) END RecordNewMovie; (* + fler användbara procedurer... *) END Tape.
MODULE calc; FROM InOut IMPORT ReadString,Done,Write,WriteString,WriteInt,WriteLn; FROM Strings IMPORT Length,StrEq; FROM Numbers IMPORT IsNumber,StringToNum; PROCEDURE Fel(ord,fel:ARRAY OF CHAR); BEGIN WriteString(ord); WriteString(fel); WriteLn HALT (* programmet stoppas *) END Fel; PROCEDURE Kalkylator; VAR it:INTEGER; PROCEDURE ReadOperand(VAR op:INTEGER); VAR ord:ARRAY [0..20] OF CHAR; BEGIN ReadString(ord); IF Done() THEN IF IsNumber(ord) THEN op:=StringToNum(ord) ELSIF StrEq(ord,"it") THEN op:=it ELSE Fel(ord," är ej en godkänd operand.") END END END ReadOperand; PROCEDURE ReadOperator(VAR op:CHAR); VAR ord: ARRAY [0..10] OF CHAR; BEGIN ReadString(ord); IF Done() THEN IF (Length(ord)#1) OR NOT ((op="+") OR (op="-") OR (op="*") OR (op="/") OR (op="=")) THEN Fel(ord," är ej en godkänd operator.") END; op:=ord[0] END END ReadOperator; VAR operand1,operand2:INTEGER; operator:CHAR; BEGIN (* Kalkylator *) it:=0; LOOP ReadOperand(operand1); IF NOT Done() THEN RETURN END; LOOP ReadOperator(operator); IF NOT Done() THEN RETURN END; IF operator="=" THEN EXIT END; ReadOperand(operand2); IF NOT Done() THEN RETURN END; CASE operator OF "+": operand1:=operand1+operand2 | "-": operand1:=operand1-operand2 | "*": operand1:=operand1*operand2 | "/": operand1:=operand1 DIV operand2 END END; it:=operand1; WriteInt(it,1); WriteLn END END Kalkylator; BEGIN WriteString("Välkommen till Thomas' Kalkylator"); WriteLn; Kalkylator END calc.