2017-03-23 3 views
0

Je veux intégrer un code pour Fortran 95.Comment puis-je créer du code pour une variable spécifique?

Par exemple: J'ai lu un entier variable de

read *, x 

par exemple x = 4. et ma source crée quatre boucle qui a quatre boucle variable

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 

Je travaille sur un tel code qui tente de trouver un carré magique. Je peux trouver un code magique en utilisant un algorithme pour les matrices carrées impaires. probablement, je peux aussi générer un carré magique qui est même numéroté et numéroté deux fois pair. cependant, j'essaie d'améliorer mes compétences de codage en écrivant un programme qui essaie élément par élément de trouver un carré magique.

implicit integer (a-z) 

counte = compteur de possibilité, magcon = carré magique généré contre dieu et diable sont des variables logiques. Mais je les ai utilisés comme entier.

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 

ces boucles sont des éléments d'évaluation

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) 

ceux-ci sont rangée, colonne et détecteur de somme diagonale

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 est une constante magique. Les boucles sont pour évaluer si un carré est magique ou non.

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 

il des boucles doivent évaluer si chaque élément est différent de l'autre ou non.

fin

Maintenant, le problème est que si j'enclin à augmenter le nombre de lignes et de colonnes de carré magique, je dois réécrire les boucles spécificateur élément. Mais je ne suis pas prêt à ça. Je veux donc déclarer une variable, la lire, et être capable de faire en sorte que le programme crée des boucles comme lu. Je voudrais être clair sur ce que je veux savoir.

+0

Utilisez la balise [tag: fortran] pour attirer l'attention. Personne ne suit juste l'étiquette pour la version 95 spécifique. –

+1

Votre question n'a aucun sens pour moi. S'il vous plaît nous montrer plus de code expliquer exactement ce qui se passe. –

+0

Un composant de votre question semble être * Comment puis-je lire un entier 'm' à l'exécution et créer un nid de boucles' m'-deep? * A cette question, la réponse est, vous ne pouvez pas.Mais ni construire un carré magique 'm * m ', ni vérifier qu'un carré donné est magique, nécessite cette approche, vous devriez probablement sélectionner un algorithme différent. –

Répondre

0

Le test pourrait ressembler à ceci:

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 

Peut-être il y a un certain INTEMPOREL des concepts pour la production de la place?