这就是我想要做的事。
我有一个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
答案 0 :(得分:3)
您可以将数组的中心放在任何您想要的位置,甚至可以在运行时决定。而不是
integer, dimension (-99:99,-99:99) :: values
使用
integer, dimension (:, :), allocatable :: values
然后在代码的可执行部分决定数组的开始和结束,并在运行时指定数组的大小:
allocate ( values (start: end, start: end) )
然后将其余代码基于 start 和 end 而不是您现在使用的固定值。