Как я могу создать код для конкретной переменной?

Я хочу встроить код для Fortran 95.

Например: я прочитал целочисленную переменную

   read *, 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 магическая константа. Циклы предназначены для оценки того, является ли акварель волшебной или нет.

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

есть циклы, чтобы оценить, отличается ли каждый элемент друг от друга или нет.

конец

Теперь проблема в том, что если я буду склонен увеличивать количество строк и столбцов магического квадрата, мне придется переписать циклы спецификатора элемента. Но я не желаю этого. Поэтому я хочу объявить переменную, прочитать ее и заставить программу создавать циклы do как прочитанные. Хотел бы я быть кристально чистым о том, что я хочу знать.

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

Возможно, есть некоторые переносы в концепции производства квадрата?

Другие вопросы по тегам