Carré magique

Fermé
hajerboug - 18 mars 2008 à 14:24
 iness ch - 22 avril 2013 à 17:24
Bonjour,
comment ecrire un programme en langage Pascal qui affiiche un carré avec les caractéristiques suivantes:
carré d'ordre impaire comprenant n lignes et n colonnes (n est impaire et >3 )tel que : quelque soit i,j a[i,j]=v
v inférieur ou egale à n² et superieur ou egale à 1.Aucun element n'est repeté plus d'une fois et la somme des elements de chaque ligne doit etre egale à la somme des elements de chaque colonne (somme de toutes les lignes egales à elles memes et à celles des colonnes et des deux diagonales du carré.)par exemple:pour n=5 on a 25 cases et la somme de chaque ligne ou colonne ou diagonale =65

12 réponses

Salut,

Tu n'as pas bien cherché.

http://fr.wikipedia.org/wiki/Carr%C3%A9_magique_(math%C3%A9matiques)

Program C_Magic ;

{uses wincrt;}
uses crt;

Var
Tab : array [1..19,1..19]  of integer;
d,i,j,n : integer ;
m ,s: integer;
ok : boolean;

Begin

clrscr;

Writeln('Programme de construction d''un Carr‚ Magique');
writeln;
ok:=false;
repeat
  begin
  Write('Dimension du Carr‚ : nombre impair entre 3 et 19 -> ');
  readln(d);
    if ((d>=3) and (d<=19)) then
      begin
        if ((d mod 2)=1) then ok:=true; 
    end;
  end;
until ok ;


for i:=1 to d do
begin
for j:=1 to d do tab[i,j]:=0;
end;
n:=1;
{position de d‚part}
i:=1 ; j:=d div 2 +1;
tab [i,j]:=n;
{
d‚placement
- une ligne vers le haut, une colonne vers la droite
- si une case est occup‚e, une colonne vers la gauche
  et deux lignes vers le bas
- si on sort par le haut et par la droite : comme case occup‚e
- si on sort du tableau par le haut on entre par le bas
- si on sort du tableau par le bas on entre par le haut
- si on sort du tableau par la droite on entre par la gauche
- si on sort du tableau par la gauche on entre par la droite
}
While (n<(d*d)) do
  begin
  i:=i-1; j:=j+1;
  {si on sort par le haut et par la droite}
  if ((i=0) and (j>d)) then
   begin
   i:=i+2;j:=j-1;
   end;
  {si on sort par le bas }
  if i>d then i:=1;
  {si on sort par le haut }
  if i=0 then i:=d;
  {si on sort par la droite }
  if j>d then j:=1;
  {si on sort par la gauche }
  if j=0 then j:=d;
  if tab[i,j]>0 then
   begin
   i:=i+2;j:=j-1;
   end;
  n:=n+1;
  tab [i,j]:=n;
 { write(i, '   ' ,j , '   ' , n);
  readln;  }
  end;

writeln;
Writeln('  Carr‚ Magique ', d,'x',d);
m := d*(d*d+1) div 2;
writeln('  Nombre Magique = ',m);
writeln;

for i:=1 to d  do
begin
s:=0;
writeln;
for j:=1 to d  do
 begin
   write(tab[i,j]:3 , ' ');
 end;
writeln;
writeln;
end;
readln;
end.
5
Monsieur Amigo,Salut!

