RosettaCodeData/Task/Ordered-words/Oberon-07/ordered-words.oberon
2026-04-30 12:34:36 -04:00

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.