这就是我想做的。
我有一个 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