2017-03-23 15 views
0

IたとえばFortranの95のコード特定の変数のコードを作成するにはどうすればよいですか?

を埋め込みたい:私は、例えば、X = 4のための可変

read *, x 

整数を読んでいます。そして、私のソースは、私は魔方陣を見つけるためにしようと、このようなコードに取り組んでいる4つのループ変数を持つ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 
されています210

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 

ループは、すべての要素が互いにか異なっているかどうかを評価することがあります。

エンド

は、今の問題は、私は魔方陣の行と列の数を増やすために傾くことになるならば、私は要素指定子ループを書き直す必要があるということです。しかし、私はそれを喜んでいません。だから、私は変数を宣言し、それを読んで、プログラム作成のdoループを読むようにしたいと思っています。 私は私が知りたいことについてはっきりしていたと思います。

+0

タグ[tag:fortran]を使用して注意を促してください。特定の95バージョンのタグの後には誰もいません。 –

+1

あなたの質問は私にとって意味をなさない。何が起こっているのかを正確に説明するコードをもっと表示してください。 –

+0

あなたの質問の1つのコンポーネントは、次のように思われます。*実行時に整数 'm'を読み込み、ループの深いネスティングを作成するにはどうしたらいいですか?*その質問には答えられません。しかし、「m * m」マジックスクエアを構築することも、与えられたマスがマジックであることをチェックすることも、おそらく別のアルゴリズムを選択する必要があります。 –

答えて

0

テストは次のようになります:

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 

おそらくいくつかは、正方形を製造するための概念でキャリーオーバーがあるの?

関連する問題