MATRICE : OPÉRATIONS ET AFFICHAGE

sazaju Messages postés 48 Date d'inscription lundi 4 août 2008 Statut Membre Dernière intervention 3 juin 2013 - 20 nov. 2012 à 19:15
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 - 22 nov. 2012 à 10:47
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/54746-matrice-operations-et-affichage

cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
22 nov. 2012 à 10:47
@sazaju : je viens de livrer une nouvelle version :
1. J'ai modifié le constructeur comme tu me l'avais proposé
2. En fait, la factorisation était déjà faite avec les méthodes get et set mais je ne les avais pas employées. C'est chose faite maintenant
3. Idem 2
4. J'ai conservé la possibilité de changer le début du comptage mais cet attribut est devenu final. Ainsi, on ne pourra pas le modifier dynamiquement mais, il faudra le modifier dans le code. Ce qui imposera de comprendre le fonctionnement et on ne pourra pas commettre d'erreur. Même si ce n'est pas idéal, c'est un peu mieux.
5. Effectivement, je n'avais pas remarqué ça. C'est fait.
6. Fait en partie
7. Oui, ca marche aussi. Une étape de plus, mais plus simple à écrire donc j'ai modifié.
8. Fait également
9. Je ne comprend pas vraiment ce que tu veux faire avec ce pattern ?
10. Oui, je me suis relu :(

en tout cas merci
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
22 nov. 2012 à 09:07
Merci pour ces conseils qui me semblent vraiment très intéressants. Je ferai une mise à jour dans la journée.
sazaju Messages postés 48 Date d'inscription lundi 4 août 2008 Statut Membre Dernière intervention 3 juin 2013
21 nov. 2012 à 19:18
Autres commentaires :

- pour éviter les accès concurrents inattendus, tu devrais éviter de récupérer le tableau donné en argument à ton constructeur tel quel, plutôt construire un nouveau tableau de ces même valeurs, comme ça un changement dans le tableau ne corromps pas la matrice. Par exemple si je veux créer plusieurs matrices similaires, je vais faire mon tableau, créer une matrice avec, changer quelques valeurs, créer une autre matrice, mais au final j'aurais deux fois la même matrice car la première et la seconde utilisent le même tableau.

- tu devrais factoriser ton calcul d'index "(i-DEBUT_COMPTAGE)*nColonnes+(j-DEBUT_COMPTAGE)" plutôt que de le copier coller partout, ça facilitera la maintenance en cas de modification (optimisation ou que sais-je).

- plutôt que de créer à chaque fois (multiplication, addition, ...) un tableau à la main pour ensuite créer la matrice résultat à la fin, je te suggère de créer la matrice résultat dès le début et d'utiliser les méthodes à ta disposition (res.set(i,j,v)) pour éviter de refaire à chaque fois tous tes calculs (notamment considérer le paramètre DEBUT_COMPTAGE) et simplifier à la fois la lecture du code et sa maintenance. Un constructeur qui crée une matrice vide avec pour argument seulement la taille des deux dimensions serait donc le bienvenu.

- l'idée d'avoir un comptage basé sur 0 ou 1 selon la config est sympa, mais vu que tu ne peux pas savoir si l'utilisateur utilise le bon système de comptage lors de la lecture/écriture des valeurs je pense que ça rajoute juste à la complexité et la difficulté de gestion d'erreurs. Dans ce sens, je pense que tu devrais choisir un seul système de comptage (le plus pertinent pour l'utilisateur, qui je pense est 1) et documenter tes fonctions en conséquences. En particulier, le fait que cette config soit sur une simple variable statique est dangereux : l'utilisation des deux méthodes (pour une raison ou une autre) est génératrice d'erreurs que tu es incapable de voir. Par exemple (1;1) basé sur 0 devient (2;2) basé sur 1, mais dans une matrice ayant suffisamment d'éléments, (1;1) et (2;2) étant deux coordonnées tout à fait légitimes dans les deux systèmes, tu ne verras jamais l'erreur.

- peut-être qu'un contrôle des coordonnées ne serait pas superflux, autrement l'erreur en cas de coordonnées hors limites te donne une erreur sur un tableau à une dimension, ce qui n'est pas cohérent avec la matrice (tu oblige à comprendre la structure interne de ta classe pour comprendre l'erreur). D'autant plus que je peux demander par exemple (3;-1) sans soucis. Si ça peut te paraître être de la flexibilité, ça devient un vrai problème en cas d'erreur de comptage (basé sur 1 ou sur 0) : le comptage basé sur 1 m'oblige à utiliser des coordonnées strictement positives, mais si l'utilisateur te donne (2;0), ton calcul donne un index valide dans le tableau interne alors que si ça se trouve l'utilisateur pense en base 0, et donc erreur impossible à voir.

- tu devrais donner les raisons dans tes exceptions, pas juste dire que quelque chose ne va pas (Le produit des deux matrices est impossible car ...).

- pour le calcul du déterminant, c'est pas plus simple de s'arrêter quand il ne reste plus qu'une matrice 1x1 ? Tu renvois le seul élément du tableau (si je me rappelle bien).

- pour tes variables d'endomorphisme : utilise des variables numérotées (e1, e2, ...) plutôt qu'un ensemble fini de lettres différentes.

- pour ta fonction normaliser(final double valeur), il me semble qu'un double peut-être écrit en notation scientifique (15.3e12), si c'est le cas ta fonction n'est pas exhaustive. Peut-être plus un pattern de ce genre "\\.0+([^0-9]|$)".

- relis-toi, y'a plein de fautes de frappes dans ta doc {'^_^}.
sazaju Messages postés 48 Date d'inscription lundi 4 août 2008 Statut Membre Dernière intervention 3 juin 2013
21 nov. 2012 à 18:33
Je parlais de mettre un constructeur qui prend une matrice "faite main" (tableau 2D), pas de se baser sur un tableau 2D pour la structure interne de ta matrice. Comme ça, si je récupère un tableau 2D à partir d'une fonction quelconque, je peux en faire directement une matrice en le donnant à ta classe, pas besoin de faire un pre-processing du tableau pour pouvoir en faire une matrice. Ce n'est qu'une facilité de plus, ça ne devrait strictement rien changé au reste de la classe.
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
21 nov. 2012 à 09:18
Salut,

Mauvaise idée, je n'utilise jamais de tableau à 2 dimensions. Tout l’intérêt de la source est là.

Dans ce code la matrice est définir par ses dimensions et ses valeurs dans un tableau à 1 dimension. De cette manière, on ne multiplie pas les objets en manipulant la matrice et on économise l'espace mémoire.

Merci quand même pour la suggestion.
sazaju Messages postés 48 Date d'inscription lundi 4 août 2008 Statut Membre Dernière intervention 3 juin 2013
20 nov. 2012 à 19:15
Tu devrais mettre un constructeur qui prend directement un tableau à 2 dimensions.
Rejoignez-nous