Fortran 90:字符串的重复元素

时间:2020-07-06 21:47:56

标签: fortran

我想写一个程序,告诉我某个n维字符的每个字母出现多少次。例如:

Character(length = 4):: char =“ hello”

程序必须给我

'H出现:'1'时间'

'E出现:'1'time'

'L出现:'2次'

'O出现:'1'时间'

这里是我所做的事情的图片,但是当然它有一些错误,并且idk如何修复它。例如,我希望它只打印每个字母一次,但是由于write()在第一个'do i = ...'里面,每个n重复的字母被打印n次。 / p>

enter image description here

2 个答案:

答案 0 :(得分:0)

SCANINDEXVERIFY是处理字符串中字符搜索的最著名的Fortran内在函数。例如,这是一个不区分大小写的工作实现:

program test_hello
      implicit none

      character(len=*), parameter :: upperAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
      character(len=*), parameter :: lowerAlphabet = "abcdefghijklmnopqrstuvwxyz"
      
      call printLettersInWord("hello")

      call printLettersInWord("fortran") 

      contains

      subroutine printLettersInWord(word)
          character(len=*), intent(in) :: word

          integer :: j,letterCount(0:len(upperAlphabet))

          if (len_trim(word)<=0) return
          
          print *, 'In word <',word,'>:' 
          
          letterCount = countLetters(word)
          do j=1,len(upperAlphabet)
             if (letterCount(j)<=0) cycle
             print "(' letter ',a,' found ',i0,' times ')", upperAlphabet(j:j),letterCount(j)
          end do

      end subroutine printLettersInWord

      pure function countLetters(word) result(letterCount)
          character(len=*), intent(in) :: word
          integer :: letterCount(0:len(upperAlphabet))

          integer :: i,thisLetter

          letterCount = 0

          do i=1,len(word) 
             thisLetter = max(index(upperAlphabet,word(i:i)),index(lowerAlphabet,word(i:i)))
             letterCount(thisLetter) = letterCount(thisLetter)+1
          end do

      end function countLetters         

end program test_hello   

这将产生以下输出:

 In word <hello>:
 letter E found 1 times
 letter H found 1 times
 letter L found 2 times
 letter O found 1 times
 In word <fortran>:
 letter A found 1 times
 letter F found 1 times
 letter N found 1 times
 letter O found 1 times
 letter R found 2 times
 letter T found 1 times

答案 1 :(得分:0)

首先,在看完您的代码后,我建议不使用IMPLICIT。另外,您还有一些多余的变量,我已尝试将其删除。

此外,为了确保每个字符仅被处理一次(这是您的问题),您需要有一个附加的do循环来检查下一个字符串是否已被处理。我已经在下面提供了一个可能的答案,尽管已关闭了IMPLICIT功能,但试图与您的编码风格保持一致:

        PROGRAM MAIN
        IMPLICIT NONE
        INTEGER :: N,I,J
        CHARACTER*8 CHAAR
        LOGICAL PROCCHAR
        CHAAR = "homework"

        DO I=1,8
          N=1
C ****    FIRST CHECK THIS CHARACTER HAS NOT BEEN PROCESSED ALREADY
          PROCCHAR = .TRUE.
          DO J=1,i-1
            IF(CHAAR(I:I) == CHAAR(J:J)) THEN
              PROCCHAR = .FALSE.
            ENDIF
          ENDDO
C ****    LOOK THROUGH REST OF CHARACTER STRING. BUT ONLY IF THIS
C         CHARACTER HAS NOT BEEN PROCESSED SO FAR
          DO J=i+1,8
            IF(CHAAR(I:I) == CHAAR(J:J).AND.PROCCHAR) THEN
C             AUX = CHAAR(J:J)
              N = N + 1
            ENDIF
          ENDDO
          IF(PROCCHAR) WRITE(*,*) 'CHARAACTER ',CHAAR(I:I),' OCCURS ',N
        ENDDO
        END             

         
相关问题