我想写一个程序,告诉我某个n维字符的每个字母出现多少次。例如:
Character(length = 4):: char =“ hello”
程序必须给我
'H出现:'1'时间'
'E出现:'1'time'
'L出现:'2次'
'O出现:'1'时间'
这里是我所做的事情的图片,但是当然它有一些错误,并且idk如何修复它。例如,我希望它只打印每个字母一次,但是由于write(,)在第一个'do i = ...'里面,每个n重复的字母被打印n次。 / p>
答案 0 :(得分:0)
SCAN
,INDEX
,VERIFY
是处理字符串中字符搜索的最著名的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