Le carré magique : la matrice sous turbo pascal
xavier
-
viirus -
viirus -
j'ai un devoir a rendre pour la semaine prochaine et il est presque fini: merci donc à celui ou celle qui m'apportera son aide.
il me reste à faire l'étape"3". voici l'énoncé:
ecrire un programme qui permet à l'utilisateur d'executer les fonctions suivantes:
"1"/ saisir une matrice (n lignes, n colonnes) qui sera placé dans le tableau.
"2"/afficher la matrice.
"3"/verifier si la matrice est un carré magique. c'est un carré magique si la somme de toutes les lignes, colonnes et diagonales principales sont égales (donnez-moi si possible quelques précisions sur la définition du carré magique).
il me reste à faire l'étape"3". voici l'énoncé:
ecrire un programme qui permet à l'utilisateur d'executer les fonctions suivantes:
"1"/ saisir une matrice (n lignes, n colonnes) qui sera placé dans le tableau.
"2"/afficher la matrice.
"3"/verifier si la matrice est un carré magique. c'est un carré magique si la somme de toutes les lignes, colonnes et diagonales principales sont égales (donnez-moi si possible quelques précisions sur la définition du carré magique).
A voir également:
- Le carré magique : la matrice sous turbo pascal
- Éponge magique danger - Guide
- Metre carré clavier ✓ - Forum Bureautique
- Ou est charlie le livre magique solution ✓ - Forum Loisirs / Divertissements
- Comment écrire mètre carré avec un m+2 expos? ✓ - Forum Windows
- Faire un ² sur clavier QWERTZ ✓ - Forum Bureautique
4 réponses
program carre_magique;
uses wincrt;
type mat = array [1..19,1..19] of integer ;
{ Remarquer qu'une indexation de 0 à 18 rendrait possible l'utilisation de la fonction "mod" au lieu de la fonction
F définie plus loin. }
var N, D : integer ; A : mat;
procedure lecture (var N : integer ; var P : integer );
begin write ('Carrés magiques de coté impair avec des entiers consécutifs positifs.');
write ('Nombre de lignes et de colonnes: ');
repeat
readln (N)
until odd (N); {seule une valeur impaire est acceptée}
write ('Valeur de départ: ');
readln (P)
end ;
procedure ecriture (M : mat ; N, P : integer );
{ Affichage d'une matrice de N lignes et P colonnes }
var I, J : integer ;
begin
for I := 1 to N do
begin
for J := 1 to P do
write (M[I, J] : 4 );
writeln { passage à la ligne}
end
end ;
function f (X, N : integer ) : integer ;
{F est construite pour donner un résultat entre 1 et N dans tous les cas, on peut bien sûr se contenter de : "si
X<N alors X sinon X-N ", mais indexer le tableau de 0 à n-1 permet d'utiliser "mod" et donc de se dispenser de F }
begin if X < 1 then F := F(X + N ,N)
else if X > N then F := F(X - N,N)
else F := X
end;
procedure construc (N, D : integer ; var A : mat ); {D est la valeur initiale, N la dimension du carré}
var I, J, X : integer ; {I , J sont les coordonnées de la case courante }
begin for I := 1 to N do for J := 1 to N do A [I, J] := 0; {Initialisation nécessaire}
I := (N div 2) + 1 ; J := I-1;
for X := 0 to (N*N) -1 do
begin if A[F(I+1, N), F (J+1, N)] = 0
then begin I := F (I+1, N); J := F (J+1, N) end
else repeat I := F (I+2, N) until A[I, J] = 0;
{ Si la case suivante est vide, alors la case courante devient cette case-là.}
A[I, J] := X + D
end; { D est la valeur de départ }
end;
begin
lecture (N, D);
construc (N, D, A);
ecriture (A, N, N);
writeln ('La somme vaut : ', (N*(N*N-1) div 2) + N*D )
end.
uses wincrt;
type mat = array [1..19,1..19] of integer ;
{ Remarquer qu'une indexation de 0 à 18 rendrait possible l'utilisation de la fonction "mod" au lieu de la fonction
F définie plus loin. }
var N, D : integer ; A : mat;
procedure lecture (var N : integer ; var P : integer );
begin write ('Carrés magiques de coté impair avec des entiers consécutifs positifs.');
write ('Nombre de lignes et de colonnes: ');
repeat
readln (N)
until odd (N); {seule une valeur impaire est acceptée}
write ('Valeur de départ: ');
readln (P)
end ;
procedure ecriture (M : mat ; N, P : integer );
{ Affichage d'une matrice de N lignes et P colonnes }
var I, J : integer ;
begin
for I := 1 to N do
begin
for J := 1 to P do
write (M[I, J] : 4 );
writeln { passage à la ligne}
end
end ;
function f (X, N : integer ) : integer ;
{F est construite pour donner un résultat entre 1 et N dans tous les cas, on peut bien sûr se contenter de : "si
X<N alors X sinon X-N ", mais indexer le tableau de 0 à n-1 permet d'utiliser "mod" et donc de se dispenser de F }
begin if X < 1 then F := F(X + N ,N)
else if X > N then F := F(X - N,N)
else F := X
end;
procedure construc (N, D : integer ; var A : mat ); {D est la valeur initiale, N la dimension du carré}
var I, J, X : integer ; {I , J sont les coordonnées de la case courante }
begin for I := 1 to N do for J := 1 to N do A [I, J] := 0; {Initialisation nécessaire}
I := (N div 2) + 1 ; J := I-1;
for X := 0 to (N*N) -1 do
begin if A[F(I+1, N), F (J+1, N)] = 0
then begin I := F (I+1, N); J := F (J+1, N) end
else repeat I := F (I+2, N) until A[I, J] = 0;
{ Si la case suivante est vide, alors la case courante devient cette case-là.}
A[I, J] := X + D
end; { D est la valeur de départ }
end;
begin
lecture (N, D);
construc (N, D, A);
ecriture (A, N, N);
writeln ('La somme vaut : ', (N*(N*N-1) div 2) + N*D )
end.
program matrice_magique ;
uses wincrt ;
type
mat = array[1..100,1..100] of integer ;
var
m : mat ;
n : integer ;
procedure saisie (var n : integer);
begin
repeat
writeln('Donner la dimension de la matrice ');
readln(n);
until (n mod 2 <> 0) and (n>1);
end;
procedure affiche_mat (m : mat ; n : integer );
var
l,c : integer ;
begin
for l:= 1 to n do
begin
for c := 1 to n do
write(m[l,c],' ');
writeln;
end;
end;
procedure remplir_mat (var m : mat ; n : integer);
var
l,c,k,sl,sc : integer ;
begin
{initialisation}
l := n ;
c := (n div 2 ) + 1 ;
k := 0 ;
repeat
k:= k + 1 ;
m[l,c] := k ;
sl := l;
sc := c;
l := l + 1 ;
c := c + 1 ;
if l > n then
l := 1 ;
if c > n then
c := 1 ;
if m[l,c] <> 0 then
begin
l:= sl-1 ;
c:=sc;
end;
until k = sqr(n) ;
end;
{programme principal}
begin
saisie(n);
remplir_mat(m,n);
affiche_mat(m,n);
end.
uses wincrt ;
type
mat = array[1..100,1..100] of integer ;
var
m : mat ;
n : integer ;
procedure saisie (var n : integer);
begin
repeat
writeln('Donner la dimension de la matrice ');
readln(n);
until (n mod 2 <> 0) and (n>1);
end;
procedure affiche_mat (m : mat ; n : integer );
var
l,c : integer ;
begin
for l:= 1 to n do
begin
for c := 1 to n do
write(m[l,c],' ');
writeln;
end;
end;
procedure remplir_mat (var m : mat ; n : integer);
var
l,c,k,sl,sc : integer ;
begin
{initialisation}
l := n ;
c := (n div 2 ) + 1 ;
k := 0 ;
repeat
k:= k + 1 ;
m[l,c] := k ;
sl := l;
sc := c;
l := l + 1 ;
c := c + 1 ;
if l > n then
l := 1 ;
if c > n then
c := 1 ;
if m[l,c] <> 0 then
begin
l:= sl-1 ;
c:=sc;
end;
until k = sqr(n) ;
end;
{programme principal}
begin
saisie(n);
remplir_mat(m,n);
affiche_mat(m,n);
end.