Carré magique

hajerboug -  
 iness ch -
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
Configuration: Windows XP
Firefox 2.0.0.12

12 réponses

  1. amigo
     
    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
    1. hajerboug
       
      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
    2. iness ch
       
      ask je peut utilisé ce prgramme dans un autre tableau magic ??bref ask c'est le méme principe ?? mercii beaucoup
      0
  2. hajerboug
     
    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
  3. amigo
     
    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
    1. hajerboug
       
      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
  4. hajerboug
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. le père
     
    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
  7. amigo
     
    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
  8. amigo
     
    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
  9. amigo
     
    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
  10. hajerboug
     
    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
  11. amigo
     
    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
  12. hajerboug
     
    Monsieur Amigo,merci quand meme.Vous m'avez montré beaucoup de choses.
    Salut!!
    0
    1. 4JB
       
      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
  13. deme
     
    voici le carre magique avec le nombre 3 6 4
    0