2

这就是我想做的。

我有一个 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!我希望我的程序询问我的首选来源是什么,然后让程序进行相应的计算。这是我遇到一个大障碍的地方。我应该在我声明数组的代码开头写一些东西吗?我应该创建另一个循环吗?我真的很想学习 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
4

1 回答 1

3

您可以将阵列的中心放置在您想要的任何位置,甚至可以在运行时决定。代替

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

利用

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

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

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

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

于 2012-10-08T04:51:28.570 回答