Fortran 90 - 改变原点

时间:2012-10-08 01:33:58

标签: arrays fortran

这就是我想要做的事。

我有一个100 x 100的网格值,我的原始值是(0,0)。这个原点位于中心(因此我的数组边界在-99:99等)。在这个起源,我检查它的价值,以及围绕该起源的价值。我的程序在远离原点的水平和垂直距离读取,根据我的代码,我得到了一组整齐的值组织。一个名叫约翰的人有这样的问题 - 所以希望他能找到这个!

X =未收集的值。 O =收集的值。

X  X  O  X  X

X  O  O  O  X

O  O  O  O  O

X  O  O  O  X

X  X  O  X  X

根据我对原点水平和垂直距离的选择,我可以做一些像这样的事情:

X  X  O  O  O  X  X

X  O  O  O  O  O  X

O  O  O  O  O  O  O

X  O  O  O  O  O  X

X  X  O  O  O  X  X

现在,这是踢球者:我不希望我的起源一直是0,0!我希望我的程序能够询问我的首选来源,然后让程序进行相应的计算。这是我遇到大麻烦的地方。我应该在我已经声明我的数组的代码的开头写一些东西吗?我应该创建另一个do循环吗?我真的很想学Fortran,做这些练习非常有价值 - 我很乐意在这里帮忙。我在这里缺少什么?

到目前为止,这是我的代码:

!!!!! Declare Variables.
implicit none
integer i, j, k, dist, vdist, row, col, nsum
integer, dimension (-99:99,-99:99) :: values
!!!!!
open(1, file='sampledata.dat')
!!!!! Create a data set from a loop.
do 10 j = -99,99
    do 10 i = -99,99
            values(i,j) = ((j-1) * 2) + (i-3)
10 continue
write(1,*) values
!!!!!
print *, 'Column,Row'
read (*,*) col, row
print *, 'Horizontal Distance From Origin'
read (*,*) dist
print *, 'Vertical Distance From Origin'
read (*,*) vdist
!!!!!
nsum = 0
!!!!!   If the vertical distance is greater than the horizontal distance…
if (vdist .GT. dist) then
do col = -dist, dist
    do row = -vdist + abs(col), vdist - abs(col)
    write (6,*) values(row,col)
    nsum = nsum + values(col,row)
    end do
end do
end if
!!   If the horizontal distance is greater than or equal to the vertical distance…
if (dist .GE. vdist) then
do col = -vdist, vdist
    do row = -dist + abs(col), dist - abs(col)
    write (6,*) values(col,row)
    nsum = nsum + values(col,row)
    end do
end do
end if
!!!!!
print *, nsum
close(1)
end

1 个答案:

答案 0 :(得分:3)

您可以将数组的中心放在任何您想要的位置,甚至可以在运行时决定。而不是

integer, dimension (-99:99,-99:99) :: values

使用

integer, dimension (:, :), allocatable :: values

然后在代码的可执行部分决定数组的开始和结束,并在运行时指定数组的大小:

allocate ( values (start: end, start: end) )

然后将其余代码基于 start end 而不是您现在使用的固定值。