Programmation Carré Magique

Jérôme -  
 FARES -
Bonjour,

Etudiant en Master mécanique, je suis loin d'être doué en programmation... Honnêtement, je dois faire parti de la catégorie "Gros nuls" ! Il m'a pourtant été demandé de programmer le "Carré Magique" en Fortran 77.
Description : un carré magique d'ordre n (n impair) est un tableau carré n*n qui contient dans ses n^2 cases, une fois et une seule fois, chacun des nombres entiers 1 à n^2 de telle sorte que la somme des n termes sur chaque ligne, colonne ou diagonale soit constante.
Aide à la construction :
1. on place 1 dans la case située sous la case centrale.
2. lorsque on a placé l'entier x dans la case (i,j), on place x+1 dans la case (i+1,j+1).
3. si l'indice de case dépace n, on le prend égal à 1.
4. si une case (k,l) est occupée, on passe à la case (k-1,l+1) ; si k-1=0, on prend n.

Et maintenant, voilà ce à quoi je suis péniblement arrivé... Mais il y a toujours des erreurs que je n'arrive plus à résoudre.
MERCI beaucoup si quelqu'un peut jeter un oeil et m'aider.

PROGRAM main

implicit none
integer n,a(n,n)

call choixordre(n)

call initialisation(n,a)

call calcul(n,a)

call affichage(n,a)

STOP
END

! ------------------------------------------------------------------
! Sous programme "Choix et verification de n"
! ------------------------------------------------------------------
SUBROUTINE choixordre(n)
implicit none
integer n

write(6,*)'!!! Carre Magique !!!'
write(6,*)' '
1 write(6,*)'Choisir un entier impair compris entre 1 et 99 :'
read(5,*)n

if(n.lt.1) then
goto 1
else if(n.gt.99) then
goto 1
endif

! Note : à ce point du problème, je ne sais pas comment faire
! pour vérifier que le nombre n entré est bien un entier ?

return
END

! ------------------------------------------------------------------
! Sous programe "Initialisation"
! ------------------------------------------------------------------
SUBROUTINE initialisation(n,a)
implicit none
integer i,j,n,a(n,n)

do i=1,n
do j=1,n
a(i,j)=0
end do
end do

i=(n+3)/2
j=(n+1)/2
a(i,j)=1

return
END

! ------------------------------------------------------------------
! Sous programme "Calcul du carre magique"
! ------------------------------------------------------------------
SUBROUTINE calcul(n,a)
implicit none
integer i,j,k,l,it,n,a(n,n)

i=(n+3)/2
j=(n+1)/2

do it=2,n**2

k=i+1
if(k.gt.n) then
k=1
endif
i=k

l=j+1
if(l.gt.n) then
l=1
endif
j=l

2 if(a(i,j).eq.0) then
a(i,j)=it
else
i=k-1
if((k-1).eq.0) then
i=n
endif
j=l+1
if(j.gt.n) then
j=1
endif
goto 2
endif

end do

return
END

! ------------------------------------------------------------------
! Sous programe "Affichage du carre magique"
! ------------------------------------------------------------------
SUBROUTINE affichage(n,a)
implicit none
integer n,i,j,a(n,n)

do i=1,n
write(6,*)(a(i,j),j=1,n)
end do

return
END
Configuration: Force 2.0.8 sous Windows XP