Merci et grand merci pour l'algo.Il est super.Vous étes un as.Je vais abuser de votre gentillesse pour vous demander de me completer le programme pourafficher les chiffres du carré dans une grille qui clignote et qui est située au milieu de l' ecran.Je suis un neophyte dans la programmation.Je vous remercie d'avance quelquesoit votre reponse et remerci.
0
ask je peut utilisé ce prgramme dans un autre tableau magic ??bref ask c'est le méme principe ?? mercii beaucoup
0
Bonjour,
comment écrire un programme en langage Pascal qui affiche un carré avec les caractéristiques suivantes:
carré d'ordre impaire comprenant n lignes et n colonnes (n est impaire et >3 )tel que : quelque soit i,j a[i,j]=v
v inférieur ou égale à n² et supérieur ou égale à 1.Aucun élément n'est répété plus d'une fois et la somme des éléments de chaque ligne doit être égale à la somme des éléments de chaque colonne (somme de toutes les lignes égales à elles mêmes et à celles des colonnes et des deux diagonales du carré.)par exemple:pour n=5 on a 25 cases et la somme de chaque ligne ou colonne ou diagonale =65

Configuration: Windows XP
Firefox 2.0.0.12
3
Bonjour,

Ce sujet est récurent sur CCM. Fais une recheche par pertinence, tu trouveras sans doute ce que tu cherches, sinon demande à Google.

Salut.
0
Merci de votre reponse,mais cela ne m'aide pas .Vous pensez bien que si je suis arrivé au forum,c'est que je suis passé par les etapes de google,devellopez.com et tutti quanti.Si vous pouvez m"aider à ecrire un algo en pascal d'un carré magique d'ordre impair,qui sera affiché pour n=5 par exemple,merci.Si vous ne pouvez pas m'aider tant pis.
Salut.
0
Bonjour,
comment écrire un programme en langage Pascal qui affiche un carré avec les caractéristiques suivantes:
carré d'ordre impaire comprenant n lignes et n colonnes (n est impaire et >3 )tel que : quelque soit i,j a[i,j]=v
v inférieur ou égale à n² et supérieur ou égale à 1.Aucun élément n'est répété plus d'une fois et la somme des éléments de chaque ligne doit être égale à la somme des éléments de chaque colonne (somme de toutes les lignes égales à elles mêmes et à celles des colonnes et des deux diagonales du carré.)par exemple:pour n=5 on a 25 cases et la somme de chaque ligne ou colonne ou diagonale =65
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bonjour,

Ce sujet est récurent sur CCM. Fais une recheche par pertinence, tu trouveras sans doute ce que tu cherches, sinon demande à Google.

Salut.
0
Bonjour,

J'espère que c'est une blague, là. Mais je relève le défi parce ça m'ammuse.
Tu ne précises pas ce qui doit clignoter, la grille, les chiffres ou l'ensemble?

Salut.
0
Bonjour,

Carré Magique 2ème version

Program Magic2 ;

{uses wincrt;}
uses crt;

Var
  Tab : array [1..19,1..19]  of integer;
  d,i,j,n : integer ;
  m ,t,err: integer;
  ok : boolean;
  a:string;
  startX , startY , mrg: integer;

procedure grille(d:integer);
var
  i,j:integer;
  marge:string;
  const hg=201;hd=187;bd=188;bg=200;dt=205;dh=209;db=207;
  const dg=199;st=196;sx=197;dd=182;dv=186;sv=179;bb=32;
begin
  mrg:=(80-(d*4)) div 2;
  marge:='';
  for i:=0 to mrg-4 do
      marge:=marge+' ';
  writeln;
  textbackground(0);
  textcolor(3);
{ligne du haut}
  startX:=whereX; startY:=whereY;
  write(marge,chr(hg),chr(dt),chr(dt),chr(dt));
  for i:=1 to d-1 do
    write(chr(dh),chr(dt),chr(dt),chr(dt));
  writeln(chr(hd));
{lignes intermediaires}
  for j:=1 to d-1 do
   begin
     write(marge,chr(dv),chr(bb),chr(bb),chr(bb));
     for i:=1 to d-1 do
        write(chr(sv),chr(bb),chr(bb),chr(bb));
     writeln(chr(dv));
     write(marge,chr(dg),chr(st),chr(st),chr(st));
     for i:=1 to d-1 do
        write(chr(sx),chr(st),chr(st),chr(st));
     writeln(chr(dd));
  end;
   write(marge,chr(dv),chr(bb),chr(bb),chr(bb));
   for i:=1 to d-1 do
      write(chr(sv),chr(bb),chr(bb),chr(bb));
   writeln(chr(dv));
{ligne du bas}
  write(marge,chr(bg),chr(dt),chr(dt),chr(dt));
  for i:=1 to d-1 do
      write(chr(db),chr(dt),chr(dt),chr(dt));
  writeln(chr(bd));
end;

procedure deplace(x:integer; y:integer; nb:integer;
                  tc:integer; tb:integer);
var
  posX,posY:integer;
begin
  textcolor(tc); textbackground(tb);
  posX:=startX+mrg-1+((x-1)*4);
  posY:=startY+1+((y-1)*2);
  gotoXY(posX-1,PosY); write(nb:3);
  gotoXY(PosX,PosY);
  delay(t);
end;

BEGIN
textcolor(7);textbackground(0);
clrscr;
Writeln('Programme de construction d''un Carr‚ Magique');
writeln;
ok:=false;
repeat
  begin
  gotoXY(1,3); clreol;
  gotoXY(1,3);
  Write('Dimension du Carr‚ : nombre impair entre 3 et 19 -> ');
  readln(a);
  d:=0;
  val(a,d,err);
      if ((d>=3) and (d<=19)) then
      begin
        if ((d mod 2)=1) then ok:=true;
    end;
  end;
until ok ;
writeln;
Writeln('                            Carr‚ Magique ', d,'x',d);
m := d*(d*d+1) div 2;
writeln('                            Nombre Magique = ',m);
writeln;
grille(d);

textcolor(7);textbackground(0);
ok:=false;
repeat
  begin
  gotoXY(1,47); clreol;
  gotoXY(1,47);write('Vitesse de remplissage entre 50 et 300 : ');
  readln(a);
  val(a,t,err);
    if ((t>=50) and (t<=300)) then ok:=true;
  end;
until ok ;
gotoXY(1,47); clreol;
for i:=1 to d do
begin
for j:=1 to d do tab[i,j]:=0;
end;
{position de d‚part}
n:=1;
i:=1 ; j:=d div 2 +1;
tab [i,j]:=n;
deplace(j,i,n,14,0);

While (n<(d*d)) do
  begin
  i:=i-1; j:=j+1;
  {si on sort par le haut et par la droite}
  if ((i=0) and (j>d)) then
   begin
   deplace(j,i,0,4,4);
   deplace(j,i,0,0,0);
   i:=i+2;j:=j-1;
   end;
  {si on sort par le bas }
  if i>d then
  begin
   deplace(j,i,0,4,4);
   deplace(j,i,0,0,0);
   i:=1;
  end;
  {si on sort par le haut }
  if i=0 then
  begin
   deplace(j,i,0,4,4);
   deplace(j,i,0,0,0);
   i:=d;
  end;
  {si on sort par la droite }
  if j>d then
  begin
   deplace(j,i,0,4,4);
   deplace(j,i,0,0,0);
   j:=1;
  end;
  {si on sort par la gauche }
  if j=0 then
  begin
   deplace(j,i,0,4,4);
   deplace(j,i,0,0,0);
   j:=d;
  end;
  if tab[i,j]>0 then
   begin
   deplace(j,i,tab[i,j],14,4);
   deplace(j,i,tab[i,j],14,0);
   i:=i+2;j:=j-1;
   end;
  n:=n+1;
  tab [i,j]:=n;
  deplace(j,i,0,2,2);
  deplace(j,i,n,14,0);
 { write(i, '   ' ,j , '   ' , n);
  readln;  }
  end;
gotoXY(1,47);write('Termin‚');
readln;
END.
{
d‚placement
- une ligne vers le haut, une colonne vers la droite
- si une case est occup‚e, une colonne vers la gauche
  et deux lignes vers le bas
- si on sort par le haut et par la droite : comme case occup‚e
- si on sort du tableau par le haut on entre par le bas
- si on sort du tableau par le bas on entre par le haut
- si on sort du tableau par la droite on entre par la gauche
- si on sort du tableau par la gauche on entre par la droite
}


