【发布时间】:2017-03-23 05:09:55
【问题描述】:
我想嵌入 Fortran 95 的代码。
例如:我读取了一个整数变量
read *, x
例如 x=4。我的源创建了四个循环,其中有四个循环变量
loop1:do a=1,16
loop2:do b=1,16
loop3:do c=1,16
loop4:do d=1,16
........smt......
end do loop4
end do loop3
end do loop2
end do loop1
我正在编写一个这样的代码,试图找到一个幻方。我可以通过使用奇数方阵算法找到一个神奇的代码。可能,我也可以生成一个偶数和双偶数的幻方。但是,我正在尝试通过编写一个逐个元素尝试找到魔方的程序来提高我的编码技能。
implicit integer (a-z)
counte=可能性计数器,magcon=魔方生成计数器 上帝和魔鬼是逻辑变量。但我将它们用作整数。
integer GG(3,3),COUNTE,magcon
integer god,devil
open(55,file='mymagics')
COUNTE=0
magcon=0
loop1:do a=9,1,-1
loop2:do b=9,1,-1
loop3:do c=9,1,-1
loop4:do d=9,1,-1
loop5:do e=9,1,-1
loop6:do f=9,1,-1
loop7:do g=9,1,-1
loop8:do h=9,1,-1
loop9:do i=9,1,-1
这些循环用于评估元素
GG(1,1)=a
GG(1,2)=b
GG(1,3)=c
GG(2,1)=d
GG(2,2)=e
GG(2,3)=f
GG(3,1)=g
GG(3,2)=h
GG(3,3)=i
call elementcontrol(gg,devil)
if(devil.eq.1)then
call magiccontrol(GG,god)
else if(devil.eq.0) then
cycle
endif
COUNTE=COUNTE+1
if(allah.eq.1) then
magcon=magcon+1
write(55,66)
write(55,*) counte ,"possibility is tried"
write(55,*)"**************************************"
write(55,*)"**************************************"
write(55,*)"**************************************"
write(55,*)"--------------------------------------"
write(55,*)GG(1,1),GG(1,2),GG(1,3)
write(55,*)GG(2,1),GG(2,2),GG(2,3)
write(55,*)GG(3,1),GG(3,2),GG(3,3)
write(55,*)"--------------------------------------"
write(55,*)"**************************************"
write(55,*)"**************************************"
write(55,*)"**************************************"
write(55,66)
66 format(//)
else
print *, counte ,"possibility is unvalid"
end if
enddo loop9
enddo loop8
enddo loop7
enddo loop6
enddo loop5
enddo loop4
enddo loop3
enddo loop2
enddo loop1
print *, "finally done!"
print *, magcon,"magic square is found"
stop
end
subroutine magiccontrol(magic,logic)
integer logic,z
integer magic(3,3),sumrow(3),sumcol(3),sumdia(2)
这些是行、列和对角总和查找器
do z=1,3
sumrow(z)=0
sumcol(z)=0
sumdia(z)=0
end do
do 31 k=1,3
do 31 l=1,3
sumrow(k)=sumrow(k)+(magic(k,l))
31 continue
do 52 m=1,3
do 52 n=1,3
sumcol(m)=sumcol(m)+(magic(n,m))
52 continue
do 69 i=1,3
sumdia(1)=sumdia(1)+magic(i,i)
sumdia(2)=sumdia(2)+magic((4-i),i)
69 continue
loop1:do y=1,3
loop2:do f=1,3
loop3:do x=1,2
if(sumrow(y).eq.15) then
if(sumcol(f).eq.15)then
if(sumdia(x).eq.15)then
logic=1
else
logic=0
exit loop1
end if
else
logic=0
exit loop1
end if
else
logic=0
exit loop1
end if
end do loop3
end do loop2
end do loop1
15 是魔法常数。循环用于评估 aquare 是否具有魔法。
end
subroutine elementcontrol(elecon,logic2)
integer elecon(3,3),a1,a2,a3,a4,a5,a6,coun(9)
do a4=1,9
coun(a4)=0
end do
logic2=0
do a1=1,9
do a2=1,3
do a3=1,3
if(a1.eq.elecon(a2,a3))then
coun(a1)=coun(a1)+1
end if
end do
end do
end do
do a5=1,9
do a6=1,9
if(a5.ne.a6) then
if(coun(a5).eq.coun(a6)) then
logic2=1
else
logic2=0
exit
end if
else
cycle
end if
end do
end do
有循环来评估每个元素是否彼此不同。
结束
现在的问题是,如果我倾向于增加幻方的行数和列数,我必须重写元素说明符循环。但我不愿意这样做。所以我想声明一个变量,读取它,并能够让程序创建做循环作为读取。 我希望我很清楚我想知道什么。
【问题讨论】:
-
使用标签fortran 引起注意。没有人只关注特定 95 版本的标签。
-
你的问题对我来说没有任何意义。请向我们展示更多代码,准确解释发生了什么。
-
您的问题的一个组成部分似乎是 我如何在运行时读取整数
m并创建一个m-deep 循环嵌套?问题的答案是,你不能。但是无论是构造m*m幻方,还是检查给定方是否是幻方,都不需要这种方法,您可能应该选择不同的算法。 -
我看到您选择使用隐式类型(即
implicit integer (a-z))。如果您手头有枪,首先将那行代码替换为implicit none,然后脱下一只鞋和一只袜子(在这些上打洞没有意义)并赤脚射击自己。与使用隐式类型相比,这将减少痛苦。如果你没有枪,那么从你手上掉下一个 10 公斤重的钢铁重物可能就足够了。 -
任意嵌套的do循环已经在stackoverflow.com/questions/9344707/…中处理过
标签: fortran nested-loops fortran95 do-loops