【问题标题】:How can I create code for specific variable?如何为特定变量创建代码?
【发布时间】: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


【解决方案1】:

测试可能如下所示:

LOGICAL FUNCTION IsMagical(dim_o_square, SquareData)
IMPLICIT NONE
INTEGER                                    , INTENT(IN   ) :: Dim_o_Square 
REAL, DIMENSION(Dim_o_Square, Dim_o_Square), INTENT(IN   ) :: SquareData

REAL, DIMENSION(Dim_o_Square)                              :: Row_Sum, Col_Sum
REAL                                                       :: Diag_Sum

IsMagical = .FALSE.
INTEGER                                                    :: I 

IF(Dim_o_Square < 2) THEN
  WRITE(*,*) '[SubMagic?:line10]  DIMENSION of square is hosed'
  RETURN
ENDIF

!   Fill the data to determine PFM'ness
DIAG = 0
DO I = 1, Dim_o_Square
  COL_Sum(I) = SUM(SquareData(:,I))
  ROW_Sum(I) = SUM(SquareData(I,:))
  DIAG_Sum   = Diag + SquareData(I,I)
ENDDO

!   Test for PFM'ness
DO I = 2, Dim_o_Square
  IF( COL(I) /= Diag .OR. ROW(I) /= Diag ) THEN
    RETURN
  ENDIF
ENDDO

!Must be magical at this point...
IsMagical = .TRUE.
WRITE(*,*) '[SubMagic?:line40]  Magical and sum value (Row/Col/Diag)=', DIAG_Sum

RETURN
END FUNCTION IsMagical

也许在制作正方形的概念上有一些遗留问题?

【讨论】:

    猜你喜欢
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    • 1970-01-01
    相关资源
    最近更新 更多