Inscription / Connexion Nouveau Sujet
Niveau Maths sup
Partager :

algorithme carre magique

Posté par
oxo10
23-10-11 à 20:25

bonjour,
alors voilà le problème, je dois écrire un algorithme, plus précisément une procédure Maple pour remplir un carré dont la dimension n est impaire.
je suis pas très bon en informatique mais j'ai un ami qui avait déjà eu à répondre à cette question, qui a bien voulu me donner sa procédure qui est la suivante:

> carre := proc (n) local i, j, k, A; A := matrix(n, n, 0); i := (1/2)*n-1/2; j := (1/2)*n+1/2; for k from 0 to n^2-1 do if irem(i, n) = 0 and irem(j, n) <> 0 then if A[n, irem(j, n)] = 0 then A[n, irem(j, n)] := k+1; i := n+1; j := irem(j, n)+1 else if irem(j, n) <> 1 then A[1, irem(j, n)-1] := k+1; i := 2; j := irem(j, n) else A[1, n] := k+1; i := 2; j := 1 end if end if elif irem(i, n) <> 0 and irem(j, n) = 0 then if A[irem(i, n), n] = 0 then A[irem(i, n), n] := k+1; i := irem(i, n)+1; j := 1 else if irem(i, n)+2 <> n+1 then A[irem(i, n)+1, n-1] := k+1; i := irem(i, n)+2; j := n else A[irem(i, n)+1, n-1] := k+1; i := 1; j := n end if end if elif irem(i, n) = 0 and irem(j, n) = 0 then if A[n, n] = 0 then A[n, n] := k+1; i := 1; j := 1 else A[1, n-1] := k+1; i := n+2; j := n end if else if A[irem(i, n), irem(j, n)] = 0 then A[irem(i, n), irem(j, n)] := k+1; i := irem(i, n)+1; j := irem(j, n)+1 else if irem(j, n) <> 1 then A[irem(i, n)+1, irem(j, n)-1] := k+1; i := irem(i, n)+2; j := irem(j, n) else A[irem(i, n)+1, n] := k+1; i := irem(i, n)+2; j := 1 end if end if end if end do; print(evalm(A)) end proc;

mais voilà il y a un hic car avec cette procédure j'obtiens un carré dont les valeurs "descendent" (voir image): ici le 2 et en bas à droite du 1 alors que moi je voudrais plutôt que le 2 soit en haut à droite du 1,etc...

merci de votre aide

algorithme carre magique

Posté par
pgeod
re : algorithme carre magique 23-10-11 à 21:03

Citation :
pour remplir un carré dont la dimension n est impaire.

??
le remplir de quelle manière ?
tu ne le dis pas.

Posté par
oxo10
re : algorithme carre magique 23-10-11 à 21:28

je cite exactement l'énoncé de l'exercice :
afficher un carré dont la somme des nombres sur chaque ligne, chaque colonne ou chaque diagonale est la même.
et on me donne pour exemple :
pour n=7, le total est 175, avec le tableau identique à celui que j'ai mis dans le message précédent à ceci près que comme je l'expliquais les nombres "montent" alors que dans celui que j'ai obtenu, celui du message précédent donc, les valeurs descendent.

Posté par
caylus
re : algorithme carre magique 23-10-11 à 21:41

Bonsoir,

Donc ceci.
algorithme carre magique

Mais je ne connais pas encore la programmation sous Maple.

Posté par
oxo10
re : algorithme carre magique 23-10-11 à 21:50

tout à fait.
le lien avec celui que j'obtiens est flagrant mais je cherche comment modifier si possible ma procédure maple pour en arriver à ce résultat.
si ça peut aider, on m'a donné un petit speech explicatif même si le tableau en lui-même est bien plus explicite:
on utilisera un tableau carré T[i,j], dans lequel seront rangés les nombres calculés, la dimension doit être impaire; on place la valeur 1 dans la case au dessus du milieu et on incrémente à chaque nouvelle case; pour se déplacer, on avance vers la droite puis vers le haut; si la case est occupée, on avance (à partir de la case occupée) à gauche puis en haut; si on arrive hors des limites du carré, on considère le tableau circulaire dans les deux directions (haut-bas, droite-gauche)

Posté par
caylus
re : algorithme carre magique 23-10-11 à 22:37

Voici la méthode du marquis de Liouville
on place les nombres naturels k de 0 à n²-1 augmentés de 1 dans un tableau de la manière suivante:
si k est un multiple de n, alors
la ligne est diminuée de 2
sinon
la ligne est diminuée de 1 et la colonne augmenté de 1. (modulo n)
fsi
Ce qui donne en Basic:


CONST n = 7
DIM mat(n, n) AS INTEGER
DIM i AS INTEGER, j AS INTEGER, k AS INTEGER
CLS
i = (n - 1) / 2
j = (n + 1) / 2
FOR k = 0 TO n * n - 1
IF k MOD n = 0 THEN
  j = (j + n - 2) MOD n
ELSE
  j = (j + n - 1) MOD n
  i = (i + n + 1) MOD n
END IF
mat(i + 1, j + 1) = k + 1
NEXT k

FOR i = 1 TO n
FOR j = 1 TO n
  PRINT mat(j, i); " ";
NEXT j
PRINT
NEXT i
END

Posté par
oxo10
re : algorithme carre magique 24-10-11 à 15:34

tout d'abord merci Caylus pour l'algorithme.
j'ai essayé de le traduire en langage Maple. il marche, seul problème c'est que j'obtiens pas encore le bon tableau (voir image).
le bon étant celui qu'a posté Caylus. Alors après ai-je fait une erreur dans ma procédure ?

algorithme carre magique

Posté par
oxo10
re : algorithme carre magique 24-10-11 à 15:49

après quelques modifications j'obtiens quelque chose qui se rapproche encore un peu plus de ce que j'attends à ceci près que certaines valeurs sont décalés :

algorithme carre magique

Posté par
caylus
re : algorithme carre magique 24-10-11 à 17:42

Bonjour,

Il y a une erreur dans votre frappe:
j = (j + n - 2) MOD n


Je ne sais pas introduire un programme sous Maple4.
J'ai frappé ceci mais

> carre := proc (n)
>  local i, j, k, A;
>  A := matrix(n, n, 0);
>  i := (n-1)/2;
>  j := (n+1)/2;
>  for k from 0 to n^2-1
>   do
>    if irem(k, n) = 0  then
>     j:= irem(j + n - 2,n)
>    else
>     j:= irem(j + n - 1,n);
>     i:=irem(i+n+1,n);
>    endif;    
>    A[i+1,j+1]:=k+1;
>   enddo;
>  print(evalm(A));
>  endproc
>
> carre(7);
Syntax error, missing operator or `;`

Posté par
caylus
re : algorithme carre magique 24-10-11 à 19:34

Après quelqueS essaiS,

algorithme carre magique

@+

Posté par
oxo10
re : algorithme carre magique 24-10-11 à 20:20

bon ben merci beaucoup.
la procédure marche parfaitement.
A en juger par les "S" vous avez du y passer beaucoup de temps.
Et quant à moi, je m'excuse si j'avais vu plutôt votre post, j'aurais peut être pu vous aider.

encore merci,
bonne soirée,

SUJET CLOS



Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Inscription gratuite

Fiches en rapport

parmi 1675 fiches de maths

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !