Jump to content

Category talk:ALGOL 68-rows

From Rosetta Code

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                                                           #
Cookies help us deliver our services. By using our services, you agree to our use of cookies.