Fortran 如何反转字符链?
我必须创建一个反转短语的程序 例如:当我写Fortran 如何反转字符链?,fortran,Fortran,我必须创建一个反转短语的程序 例如:当我写hello guys时,我想要syug olleh 这就是我目前所拥有的,但我不知道如何颠倒黑板上的字符短语: program reversing implicit none character(len=20),dimension(1:20)::phraseT character(len=20)::phrase,reverse integer::i,x write(*,*)"write a phrase :"
hello guys
时,我想要syug olleh
这就是我目前所拥有的,但我不知道如何颠倒黑板上的字符短语:
program reversing
implicit none
character(len=20),dimension(1:20)::phraseT
character(len=20)::phrase,reverse
integer::i,x
write(*,*)"write a phrase :"
read(*,'(a)')phrase
x=len(trim(phrase))
nomT(1:20)=" "
do i=1,x
nomT(i:i)=trim(phrase(i:i))
end do
write(*,*)nomT
end program reversing
一个简单的方法
character(80) :: string = "Whatttt's up doc?"
character :: temp
integer :: i, length
write (*,*) string ! Writes it out proper.
length = len_trim(string) ! ignores trailing blanks.
! use len(string) to reverse those as well
do i = 1, length/2
temp = string(i:i)
string(i:i) = string(length+1-i:length+1-i)
string(length+1-i:length+1-i) = temp
end do
write(*,*) string ! Writes it out backwards.
end
其他人肯定会想出更聪明(更短)的方法。一个简单的方法
character(80) :: string = "Whatttt's up doc?"
character :: temp
integer :: i, length
write (*,*) string ! Writes it out proper.
length = len_trim(string) ! ignores trailing blanks.
! use len(string) to reverse those as well
do i = 1, length/2
temp = string(i:i)
string(i:i) = string(length+1-i:length+1-i)
string(length+1-i:length+1-i) = temp
end do
write(*,*) string ! Writes it out backwards.
end
其他人肯定会想出更聪明(更短)的方法。这里有一个更短的方法:
forall (i=1:len(string)) string(i:i) = string(len(string)-i+1:len(string)-i+1)
它甚至可以节省少量字节!不过,我不确定我是否认为这更明智。这里有一个较短的方法:
forall (i=1:len(string)) string(i:i) = string(len(string)-i+1:len(string)-i+1)
它甚至可以节省少量字节!我不确定我是否认为这更明智。@Rook的答案也适用于奇数长度的字符串?无论如何,我的尝试是受他的答案启发的,他的答案也考虑了尾随空格:
! Reverse the string
function reverse_string(string) result(gnirts)
character(len=*) :: string
character(len(string)) :: gnirts
character(1) :: temp
integer :: i, length
length = len(string)
do i = 1,length
gnirts(length-i+1:length-i+1) = string(i:i)
end do
end function reverse_string
@Rook的答案也适用于奇数长度的字符串?无论如何,我的尝试是受他的答案启发的,他的答案也考虑了尾随空格:
! Reverse the string
function reverse_string(string) result(gnirts)
character(len=*) :: string
character(len(string)) :: gnirts
character(1) :: temp
integer :: i, length
length = len(string)
do i = 1,length
gnirts(length-i+1:length-i+1) = string(i:i)
end do
end function reverse_string
当然,我们希望能够通过一个常量表达式来实现这一点,因此我们尝试以下方法:
program reverse
implicit none
character(20), parameter :: input = 'Forward'
integer i
character(len(input)), parameter :: output = &
transfer([(input(i:i),i=len_trim(input),1,-1)],trim(input))
write(*,'("#",a,"#")') input, output
end program reverse
我们使用gfortran和ifort获得相同的输出:
#Forward #
#drawroF#
我看不出我做错了什么。。。这两个编译器中的错误是否相同?当然,我们希望能够通过常量表达式实现这一点,因此我们尝试以下操作:
program reverse
implicit none
character(20), parameter :: input = 'Forward'
integer i
character(len(input)), parameter :: output = &
transfer([(input(i:i),i=len_trim(input),1,-1)],trim(input))
write(*,'("#",a,"#")') input, output
end program reverse
我们使用gfortran和ifort获得相同的输出:
#Forward #
#drawroF#
我看不出我做错了什么。。。这两个编译器中的错误是否相同?与数组不同,字符没有选择“元素”的高级方法:子字符串必须是连续的(特别是不包括“逆序”)。其他答案的方法如下:使用单独选择长度为1的子字符串的表达式来构建新字符串。例如,选择匹配的子字符串
如果我们从单个子字符串构造一个数组,我们可以使用它将重新排序的元素作为字符串放回原处
与数组构造函数隐含循环类似,我们可以使用具有内部写入的I/O隐含循环:
implicit none
character(*), parameter :: string = 'abcde'
character(len(string)) :: reverse
integer i
write(reverse,'(*(A))') (string(i:i),i=len(string),1,-1)
write(*,'(A)') string, reverse
end
但是,由于内部文件不能出现在I/O输出项列表中,因此这种方法不能“就地”使用(与transfer
one不同)。可以使用中间变量。与数组不同,字符没有选择“元素”的高级方法:子字符串必须是连续的(尤其不包括“逆序”)。其他答案的方法如下:使用单独选择长度为1的子字符串的表达式来构建新字符串。例如,选择匹配的子字符串
如果我们从单个子字符串构造一个数组,我们可以使用它将重新排序的元素作为字符串放回原处
与数组构造函数隐含循环类似,我们可以使用具有内部写入的I/O隐含循环:
implicit none
character(*), parameter :: string = 'abcde'
character(len(string)) :: reverse
integer i
write(reverse,'(*(A))') (string(i:i),i=len(string),1,-1)
write(*,'(A)') string, reverse
end
但是,由于内部文件不能出现在I/O输出项列表中,因此这种方法不能“就地”使用(与transfer
one不同)。可以使用中间变量。显然,这两个编译器上的错误是相同的gfortran
甚至具有len(输出)
等于20,但仍将其打印为长度7。事实上,不幸的是,在这两个编译器中都有很多错误,涉及从数组到字符的传输。我报告了错误和错误。作为一种解决方法,请尝试adjustl(传输([(输入(i:i),i=len(输入),1,-1)],输入))
。显然,这两个编译器上的错误是相同的gfortran
甚至具有len(输出)
等于20,但仍将其打印为长度7。事实上,不幸的是,在这两个编译器中都有很多错误,涉及从数组到字符的传输。我报告了错误和错误。作为一种解决方法,请尝试adjustl(传输([(输入(i:i),i=len(输入),1,-1)],输入))
temp
未使用。temp
未使用。使用AMD AOCC的flang或NVIDIA HPC SDK的nvfortran,此操作失败。我猜这些是编译器中的错误。使用它们时字符串“123456789”被反转为“987656789”。使用AMD AOCC的flang或NVIDIA HPC SDK的nvfortran时,该字符串失败。我猜这些是编译器中的错误。使用它们将字符串“123456789”反转为“987656789”。