Programme carre_magique.py


# -*- coding: iso-8859-15 -*-

class CarreMagique :
    
    def __init__ (self, nb) :
        """on place la matrice nb (liste de listes) 
        dans la classe accessible par le mot-clé self"""
        self.nb = nb
        
    # réponse à la question 2
    def __str__ (self) :
        """méthode appelée lorsque on cherche à afficher 
        un carré magique avec l'instruction print"""
        s = ""
        for i in range (0, len (self.nb)) :
            for j in range (0, len (self.nb)) : s += str ( self.nb [i][j]) + " "
            s += "\n" # pour passer à la ligne
        # réponse à la question 4
        s += "somme " + str (self.somme_ligne (0))
        return s
        
    # réponse à la question 3
    def somme_ligne (self, i) :
        s = 0
        for j in range (0, len (self.nb)) : s += self.nb [i][j]
        return s
        
    # réponse à la question 5
    def somme_colonne (self, j) :
        s = 0
        for i in range (0, len (self.nb)) : s += self.nb [i][j]
        return s
        
    # réponse à la question 6
    def est_magique (self) :
        # on stocke toutes les sommes
        l = []
        for i in range (0, len (self.nb)) : l.append ( self.somme_ligne (i) )
        for j in range (0, len (self.nb)) : l.append ( self.somme_colonne (j) )
            
        # réponse à la question 7
        l.append ( self.somme_diagonale (0)) 
        l.append ( self.somme_diagonale (1))

        # on trie la liste
        l.sort ()
        
        # on compare le plus petit et le plus grand, s'il sont égaux, 
        # le carré est magique
        return l [0] == l [ len(l)-1 ]
        
    # réponse à la question 7
    def somme_diagonale (self, d) :
        """d vaut 0 ou 1, première ou seconde diagonale"""
        s = 0
        if d == 0 :
            for i in range (0, len (self.nb)) : s += self.nb [i][i]
        else :
            for i in range (0, len (self.nb)) : 
                s += self.nb [i][len(self.nb)-i-1]
        return s
        
    # réponse à la question 8
    def nombre_differents (self) :
        """retourne True si tous les nombres sont différents,
        on place les nombres un par un dans un dictionnaire,
        dès que l'un d'eux s'y trouve déjà,
        on sait que deux nombres sont identiques, le résultat est False"""
        k = { }
        for i in range (0, len (self.nb)) :
            for j in range (0, len (self.nb)) :
                c = self.nb [i][j]
                if c in k : return False     # pas besoin d'aller plus loin
                                             # il y a deux nombres identiques
                else : k [c] = 0
        return True
        
        
m = [ [9, 3, 7],  [ 4,5,6] , [1,8,2] ]
cm = CarreMagique (m)           # réponse à la question 1
print cm                        # affiche 15
print cm.est_magique ()         # affiche False
print cm.nombre_differents ()   # affiche True

m = [ [9, 9, 9],  [9, 9, 9], [9, 9, 9] ]
cm = CarreMagique (m)
print cm                        # affiche 15
print cm.est_magique ()         # affiche True
print cm.nombre_differents ()   # affiche False

créé avec py2html version:0.62