' ********************
' *** ARRAYWRD.LST ***
' ********************
' *** important : element with index 0 is ignored !!
'
DEFWRD "a-z"
'
> PROCEDURE max.array(VAR proc(),high)
  ' *** return highest value of array proc()
  LOCAL last,n
  last=DIM?(proc())-1
  high=proc(1)
  FOR n=2 TO last
    high=MAX(high,proc(n))
  NEXT n
RETURN
' **********
'
> PROCEDURE min.array(VAR proc(),low)
  ' *** return lowest value of array proc()
  LOCAL last,n
  last=DIM?(proc())-1
  low=proc(1)
  FOR n=2 TO last
    low=MIN(low,proc(n))
  NEXT n
RETURN
' **********
'
> PROCEDURE max.elem.array(VAR proc(),index,high)
  ' *** return index and value of highest element of array proc()
  LOCAL last,n
  last=DIM?(proc())-1
  high=proc(1)
  FOR n=2 TO last
    high=MAX(high,proc(n))
  NEXT n
  index=1
  WHILE proc(index)<high
    INC index
  WEND
RETURN
' **********
'
> PROCEDURE min.elem.array(VAR proc(),index,low)
  ' *** return index and value of lowest element of array proc()
  LOCAL last,n
  last=DIM?(proc())-1
  low=proc(1)
  FOR n=2 TO last
    low=MIN(low,proc(n))
  NEXT n
  index=1
  WHILE proc(index)>low
    INC index
  WEND
RETURN
' **********
'
> PROCEDURE max.min.array(VAR proc(),high,low)
  ' *** return highest and lowest value of array proc()
  LOCAL last,n
  last=DIM?(proc())-1
  high=proc(1)
  low=proc(1)
  FOR n=2 TO last
    high=MAX(high,proc(n))
    low=MIN(low,proc(n))
  NEXT n
RETURN
' **********
'
> PROCEDURE som.array(VAR proc(),som%)
  ' *** return sum of numbers in array proc()
  LOCAL last,n
  last=DIM?(proc())-1
  som%=0
  FOR n=1 TO last
    ADD som%,proc(n)
  NEXT n
RETURN
' **********
'
> PROCEDURE middle.array(VAR proc(),middle)
  ' *** return middle value of array proc()
  LOCAL last,med,l,u,i,j,x
  last=DIM?(proc())-1
  DIM hulp.proc(last)
  FOR i=1 TO last
    hulp.proc(i)=proc(i)
  NEXT i
  med=(last+1)/2
  l=1
  u=last
  WHILE l<u
    i=1
    j=u
    x=hulp.proc(med)
    WHILE i<=med AND j>=med
      WHILE hulp.proc(i)<x
        INC i
      WEND
      WHILE hulp.proc(j)>x
        DEC j
      WEND
      SWAP hulp.proc(i),hulp.proc(j)
      INC i
      DEC j
    WEND
    IF j<med
      l=i
    ENDIF
    IF i>med
      u=j
    ENDIF
  WEND
  mediaan=hulp.proc(med)
  ERASE hulp.proc()
RETURN
' **********
'
> PROCEDURE average.array(zero!,VAR proc(),average#,deviation#)
  ' *** return average and standard deviation of array proc()
  ' *** zero!=TRUE : use value 0 ; zero!=FALSE : ignore value 0
  LOCAL n,sum%,sum2%,i
  CLR sum%,sum2%,i
  IF zero!
    GOSUB zero.average
  ELSE
    GOSUB no.zero.average
  ENDIF
RETURN
' ***
> PROCEDURE no.zero.average
  ' *** ignore 0 in computation
  FOR n=1 TO DIM?(proc())-1
    IF proc(n)<>0
      ADD sum%,proc(n)
      ADD sum2%,proc(n)*proc(n)
      INC i
    ENDIF
  NEXT n
  average#=sum%/i
  deviation#=SQR((sum2%-sum%*sum%/i)/(i*(i-1)))
RETURN
' ***
> PROCEDURE zero.average
  ' *** use 0 in computation
  FOR n=1 TO DIM?(proc())-1
    ADD sum%,proc(n)
    ADD sum2%,proc(n)*proc(n)
    INC i
  NEXT n
  average#=sum%/i
  deviation#=SQR((sum2%-sum%*sum%/i)/(i*(i-1)))
RETURN
' **********
'
> PROCEDURE freq.array(elem,VAR proc(),freq)
  ' *** return frequency of value elem in array proc()
  LOCAL last,n
  last=DIM?(proc())-1
  freq=0
  FOR n=1 TO last
    IF proc(n)=elem
      INC freq
    ENDIF
  NEXT n
RETURN
' **********
'
> PROCEDURE freq.limit.array(limit,VAR proc(),freq)
  ' *** return frequency of all numbers >= limit in array proc()
  LOCAL last,n
  last=DIM?(proc())-1
  freq=0
  FOR n=1 TO last
    IF proc(n)>=limit
      INC freq
    ENDIF
  NEXT n
RETURN
' **********
'
> PROCEDURE all.freq.array(VAR proc(),freq())
  ' *** return frequency of all integers in array proc()
  ' *** only integers >= 0 allowed in array proc()
  ' *** frequency-array must already exist !
  ' *** integers must vary from 0 to last index of frequency-array !
  LOCAL last,max,i,j
  last=DIM?(proc())-1
  max=DIM?(freq())-1
  FOR i=0 TO max
    FOR j=1 TO last
      IF proc(j)=i
        INC freq(i)
      ENDIF
    NEXT j
  NEXT i
RETURN
' **********
'
> PROCEDURE step.freq.array(step,VAR proc(),freq())
  ' *** return frequency of all integers in array proc()
  ' *** array proc() contains multiples of step only !
  ' *** example with step=5 : 0,5,15,20,25,....95,100
  ' *** remember, freq(3) contains frequency of value 3*step !
  LOCAL last,max,i,j
  last=DIM?(proc())-1
  max=(DIM?(freq())-1)*step
  FOR i=0 TO max STEP step
    FOR j=1 TO last
      IF proc(j)=i
        INC freq(DIV(i,step))
      ENDIF
    NEXT j
  NEXT i
RETURN
' **********
'
> PROCEDURE shuffle.array(VAR proc())
  ' *** shuffle integers in array proc()
  LOCAL n,j
  FOR n=DIM?(proc())-1 DOWNTO 2
    j=RAND(n)+1                     ! random number (1 - n)
    SWAP proc(j),proc(n)
  NEXT n
RETURN
' **********
'
> PROCEDURE compress.array(VAR proc())
  ' *** remove duplicates from sorted array proc()
  ' *** dimension of array will be changed after deletions !
  LOCAL last,i,j
  last=DIM?(proc())-1
  i=2
  WHILE proc(i-1)<>proc(i) AND i<last
    INC i
  WEND
  IF proc(i-1)<>proc(i)
    INC i
  ENDIF
  j=i-1
  WHILE i<last
    INC i
    IF proc(i-1)<>proc(i)
      INC j
      proc(j)=proc(i)
    ENDIF
  WEND
  DIM new.proc(j)
  FOR i=1 TO j
    new.proc(i)=proc(i)
  NEXT i
  SWAP proc(),new.proc()
  ERASE new.proc()
RETURN
' **********
'
> PROCEDURE reverse.array(VAR proc())
  ' *** reverse array proc()
  LOCAL last,half,n
  last=DIM?(proc())-1
  half=last/2
  FOR n=1 TO half
    SWAP proc(n),proc(last+1-n)
  NEXT n
RETURN
' **********
'
