Algorithme: carré magique

Anna -  
 Anna -
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

  1. Anna
     
    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
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      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
    2. Anna
       

      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
    3. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      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
    4. Anna
       
      OK, merci bien.
      0