これが私がやりたいことです。
値の 100 x 100 グリッドがあり、元の原点は (0,0) です。この原点は中心にあります (したがって、配列の境界は -99:99 などになります)。この起源で、私はその価値とその起源を取り巻く価値を調べます。原点から離れた水平方向と垂直方向の両方の距離でプログラムを読み取らせ、コードに従って、このように整理されたきちんとした値のセットを取得します。John という名前の人がこのような問題を抱えていました。
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