Rechercher : dans
Par :

Carré magique

Dernière réponse le 5 jan 2009 à 19:25:23 hajerboug, le 18 mar 2008 à 14:24:15 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « carré magique » dans :
Equivalent de Partition Magic (gratuit) VoirIl existe aujourd'hui plusieurs logiciels gratuits/libres pour partitionner qui équivalent le logiciel payant Partition Magic et constituent une excellente alternative. Voici une sélection des meilleurs logiciels de partitionnement gratuits ou...
Numériser des cassettes magnétiques VoirProblème Comment faire pour enregistrer mes cassettes audio magnétique vers un format audio numérique ? Solution Si l'on possède un lecteur de cassette magnétique avec une sortie audio mini jack, avec le fil mini-jack, ( se trouve dans...
Magic Keys VoirQuand le système se gèle Introduction Pré-requis Avant d'en arriver là Les Magic Keys Introduction Il arrive parfois que le système se gèle et ne réponde plus du tout à aucune sollicitation (clavier/souris), et la seule solution qui...
Télécharger Magentic VoirPouvoir gérer ces fonds d'écran ou encore créez soit même ces écrans de veilles, ne sont plus des tâches réservées aux connaisseurs. Magentic est un programme qui propose la gestion de vos fonds d'écran et aussi des économiseurs d'écran. L'éditeur...
Télécharger Magic ISO VoirMagicISO est un logiciel de création/édition/extraction d'images ISO supportant un grand nombre de format d'images ISO. Il permet de créer des images ISO. Il est également capable de convertir des images ISO vers le format BIN et vice-versa. De...
Télécharger Parted Magic LiveCD VoirParted Magic LiveCD est un programme de partition de disque dur, de CD ou de clé USB. Mais en aucun cas, ce n'est pas un moyen de sauvegarde de CD. Le programme permet d'optimiser approximativement 45 Mo, il utilise le processeur de Gparted et Parted...

1

hajerboug, le 19 mar 2008 à 11:10:48
  • +2

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

Répondre à hajerboug

2

amigo, le 19 mar 2008 à 11:19:05

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.

Répondre à amigo

5

hajerboug, le 23 mar 2008 à 22:19:26

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.

Répondre à hajerboug

3

hajerboug, le 19 mar 2008 à 16:37:21

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

Répondre à hajerboug

4

le père, le 19 mar 2008 à 16:54:00

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.

Répondre à le père

6

amigo, le 24 mar 2008 à 17:14:06
  • +1

Salut,

Tu n'as pas bien cherché.

http://fr.wikipedia.org/wiki/Carr%C3%A9_magique_(math%C3%A9m­atiques)

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.

Répondre à amigo

7

hajerboug, le 25 mar 2008 à 16:08:36

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.

Répondre à hajerboug

8

amigo, le 25 mar 2008 à 16:35:51

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.

Répondre à amigo

9

amigo, le 26 mar 2008 à 00:16:05

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.

Répondre à amigo

10

amigo, le 26 mar 2008 à 00:40:37

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.

Répondre à amigo

11

hajerboug, le 26 mar 2008 à 19:22:28

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é.

Répondre à hajerboug

12

amigo, le 26 mar 2008 à 19:43:53

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.

Répondre à amigo

13

hajerboug, le 26 mar 2008 à 22:24:03

Monsieur Amigo,merci quand meme.Vous m'avez montré beaucoup de choses.
Salut!!

Répondre à hajerboug

14

 4JB, le 5 jan 2009 à 19:25:23

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();


}

Répondre à 4JB