- Devoir pour université
- Page de couverture d'un devoir - Guide
- Demande manuscrite adressée à monsieur le directeur de l'université - Forum PDF
- L'enfer du devoir serie streaming vf - Forum Cinéma / Télé
- Lettre de demande d'inscription à l'université word ✓ - Forum Études / Formation High-Tech
- Demande manuscrite ✓ - Forum Études / Formation High-Tech
1 réponse
Bonsoir,
Pour garder tes valeurs alignées, tu peux te servir de la méthode rjust de str.
>>> str.rjust('0', 2) ' 0' >>> str.rjust('10', 2) '10'
Ou utiliser les f-string :
>>> f'{0:>2}' ' 0' >>> f'{10:>2}' '10'
Ce qui pourrait donner comme fonction afficher_grille (une fonction effectuant une action se nomme à l'infinitif, tu pourras le signifier à ton prof =) )
def afficher_grille(grille): sep_nombre = ' ' tableau = [] for ligne in grille: ligne_tableau = [] for valeur in ligne: ligne_tableau.append(str(valeur).rjust(2)) # Ou encore : # ligne_tableau.append(f'{valeur:>2}') tableau.append(ligne_tableau) print('\n'.join(sep_nombre.join(l) for l in tableau))
Que l'on pourrait réduire avantageusement en :
def afficher_grille(grille, sep_nombre=' '): print( '\n'.join( sep_nombre.join(f'{i:>2}' for i in l) for l in grille) )
En 2, on te demande de faire que l'utilisateur entre une coordonnée, le mieux plutôt que demander le x et ensuite le y, de directement demander x, y, en utilisant la virgule comme séparateur de valeurs et en servant de str.split pour transformer la chaine en liste.
>>> '1,2'.split(',') ['1', '2'] >>> ' 1 , 2 '.split(',') [' 1 ', ' 2 '] >>> ' 1 , 2,'.split(',') [' 1 ', ' 2', '']
Il faudrait partant de ce constat, vérifier que la liste est de longueur 2, et vérifier que les valeurs sont des nombres, mais il faudra au préalable supprimer les éventuels espaces saisis par l'utilisateur des deux éléments de la liste.
Cela se fait avec str.strip qui enlève les caractères blancs par défauts.
>>> str.strip(' 1 ') '1'
Donc en l'appliquant sur la liste
[str.strip(valeur) for valeur in ' 1 , 2 '.split(',')]
Ce qui pourrait nous amener à
def demander_coordonnee(x_max, y_max): demande = ( f'Saisissez x, y (x < {x_max})' f' et (y < {y_max}) séparés par une virgule : ' ) # Boucle infinie de façon à redemander la saisie si # valeurs incorrectes while True: saisie = input(demande) valeurs = saisie.split(',') if len(valeurs) == 2: valeurs = [valeur.strip() for valeur in valeurs] x, y = valeurs if x.isdigit() and y.isdigit(): x = int(x) y = int(y) if 0 <= x < x_max and 0 <= y < y_max: return x, y print('Valeurs incorrectes.\n')
Voilà, maintenant il reste à faire la boucle principale.
Déjà un problème, les 0, tu devrais les enlever de la grille, si tu veux vraiment les avoir affichés, c'est dans la fonction d'affichage qu'il faudra le faire, car sinon, ça va poser des problèmes avec les indices.
On se définit trois constantes.
DIM_GRILLE = (len(grille[0]), len(grille)) NOMBRE_VALEURS = DIM_GRILLE[0] * DIM_GRILLE[1] CAR_REMPLACEMENT = 'X'
Que l'on utilisera dans la boucle principale qui ne pourra excéder plus de tours que NOMBRE_VALEURS.
i = 0 afficher_grille(grille) while i < NOMBRE_VALEURS: x, y = demander_coordonnee(DIM_GRILLE[0], DIM_GRILLE[1]) if grille[x][y] != CAR_REMPLACEMENT: grille[x][y] = CAR_REMPLACEMENT i += 1 else: print('Cette position a déjà été traitée') continue print() afficher_grille(grille) if input('Saisissez s pour stopper') in ('s', 'S'): break else: print('\nLa grille a été entièrement traitée')
Rien de bien compliqué ici, tout est pure logique, l'instruction continue sert à passer directement au tour suivant de la boucle, break l'interrompt.
On aurait tout aussi bien pu utiliser une boucle for.
Tu peux déjà tester sur une petite grille comme
grille = [ [1, 2], [3, 4], [5, 6], ]
Voilà, si toutefois tu repasses par ici.