7 réponses

  1. bigboss
     
    j'ai aussi un blem en programmation du carre magique voila ce que j'ai trouve

    #include<stdio.h>
    #include<conio.h>
    #include<string.h>
    int t[10][10];

    int n,i,j;int k[10][10],h[10][10];
    int S[10];int S1[10][10],S2[10][10];
    int magique(int n, int *tab[]) )

    { for(i=0;i<n;i++)
    {for(j=0;j<n;j++)
    S[i]+=t[i][j];}
    for(j=0;j<n;j++)
    {for(i=0;i<n;i++)
    S[j]+=t[i][j];}
    for(i=0;i<n;i++)
    for(j=0;j<n;j++)
    if((S[i]=S[i+1])&&(S[j]=S[j+1])&&(S[i]=S[j]))
    return 0;
    else
    return 1;
    }
    int parfaite(int n, int *tab[]))

    {k=magique(t[10][10]);
    if(k==0)
    {
    for(i=0;i<n;i++)
    S1=t[i][i];
    S2+=t[i][n-i-1];
    if(S2==S1)
    return2;
    }
    else return 3;
    else return 1;
    }
    void main()
    {int t[10][10];
    int h;
    int J;
    printf("entrer l'ordre de la matrice\n");
    scanf("%d",&n);
    h=magique(t[10][10]);
    J=parfaite(t[10][10]);
    if((h==0)&&(J==3))
    printf("le carre est magique et parfaite\n");
    if((h==0)&&(J==3))
    printf("le carre est magique non parfait\n");
    if(h==1)
    printf("le carre n'est magique\n");
    }
    3
  2. abdess
     
    j ai une programmation a faire du CARRE MAGIQUE sauf moi c en maple si il ya quelqu'un doué en maple ca sera gentil et très sympa!
    merci

    ,
    0
  3. mype Messages postés 2459 Date d'inscription   Statut Membre Dernière intervention   437
     
    tu veux qu'on te fasse tout le travail ?
    poste deja ce que tu as essayé de faire...
    0
  4. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  5. bastouf
     
    carremag:=proc(A)
    local i,j,k,l,L;
    L:=NULL;
    for i from 0 to floor(sqrt(A)) do
    for j from 0 to floor(sqrt(A)) do
    for k from 0 to floor(sqrt(A)) do
    for l from 0 to floor(sqrt(A)) do
    if i^2+j^2+k^2+l^2=A then L:=L,[i,j,k,l] fi;od;od;od;od;[L];end:
    0
  6. chessinfo
     
    mes chers amis merci de me regler ce probleme avec le carré magique SVP ! je trouve pa mon erreur :s

    program MAGIC;
    var n,l,m:integer;
    TTAB : array [1..n,1..n] of integer;

    procedure carremagic(n:integer , var T:TTAB)
    var i,j,ani,anj:integer;
    begin
    i:=1;
    j:=(n div 2)+1;
    for k:=1 to (n*n) do
    begin
    T[i,j]:=k;
    ani:=i;
    anj:=j;
    i:=i+1;
    j:=j+1;
    if(i=0)
    then i:=n;
    if(j=n+1)
    then j:=1;
    if(T[i,j]>0) then
    begin
    i:=ani+1;
    j:=anj;
    end;
    end;

    end.
    begin(*programme principale*)
    writeln('donner un nombre impaire:');
    readln(n);
    carremagic(n,T[l,m]);
    for l:=1 to n do
    for m:=1 to n do
    writeln('T[',l,',',m,']');
    readln;
    end.

    0
  7. Tintoune
     
    Voila un premier programme de carre magique (sous forme de matrice) suivi du programme qui verifie que c'est bien un carre magique, le tout en Maple.

    carre:=proc(n)
    A:=matrix(n,n,0);
    i:=(n+3)/2;
    j:=(n+1)/2;
    for k from 0 to n^2-1 do
    if irem(i,n)=0 and irem(j,n)<>0 then
    if A[n,irem(j,n)]=0 then A[n,irem(j,n)]:=k+1;i:=n+1;j:=irem(j,n)+1 else
    if irem(j,n)<>1 then A[1,irem(j,n)-1]:=k+1;i:=2;j:=irem(j,n) else
    A[1,n]:=k+1;i:=2;j:=1;fi;fi; elif
    irem(i,n)<>0 and irem(j,n)=0 then
    if A[irem(i,n),n]=0 then A[irem(i,n),n]:=k+1;i:=irem(i,n)+1;j:=1 else
    if irem(i,n)+2<>n+1 then A[irem(i,n)+1,n-1]:=k+1;i:=irem(i,n)+2;j:=n else
    A[irem(i,n)+1,n-1]:=k+1;i:=1;j:=n;fi;fi; elif
    irem(i,n)=0 and irem(j,n)=0 then
    if A[n,n]=0 then A[n,n]:=k+1;i:=1;j:=1 else
    A[1,n-1]:=k+1;i:=n+2;j:=n;fi;else
    if A[irem(i,n),irem(j,n)]=0 then A[irem(i,n),irem(j,n)]:=k+1;i:=irem(i,n)+1;j:=irem(j,n)+1 else
    if irem(j,n)<>1 then A[irem(i,n)+1,irem(j,n)-1]:=k+1;i:=irem(i,n)+2;j:=irem(j,n) else
    A[irem(i,n)+1,n]:=k+1;i:=irem(i,n)+2;j:=1;fi;fi;fi;od;
    RETURN (evalm(A));end;

    vrai:=proc(n)
    A:=carre(n);
    a:=sum('A[k,k]', 'k'=1..n);
    b:=sum('A[k,n-k+1]', 'k'=1..n);
    for i from 1 to n do
    if sum('A[k,i]', 'k'=1..n)<>n*(n^2+1)/2 then RETURN(non-magique) elif
    sum('A[i,k]', 'k'=1..n)<>n*(n^2+1)/2 then RETURN(non-magique);fi;od;
    if a<>b then RETURN(non-magique) elif
    a=n*(n^2+1)/2 then (magique) else (non-magique);fi;end;
    0
    1. FARES
       
      bonjour mes ami
      0