! counting a, b, c ,... PROGRAM ex7_5 IMPLICIT NONE INTEGER :: freq(0:27) = 0, code(255) = 0, i, ichi CHARACTER :: abc*53, input*80 LOGICAL :: mask(0:27) abc = " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" ! make a code table ! 空白とアルファベット以外は code = 0 とする DO ichi = 1, 53 IF ( ichi <= 27 ) THEN code( ICHAR( abc(ichi:ichi) ) ) = ichi ELSE code( ICHAR( abc(ichi:ichi) ) ) = ichi - 26 ! 小文字の処理 END IF END DO ! sentence input and count frequency of each characters DO PRINT '(1X, A)', "Write a sentence shorter than 80 characters: " READ '(A)', input IF ( input == "" ) EXIT DO i = 1, LEN_TRIM(input) ichi = code( ICHAR( input(i:i) ) ) freq(ichi) = freq(ichi) + 1 END DO END DO ! array sorting with use of mask freq(0) = 0; mask = ( freq > 0 ) ! 論理配列式とその代入 DO WHILE( COUNT(mask) > 0 ) ! freq > 0 での最大値を調べる ichi = SUM( MAXLOC( freq, mask ) ) - 1 ! MAXLOC は要素数1の配列(注) PRINT '(5X, A1, " : ", I5)', abc(ichi:ichi), freq(ichi) mask(ichi) = .FALSE. END DO PRINT '(1X, "total = ", I5)', SUM( freq ) END PROGRAM ex7_5