46 lines
1.7 KiB
Text
46 lines
1.7 KiB
Text
MODULE OrderedWords; (* find the longest words whose characters are in alphabetical order *)
|
|
IMPORT RcWords, Out, Strings;
|
|
|
|
CONST maxSorted = 1000; (* guess the maximum number of words *)
|
|
VAR maxLength, sPos, sMax : INTEGER;
|
|
sortedWords : ARRAY maxSorted + 1, RcWords.MAXLENGTH + 2 OF CHAR;
|
|
|
|
PROCEDURE isSorted( word : ARRAY OF CHAR ) : BOOLEAN;
|
|
VAR wPos, wLen : INTEGER;
|
|
ordered : BOOLEAN;
|
|
BEGIN
|
|
ordered := TRUE;
|
|
wLen := Strings.Length( word );
|
|
wPos := 1;
|
|
WHILE ( wPos < wLen ) & ordered DO
|
|
ordered := word[ wPos - 1 ] <= word[ wPos ];
|
|
INC( wPos )
|
|
END
|
|
RETURN ordered
|
|
END isSorted ;
|
|
|
|
PROCEDURE storeSortedWords( word : ARRAY OF CHAR );
|
|
VAR thisLength : INTEGER;
|
|
BEGIN
|
|
IF isSorted( word ) THEN
|
|
thisLength := Strings.Length( word );
|
|
IF thisLength >= maxLength THEN
|
|
IF thisLength > maxLength THEN
|
|
maxLength := thisLength;
|
|
sMax := -1
|
|
END;
|
|
INC( sMax );
|
|
sortedWords[ sMax ] := word
|
|
END
|
|
END
|
|
END storeSortedWords ;
|
|
|
|
BEGIN
|
|
sMax := -1;
|
|
RcWords.forEachWord( storeSortedWords );
|
|
Out.String( "Found " );Out.Int( sMax + 1, 0 );
|
|
Out.String( " ordered words of the maximum length (" );Out.Int( maxLength, 0 );Out.String( "):" );Out.Ln;
|
|
FOR sPos := 0 TO sMax DO
|
|
Out.String( " " );Out.String( sortedWords[ sPos ] );Out.Ln
|
|
END
|
|
END OrderedWords.
|