! -------------------------------------------------------------------- ! PROGRAM Histogram: ! Given a set of scores, this program plots a histogram showing the ! number of score in the range of [0,59], [60,69], [70,79], [80,89] ! and [90,100]. In subroutine Distribute() a local array is used ! to store these counts which is, in turn, sent to subroutine ! Plot() for plotting. ! -------------------------------------------------------------------- PROGRAM Histogram IMPLICIT NONE INTEGER, PARAMETER :: SIZE = 20 ! array size INTEGER, DIMENSION(1:SIZE) :: Score ! array containing scores INTEGER :: ActualSize ! the # of scores read in INTEGER :: i READ(*,*) ActualSize, (Score(i), i = 1, ActualSize) WRITE(*,*) "Input Scores:" WRITE(*,*) (Score(i), i = 1, ActualSize) WRITE(*,*) CALL Distribute(Score, ActualSize) CONTAINS ! -------------------------------------------------------------------- ! SUBROUTINE Distribute() : ! This subroutine receives a set of scores and count the number of ! scores in the range of [0,59], [60,69], [70,79], [80,89] and ! [90,100]. A local array is used to accumulate these counts. ! -------------------------------------------------------------------- SUBROUTINE Distribute(X, N) IMPLICIT NONE INTEGER, DIMENSION(1:), INTENT(IN) :: X INTEGER, INTENT(IN) :: N INTEGER, PARAMETER :: Bucket_Size = 5 INTEGER, DIMENSION(1:Bucket_Size) :: Bucket INTEGER :: i DO i = 1, Bucket_Size ! clear the local array Bucket(i) = 0 END DO DO i = 1, N ! for each score ... SELECT CASE (X(i)) ! determine the range it lies CASE (:59) Bucket(1) = Bucket(1) + 1 CASE (60:69) Bucket(2) = Bucket(2) + 1 CASE (70:79) Bucket(3) = Bucket(3) + 1 CASE (80:89) Bucket(4) = Bucket(4) + 1 CASE (90:) Bucket(5) = Bucket(5) + 1 END SELECT END DO CALL Plot(Bucket, Bucket_Size) ! send the count to Plot() END SUBROUTINE Distribute ! -------------------------------------------------------------------- ! SUBROUTINE Plot() : ! This subroutine receives a set of count from an array and for ! each count, displays that number of '*'s on the same line. Thus, ! the result is a histogram. ! -------------------------------------------------------------------- SUBROUTINE Plot(Input, Size) IMPLICIT NONE INTEGER, DIMENSION(1:), INTENT(IN) :: Input INTEGER, INTENT(IN) :: Size INTEGER :: i, j WRITE(*,*) "Histogram:" WRITE(*,*) DO i = 1, Size WRITE(*,*) ('*', j=1,Input(i)), ' (', Input(i), ')' END DO END SUBROUTINE Plot END PROGRAM Histogram