1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
MODULE Ch1 EXPORTS Main;
IMPORT SIO,Integer,Text;
IMPORT CharIntPair,CharIntPairArraySort;
VAR
L1:ARRAY[0..3] OF CHAR := ARRAY OF CHAR{'R','E','P','L'};
W1:ARRAY[0..3] OF CARDINAL := ARRAY OF CARDINAL{3,2,1,4};
L2:ARRAY[0..3] OF CHAR := ARRAY OF CHAR{'A','U','R','K'};
W2:ARRAY[0..3] OF CARDINAL := ARRAY OF CARDINAL{2,4,1,3};
L3:ARRAY[0..5] OF CHAR := ARRAY OF CHAR{'O','H','Y','N','P','T'};
W3:ARRAY[0..5] OF CARDINAL := ARRAY OF CARDINAL{5,4,2,6,1,3};
PROCEDURE Compare(READONLY a,b:CharIntPair.T):[-1..1] =
BEGIN
RETURN Integer.Compare(CharIntPair.Second(a),
CharIntPair.Second(b))
END Compare;
PROCEDURE SortLetters(READONLY L:ARRAY OF CHAR;
READONLY W:ARRAY OF CARDINAL):TEXT =
VAR
A:REF ARRAY OF CharIntPair.T :=
NEW(REF ARRAY OF CharIntPair.T,NUMBER(L));
Sorted:REF ARRAY OF CHAR :=
NEW(REF ARRAY OF CHAR,NUMBER(L));
BEGIN
FOR I := FIRST(L) TO LAST(L) DO
A[I] := CharIntPair.Create(L[I],W[I])
END;
CharIntPairArraySort.Sort(A^,Compare);
FOR I := FIRST(A^) TO LAST(A^) DO
Sorted[I] := CharIntPair.First(A[I])
END;
RETURN Text.FromChars(Sorted^)
END SortLetters;
BEGIN
SIO.PutText(SortLetters(L1,W1)); SIO.Nl();
SIO.PutText(SortLetters(L2,W2)); SIO.Nl();
SIO.PutText(SortLetters(L3,W3)); SIO.Nl()
END Ch1.
|