Fortran代码在循环中的每次计算均返回0

时间:2019-02-20 11:02:49

标签: fortran

有人可以帮助我找到编写此代码的地方吗

    program time_period
    ! This program calculates time period of an SHM given length of the chord
    implicit none
    integer, parameter:: length=10
    real, parameter :: g=9.81, pi=3.1415926535897932384
    integer, dimension(1:length)::chordlength
    integer :: l
    real :: time
    do l= 1,length
    time = 2*pi*(chordlength(l)/(g))**.5
    print *, l, time
    enddo
    end program

结果:

1 0.00000000E+00
2 0.00000000E+00
3 0.00000000E+00
4 0.00000000E+00
5 0.00000000E+00
6 0.00000000E+00
7 0.00000000E+00
8 0.00000000E+00
9 0.00000000E+00
10 0.00000000E+00

Screenshot of code and result

3 个答案:

答案 0 :(得分:3)

如果您感兴趣的和弦长度是整数值1,2,...,10,则几乎不需要数组来存储它们。此外,如果您感兴趣的是这10个和弦长度中每一个的SHM周期长度,令我惊讶的是,您应该有一个像这样的数组:

real, dimension(length) :: shm_periods

然后您将填充它,也许像这样:

do l= 1,length
    shm_periods(l) = 2*pi*(l/g)**.5
    print *, l, shm_periods(l)
enddo

接下来,您可以了解Fortran的数组语法,仅编写一条语句即可为shm_periods赋值。

答案 1 :(得分:1)

@高效能标记

我按照以下方式工作

program time_period
! This program calculates time period of an SHM given length of the chord
implicit none
integer, parameter:: length=10
real, parameter :: g=9.81, pi=3.1415926535897932384
integer, dimension(1:length)::chordlength
integer :: l
real, dimension(1:length) :: timeperiod

  do l= 1,length
  print *, 'Enter ChordLength', l
  read *, chordlength(l)
  timeperiod(l) = 2*pi*(chordlength(l)/g)**.5
  enddo
  do l=1,length
  print *, l, timeperiod(l)
  enddo
  end program

它给了我结果,但要求输入和弦的长度...感谢您的帮助

答案 2 :(得分:0)

下面的代码无法回答您的问题(因为您已经这样做了)。但这确实解决了代码设计中的一些问题。

下一步,假设您要使用a)函数进行计算,b)使用一些标准长度值来显示周期,并c)输入自定义长度来进行计算。

Fortran允许声明elemental函数,这些函数可以对单个值或数组进行相同的操作(无需循环)。请参见下面的示例:

elemental function CalcTimePeriod(chord_length) result(period)
! Calculate the SHM time period from the chord length   
real, parameter :: g=9.80665, pi=3.1415926535897932384
real, intent(in) :: chord_length
real :: period

    period = 2*pi*sqrt(chord_length/g)

end function

所以我在下面发布代码,希望您可以通过现代Fortran学习新知识。

scr

program SHM_CalcTime
implicit none

! Variables
integer, parameter :: n = 10
real, dimension(n) :: gen_lengths, periods
real :: input_length
integer :: i

! Example calculation from generated array of chord lengths
! fill an array of lengths using the formula len = 1.0 + (i-1)/2
gen_lengths = [ (1.0+real(i-1)/2, i=1, n) ]
! calculate the time periods for ALL the lengths in the array
periods = CalcTimePeriod(gen_lengths)

write (*, '(1x,a14,1x,a18)') 'length', 'period'
do i=1,n
    write (*, '(1x,g18.4,1x,g18.6)') gen_lengths(i), periods(i)
end do
input_length = 1.0
do while( input_length>0 )
    write (*,*) 'Enter chord length (0 to exit):'
    read (*,*) input_length
    if(input_length<=0.0) then
        exit
    end if
    write (*, '(1x,g18.4,1x,g18.6)') input_length, CalcTimePeriod(input_length)        
end do

contains

elemental function CalcTimePeriod(chord_length) result(period)
! Calculate the SHM time period from the chord length   
real, parameter :: g=9.80665, pi=3.1415926535897932384
real, intent(in) :: chord_length
real :: period

    period = 2*pi*sqrt(chord_length/g)

end function

end program SHM_CalcTime

最后,请注意,程序可以在contains语句之后声明内部函数,而无需像使用旧版Fortran变体那样进行显式接口声明。