Devoir pour université

kurthugo - 12 mars 2024 à 18:09
 indingo - 13 mars 2024 à 00:53

Bonjour,

J'aimerai faire un programme qui ressemblerai à ça:

0	0	0	0	0	0	0	0	0	0	
0	1	2	3	4	5	6	7	8	9	
0	2	4	6	8	10	12	14	16	18	
0	3	6	9	12	15	18	21	24	27	
0	4	8	12	16	20	24	28	32	36	
0	5	10	15	20	25	30	35	40	45	
0	6	12	18	24	30	36	42	48	54	
0	7	14	21	28	35	42	49	56	63	
0	8	16	24	32	40	48	56	64	72	
0	9	18	27	36	45	54	63	72	81	
abscisse ? 3
ordonnee ? 4
La valeur en  3 ,  4  est :  12
0	0	0	0	0	0	0	0	0	0	
0	1	2	3	4	5	6	7	8	9	
0	2	4	6	8	10	12	14	16	18	
0	3	6	9	X	15	18	21	24	27	
0	4	8	12	16	20	24	28	32	36	
0	5	10	15	20	25	30	35	40	45	
0	6	12	18	24	30	36	42	48	54	
0	7	14	21	28	35	42	49	56	63	
0	8	16	24	32	40	48	56	64	72	
0	9	18	27	36	45	54	63	72	81	
continuer (oui/non) ?oui
abscisse ? 5
ordonnee ? 9
La valeur en  5 ,  9  est :  45
0	0	0	0	0	0	0	0	0	0	
0	1	2	3	4	5	6	7	8	9	
0	2	4	6	8	10	12	14	16	18	
0	3	6	9	X	15	18	21	24	27	
0	4	8	12	16	20	24	28	32	36	
0	5	10	15	20	25	30	35	40	X	
0	6	12	18	24	30	36	42	48	54	
0	7	14	21	28	35	42	49	56	63	
0	8	16	24	32	40	48	56	64	72	
0	9	18	27	36	45	54	63	72	81	
continuer (oui/non) ?oui
abscisse ? 3
ordonnee ? 4
La valeur en  3 ,  4  est :  X
0	0	0	0	0	0	0	0	0	0	
0	1	2	3	4	5	6	7	8	9	
0	2	4	6	8	10	12	14	16	18	
0	3	6	9	X	15	18	21	24	27	
0	4	8	12	16	20	24	28	32	36	
0	5	10	15	20	25	30	35	40	X	
0	6	12	18	24	30	36	42	48	54	
0	7	14	21	28	35	42	49	56	63	
0	8	16	24	32	40	48	56	64	72	
0	9	18	27	36	45	54	63	72	81	
continuer (oui/non) ?oui
abscisse ? 8
ordonnee ? 3
La valeur en  8 ,  3  est :  24
0	0	0	0	0	0	0	0	0	0	
0	1	2	3	4	5	6	7	8	9	
0	2	4	6	8	10	12	14	16	18	
0	3	6	9	X	15	18	21	24	27	
0	4	8	12	16	20	24	28	32	36	
0	5	10	15	20	25	30	35	40	X	
0	6	12	18	24	30	36	42	48	54	
0	7	14	21	28	35	42	49	56	63	
0	8	16	X	32	40	48	56	64	72	
0	9	18	27	36	45	54	63	72	81	
continuer (oui/non) ?non
Programme terminé

Avec pour instruction:

1) Créez une fonction appelée afficheGrille qui prend en paramètre une telle grille et qui affiche ensuite le contenu sous forme de tableau à deux dimensions.

2) demandez à l’utilisateur de rentrer une coordonnée x et y , affichez la valeur s’y trouvant, remplacez ensuite la case du tableau correspondant par un X et raffichez le tableau.

3) Modifiez votre programme afin de réitérez tant que l’utilisateur demande à continuer.

Rappel et/ou notions supplémentaires pour résoudre cet exercice

  • la tabulation s’écrit \t et permet « d’aligner » les valeurs affichées par colonne.

Créez une liste contenant 10 éléments. Les éléments de la liste étant composés des multiple successifs de 2 (le premier élément de la liste est 0, le suivant 2, le suivant, 4, etc. et ainsi de suite jusqu’au 10ème élément qui est 18).

Créez une fonction afficher qui prend comme argument une liste et qui affiche les contenus successifs de cette liste séparé par des espaces.

Pour l'instant, j'en suis à là:

def afficheGrille(grille):
    for abscisse in range (len(grille)):
        for ordonnee in range(len(grille[abscisse])):
            print(grille[abscisse][ordonnee], end="\t")
        print() 
    
def calculeCoordonnee(abscisse, ordonnee):
    coordonnee=abscisse*ordonnee
    print("La valeur en", abscisse, "et", ordonnee, "est :",  coordonnee)
    
abscisse = 10
ordonnee = 10
grille=[]

for i in range (ordonnee):
    nouvelle_ligne=[]
    for j in range (abscisse):
        nouvelle_ligne.append (i*j)
    grille.append (nouvelle_ligne)

afficheGrille(grille)

abscisse=int(input("rentrez une valeur pour l'abscisse (entre 0 et 9) :"))
ordonnee=int(input("rentrez une valeur pour l'ordonnée (entre 0 et 9) :"))

calculeCoordonnee(abscisse, ordonnee)

Et ça affiche:

0    0    0    0    0    0    0    0    0    0    
0    1    2    3    4    5    6    7    8    9    
0    2    4    6    8    10    12    14    16    18    
0    3    6    9    12    15    18    21    24    27    
0    4    8    12    16    20    24    28    32    36    
0    5    10    15    20    25    30    35    40    45    
0    6    12    18    24    30    36    42    48    54    
0    7    14    21    28    35    42    49    56    63    
0    8    16    24    32    40    48    56    64    72    
0    9    18    27    36    45    54    63    72    81    
rentrez une valeur pour l'abscisse (entre 0 et 9) :5
rentrez une valeur pour l'ordonnée (entre 0 et 9) :7
La valeur en 5 et 7 est : 35

J'aimerai resté sur cette base là et avancé par rapport à ça, mon enseignant m'a aidé jusque là mais je suis totalement bloqué.

Voilà, si vous pouvez m'aider ce serait vrmt gentil!!


Windows / Chrome 122.0.0.0

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.

0