Category talk:ALGOL 68-rows
Appearance
Source code
This is the source of the "row related" library used by some ALGOL 68 samples on Rosetta Code.
# rows.incl.a68: array related utilities for Algol 68 RC tasks #
# prints the elements of an array of integers separated by spaces #
OP SHOW = ( []INT a68 rows list )VOID:
FOR a68 rows i FROM LWB a68 rows list TO UPB a68 rows list DO
print( ( " ", whole( a68 rows list[ a68 rows i ], 0 ) ) )
OD # SHOW # ;
# prints the elements of an array of reals separated by spaces #
OP SHOW = ( []REAL a68 rows list )VOID:
FOR a68 rows i FROM LWB a68 rows list TO UPB a68 rows list DO
print( ( " ", fixed( a68 rows list[ a68 rows i ], -14, 8 ) ) )
OD # SHOW # ;
# returns the kth lowest element of a68 rows list usng the quick select algorithm #
PRIO QUICKSELECT = 9;
OP QUICKSELECT = ( REF[]INT qs a68 rows list, INT k )INT:
IF LWB qs a68 rows list > UPB qs a68 rows list THEN
# empty a68 rows list #
0
ELSE
# non-empty a68 rows list #
# partitions the subset of p a68 rows list from p left to p right #
PROC partition = ( REF[]INT p a68 rows list, INT p left, p right, pivot index )INT:
BEGIN
# swaps elements a and b in s a68 rows list #
PROC swap = ( REF[]INT s a68 rows list, INT a, b )VOID:
BEGIN
INT a68 rows t = s a68 rows list[ a ];
s a68 rows list[ a ] := s a68 rows list[ b ];
s a68 rows list[ b ] := a68 rows t
END # swap # ;
INT pivot value = p a68 rows list[ pivot index ];
swap( p a68 rows list, pivot index, p right );
INT store index := p left;
FOR i FROM p left TO p right - 1 DO
IF p a68 rows list[ i ] < pivot value THEN
swap( p a68 rows list, store index, i );
store index +:= 1
FI
OD;
swap( p a68 rows list, p right, store index );
store index
END # partition # ;
INT qs left := LWB qs a68 rows list, qs right := UPB qs a68 rows list, result := 0;
BOOL qs found := FALSE;
WHILE NOT qs found DO
IF qs left = qs right THEN
result := qs a68 rows list[ qs left ];
qs found := TRUE
ELSE
INT pivot index
= partition( qs a68 rows list
, qs left
, qs right
, ( qs left
+ ENTIER ( ( random * ( qs right - qs left ) + 1 ) )
)
);
IF qs found := k = pivot index THEN
result := qs a68 rows list[ k ]
ELIF k < pivot index THEN
qs right := pivot index - 1
ELSE
qs left := pivot index + 1
FI
FI
OD;
result
FI # QUICKSELECT # ;
# returns the median element from a68 rows data #
OP MEDIAN = ( REF[]INT a68 rows data )REAL:
IF INT a68 rows len = ( UPB a68 rows data - LWB a68 rows data ) + 1;
INT a68 rows mid = ( a68 rows len OVER 2 ) + LWB a68 rows data;
ODD a68 rows len
THEN a68 rows data QUICKSELECT a68 rows mid
ELSE ( ( a68 rows data QUICKSELECT ( a68 rows mid - 1 )
+ a68 rows data QUICKSELECT a68 rows mid
)
/ 2
)
FI # MEDIAN # ;
# returns the average of the elements of a #
OP AVERAGE = ( []INT a68 rows a )REAL:
IF INT a68 rows len = ( UPB a68 rows a - LWB a68 rows a ) + 1;
a68 rows len < 1
THEN 0
ELSE INT a68 rows sum := 0;
FOR a68 rows i FROM LWB a68 rows a TO UPB a68 rows a DO
a68 rows sum +:= a68 rows a[ a68 rows i ]
OD;
a68 rows sum / a68 rows len
FI # AVERAGE # ;
OP AVERAGE = ( []REAL a68 rows a )REAL:
IF INT a68 rows len = ( UPB a68 rows a - LWB a68 rows a ) + 1;
a68 rows len < 1
THEN 0
ELSE REAL a68 rows sum := 0;
FOR a68 rows i FROM LWB a68 rows a TO UPB a68 rows a DO
a68 rows sum +:= a68 rows a[ a68 rows i ]
OD;
a68 rows sum / a68 rows len
FI # AVERAGE # ;
# returns the standard deviation of a68 rows a #
OP STANDARDDEVIATION = ( []INT a68 rows a )REAL:
IF INT a68 rows len = ( UPB a68 rows a - LWB a68 rows a ) + 1;
a68 rows len < 1
THEN 0
ELSE REAL a68 rows m = AVERAGE a68 rows a;
REAL a68 rows sum := 0;
FOR a68 rows i FROM LWB a68 rows a TO UPB a68 rows a DO
a68 rows sum +:= ( a68 rows a[ a68 rows i ] - a68 rows m ) ^ 2
OD;
( a68 rows sum / a68 rows len )
FI # STANDARDDEVIATION # ;
OP STANDARDDEVIATION = ( []REAL a68 rows a )REAL:
IF INT a68 rows len = ( UPB a68 rows a - LWB a68 rows a ) + 1;
a68 rows len < 1
THEN 0
ELSE REAL a68 rows m = AVERAGE a68 rows a;
REAL a68 rows sum := 0;
FOR a68 rows i FROM LWB a68 rows a TO UPB a68 rows a DO
a68 rows sum +:= ( a68 rows a[ a68 rows i ] - a68 rows m ) ^ 2
OD;
sqrt( a68 rows sum / a68 rows len )
FI # STANDARDDEVIATION # ;
IF FALSE THEN # avoid warnings from ALGOL 68G #
[ 1 : 3 ]INT qig3mm1 := ( 1, 2, 3 );
[ 1 : 3 ]REAL qrg3mm1 := ( 1, 2, 3 );
SHOW qrg3mm1; SHOW qig3mm1; print( ( AVERAGE qig3mm1, MEDIAN qig3mm1 ) );
print( ( STANDARDDEVIATION qrg3mm1, " ", STANDARDDEVIATION qig3mm1 ) )
FI;
# END rows.incl.a68 #