Algorithme: carré magique

Fermé
Anna - 11 déc. 2016 à 14:30
 Anna - 11 déc. 2016 à 20:41
Bonjour,

J'ai un exercice que je n'arrive pas à comprendre, je connais que veut dire un carré magique mais j'ai pas compris la méthode comment le faire.
SVP, qui peut m'expliquer la méthode de l'exercice suivant:

Dans un tableau carré à N lignes et N colonnes (N impair) ranger les nombres entiers de 1 à N2 de manière à ce que la somme des éléments de chaque ligne soit égale à la somme des éléments de chaque colonne et à la somme des éléments de chaque diagonale.

Le principe exposé ci-après est l’une des méthodes de création d’un carré magique :
•Pour commencer, 1 est placé dans la case centrale de la première ligne ;
•Ensuite, les entiers de 2 à N2 sont placés les uns après les autres dans les cases d’une diagonale orientée nord-ouest.
Plusieurs cas particuliers peuvent se présenter :
- Si on tombe hors du carré en haut, le nombre est placé dans la dernière ligne sans changer de colonne ;
- Si on tombe hors du carré à gauche, le nombre est placé dans la colonne de droite sans changer de ligne ;
- Si on tombe sur une case déjà occupée, le nombre est placé sous la case précédemment remplie. A chaque fois qu’un multiple de N est placé dans une case, la case destinée au nombre suivant est normalement occupée.

3 réponses

SVP, est ce que l'algorithme suivant est correcte :


Procédure carré(n : Entier; Var T: Tableau[1..n,1..n] de Entier)
Var
i, j, L, C : Entier
Début
C <-- (n + 1) Div 2
T[1,C] <-- 1
i<-- 1
L<-- 1
TantQue (i <= n^2) Faire
Si(i Mod n = 0) Alors
L <-- L + 1
Sinon
Si(L = 1) Alors
L <-- n
Sinon
L<-- L – 1
FinSi
Si(C = 1) Alors (* débordement de colonne *)
C <-- n
Sinon
C<-- C – 1
FinSi
FinSi
i <-- i + 1
T[L,C] <-- i
FinTQ
Fin

4
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
Modifié par yg_be le 11/12/2016 à 20:17
Si tu me demandes de lire ton algorithme, je te demande, d'abord, de le rendre plus lisible : ajoute des commentaires, décris, au minimum, à quoi sert chaque variable.
Et indente tes lignes, pour rendre plus lisible tes if, tantque. Plus c'est clair, plus les erreurs sont visibles.
Quelques remarques :
(1) tu ne vérifies pas que n est impair
(2) tu as choisi de ne pas respecter la consigne "Si on tombe sur une case déjà occupée", et, au contraire, de vérifier "Si(i Mod n = 0) Alors", au lieu de vérifier que la cellule de destination est déjà occupée
(3) tu fais "L <-- L + 1" sans vérifier que L n'est pas la dernière ligne du tableau
0

Procédure carré(n : Entier; Var T: Tableau[1..n,1..n] de Entier)
Var
i, j, L, C : Entier
Début
(* mettre 1 dans la case centrale de la 1ère ligne *)
C <-- (n + 1) Div 2
T[1,C] <-- 1
(* remplissage du reste du tableau *)
i<-- 1
L<-- 1
TantQue (i <= n^2) Faire
Si(i Mod n = 0) Alors (* case occupée *)
L <-- L + 1
Sinon
Si(L = 1) Alors (* débordement de ligne *)
L <-- n
Sinon
L<-- L – 1
FinSi
Si(C = 1) Alors (* débordement de colonne *)
C <-- n
Sinon
C<-- C – 1
FinSi
FinSi
i <-- i + 1
T[L,C] <-- i
FinTQ
Fin

0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
11 déc. 2016 à 20:33
Si tu me demandes de lire ton algorithme, je te demande, d'abord, de le rendre plus lisible : décris, au minimum, à quoi sert chaque variable.
Et indente tes lignes, pour rendre plus lisible tes if, tantque. Plus c'est clair, plus les erreurs sont visibles.
Quelques remarques :
(1) tu ne vérifies pas que n est impair
(2) tu as choisi de ne pas respecter la consigne "Si on tombe sur une case déjà occupée", et, au contraire, de vérifier "Si(i Mod n = 0) Alors", au lieu de vérifier que la cellule de destination est déjà occupée
(3) tu fais "L <-- L + 1" sans vérifier que L n'est pas la dernière ligne du tableau
(4) à quoi sert j?
0
OK, merci bien.
0