Salut.
0
PS:
Le carré 19x19 est trop grand et l'affichage est décalé, il faut se limiter à 17x17 et peut-etre moins suivant le mode d'écran.
0
Salut, monsieur Amigo ,

Merci pour le programme . Juste une remarque : pourquoi si je change la position de depart du nombre 1 (Par exemple
3éme colonne et 4eme ligne) le carre affiché est erronné avec des zeros et une diagonale dont la somme est superieure à 65 exemple ce carre ne s'affiche pas malgré le changement de le position de depart.

4 12 25 8 16
11 24 7 20 3
23 6 19 2 15
10 18 1 14 22
17 5 13 21 9

Merci!!
Ps: Je n'ai pas encore testé votre nouveau programme.Je vous enverrai des nouvelles.merci encore pour votre disponibilité.
0
Bonjour,

Le carré magique, ce n'est pas moi qui l'a inventé, loin s"en faut. Je me suis juste contenté d'appliquer la méthode trouvée sur le site http://fr.wikipedia.org/wiki/Carr%C3%A9_magique_(math%C3%A9matiques)

J'ai vu qu'il y existait d'autres algorithmes. Mais celui-là c'était le plus facile à mettre en œuvre.

J'ai remarqué qu'on pouvait aussi construire le carré magique avec une symétrie miroir, au lieu de démarrer au milieu de la première ligne, on démarre au milieu de la dernière ligne, et le déplacement est inversé, un pas vers le bas et un pas vers la gauche ....

Mais de toutes façon, quelle que soit la méthode, on ne peut pas démarrer n'importe où.

Désolé mais j'en sais pas plus. Peut-être le prof de maths saura te répondre.

Salut.
0
Monsieur Amigo,merci quand meme.Vous m'avez montré beaucoup de choses.
Salut!!
0
Salut, carré magique 3eme version (C++)
#include <iostream>
using namespace std;
#define max 3 //Le numéro de ligne et colonne
int t[max][max];
int virifie(int i,int j)
{
for(int k = 1; k < (max*max)+1; k++)
{
if(t[i][j] == k){return 1;}
}
return 0;
}
void vidé()
{
for(int i = 1; i < (max+1); i++)
{
for(int j = 1; j < (max+1); j++)
{
t[i][j] = 0;
}
}
}
void affiche()
{
for(int i = 1; i < (max+1); i++)
{
for(int j = 1; j < (max+1); j++)
{
if(j == max)
{
cout << t[i][j] << endl;
}
else
{
cout << t[i][j] << '\t';
}
}
}
}
void calculer()
{
int l = 0, c = 0,le = 0,ri = 0;

for(int i = 1; i < (max+1); i++)
{
for(int j = 1; j < (max+1); j++)
{
l = l + t[i][j];
c = c + t[j][i];
}
cout << l << " , ";
cout << c << " , ";
c = 0;
l = 0;
}
for(int i = 1, j = 1, r = max, rr = max; i < (max+1); i++, j++, r--, rr--)
{
le = le + t[i][j];
ri = ri + t[i][j];
}
cout << le << " , ";
cout << ri << " , ";


}
void main()
{
vidé();
int i = (max/2)+2, j = (max/2)+1;
for(int k = 1;k < ((max*max)+1); k++)
{
t[i][j] = k;
i++;
j++;
if(i == (max+1)){i = 1;}
if(j == (max+1)){j = 1;}
if(j == 0){j = max;}
int v = virifie(i,j);
if (v == 1)
{
i++;
j--;
}
if(i == (max+1)){i = 1;}
if(j == (max+1)){j = 1;}
if(j == 0){j = max;}
}
affiche();
calculer();


}
0
voici le carre magique avec le nombre 3 6 4
0