Posez votre question Signaler

Carré magique

hajerboug - Dernière réponse le 27 sept. 2010 à 21:00
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
Lire la suite 

Carré magique »

15 réponses
Réponse
+3
moins plus
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
Ajouter un commentaire
Réponse
+3
moins plus
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.
hajerboug - 25 mars 2008 à 16:08
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.
Ajouter un commentaire
Réponse
+0
moins plus
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.
hajerboug - 23 mars 2008 à 22:19
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.
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
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.
Ajouter un commentaire
Réponse
+0
moins plus
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.
Ajouter un commentaire
Réponse
+0
moins plus
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.
Ajouter un commentaire
Réponse
+0
moins plus
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.
Ajouter un commentaire
Réponse
+0
moins plus
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é.
Ajouter un commentaire
Réponse
+0
moins plus
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.
Ajouter un commentaire
Réponse
+0
moins plus
Monsieur Amigo,merci quand meme.Vous m'avez montré beaucoup de choses.
Salut!!
4JB - 5 janv. 2009 à 19:25
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();


}
Ajouter un commentaire
Réponse
+0
moins plus
voici le carre magique avec le nombre 3 6 4
Ajouter un commentaire
Ce document intitulé « carré magique » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Réduire les coûts d'impression dans l'entreprise