Programmation Carré Magique
Jérôme
-
FARES -
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
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
A voir également:
- Programmation Carré Magique
- Éponge magique danger - Guide
- Ou est charlie le livre magique solution - Forum Loisirs / Divertissements
- Metre carré clavier ✓ - Forum Windows
- Faire un ² sur clavier QWERTZ ✓ - Forum Bureautique
- Parenthese carré ✓ - Forum MacOS
7 réponses
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");
}
#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");
}
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
,
merci
,
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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:
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:
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.
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.
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;
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;