q,q
q,q
Dernière modification par Invité ; 21/01/2019 à 05h19.
Salut,
Si vous parlez de la fonction "Compter", s'il n'y a pas de "return n", çà ne va pas marcher.
Puis... pas facile de faire la différence entre L, C et l, c...
Essayez de prendre l'habitude de donner des noms plus significatifs genre LIGNES, COLONNES pour les dimensions de votre Grille et i, j pour les indices arguments de Compter: lorsque le code ne fonctionne pas, le rendre plus facile à relire vous permettrait de trouver plus facilement l'erreur.
- W
J'ai modifié les noms pour mieux m'orienter 😀
Merci du conseil, le pire c'est qu'on utilisait des noms de la sorte mais notre professeur nous a fait changer les noms 😭
Pour compter les cellules voisines pour les côtés, comment suis-je censé m'y prendre ?
J'ai pensé à utiliser "While" mais je bloque vraiment...
Merci beaucoup d'avance pour ta réponse et désolé pour les fautes à 6 heures, je suis confronté à ma situation actuelle depuis hier soir et je commençais à fatiguer.
Bonjour
Ben le souci, c'est qu'un nom long comme "colonne" devient vite chiant, mais un nom court comme "c" devient vite ensuite incompréhensible (noyé au milieu de "i", "l", o", etc...)
Généralement un consensus veut que les trucs un peu pérenne (nb de lignes, nb de colonnes, etc) portent un nom court mais significatif (ex "col" ou "nbCol" ou "nb_col" selon tes goûts) et les trucs vraiment volatiles (indices de boucles, valeurs d'un dico surtout) portent un nom très court comme "i" pour "indice", "k" pour "key" et "v" pour "values".
Si tu pars de la cellule aux coordonnées "x, y", suffit de deux boucles imbriquées
- la première avec i variant de x-1 à x+1
- la seconde avec j variant de y-1 à y+1
et tu comptes cellule[i][j] avec un test pour ne pas compter ta propre cellule (donc quand i=x et j=y) et d'autres tests pour ne pas dépasser les bords et voilà.
Oui, ça arrive. Moi je veux visser un meuble. J'ai pensé à utiliser une scie sauteuse mais je bloque vraiment aussi.
On n'utilise pas des outils au hasard. On sait ce qu'on veut faire, on sait comment le faire, on prend ensuite des outils adaptés au travail. while peut le faire mais une boucle "for" sera plus adéquate (for i in range (x-1, x+1+1)). Et connaitre la façon d'utiliser les susdits outils est un plus non négligeable (ex "pourquoi j'écris +1 en final ?")
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
Rebonjour, c'est encore moi !
Voilà, maintenant, un nouveau problème se pose
Spyder m'indique : " local variable cellules is assigned to but never used" à la ligne 41. Le problème dans l'histoire, c'est qu'avant de changer ma variable n en cellules, le programme s’exécutait normalement. De plus, Spyder m'indique peu importe ce que je donne comme nom à la variable n.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 from random import randint nb_col=int(input("Combien voulez-vous de colonnes ?")) nb_lig=int(input("Combien voulez-vous de lignes ?")) def maGrille(nb_lig,nb_col): maGrille=[] for i in range(nb_lig): grille=[] for j in range(nb_col): grille=grille+[randint(0,1)] maGrille=maGrille+[grille] return maGrille maGrille(nb_col,nb_lig) def affiche(grille): cellules=len(grille) for i in range(cellules): print(grille[i]) affiche(maGrille) #Pour les angles : def Compter(grille,lignes,colonnes): if lignes==0 and colonnes==0: cellules=grille[1][0]+grille[1][1]+grille[0][1] if lignes==0 and nb_col-1==colonnes: cellules=grille[0][colonnes-2]+grille[1][colonnes-2]+grille[1][colonnes-1] if lignes==nb_lig-1 and nb_col==0: cellules=grille[nb_lig-2][0]+grille[nb_lig-2][1]+grille[nb_lig-1][1] if lignes==nb_lig-1 and nb_col-1==nb_col: cellules=grille[nb_lig-1][nb_col-2]+grille[nb_lig-2][nb_col-2]+grille[nb_lig-2][nb_col-1]
On part de (i, j).
Pour tester si c'est un "coin", il faut que i ET j soient égaux à deux valeurs bien précises. Pour tester si c'est un "bord", il faut que i soit égal à 0 (ou à COLONNES) - peu importe j... (tant que ce n'est pas une des valeurs qui donnent un "coin").
La difficulté va être d'utiliser "if" suivi d'une cascade de "elif"... mais c'est très formateur
Après on peut sortir de la programmation et penser "algorithme" et le problème se ramène à trouver les index des cases voisines d'une case (i, j) d'un tableau MxN.
Dans le cas général, pour avoir cette liste d'index on peut commencer par faire une double boucle:
Puis traduire "coin" et "bord" en restreignant la plage de valeurs prises par dx et dy. Donc remplacer (-1, 0, 1) par des variables:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 for dx in (-1, 0, 1): for dy in (-1, 0, 1): if dx == 0 and dy == 0: continue print (i + dx, j + dy)
Ce qui fait qu'on n'a plus qu'a assigner (0, 1) à DX_RANGE si i vaut 0, (-1, 0) s'il vaut M ou (-1, 0, 1) sinon. Pareil pour DY_RANGE. Ce qui fait beaucoup moins de conditions à tester.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 for dx in DX_RANGE: for dy in DY_RANGE: if dx == 0 and dy == 0: continue print (i + dx, j + dy)
On peut aussi ajouter un bord au tableau i.e. on plonge le tableau MxN dans un tableau plus grand M+2 x N+2. Les lignes 0 et N+1 et les colonnes 0 et M+1 sont remplies avec des valeurs qui vont bien (ici 0) et on interdit à l'utilisateur d'y accéder.
- W
Merci pour l'aide wiztricksmais je ne sais pas pourquoi Spyder m'indique un message d'erreur pour la variable "cellules" alors qu'avant, c'était la variable n et mon programme s'exécutait correctement
![]()
Partager