Bonjour à tous,
Me voilà de retour...
Sur la base de mon programme en Python qui tourne avec l'exemple
1 2 3 4
2 3 4 1
3 4 1 2
4 1 2 3
et qui me retourne :
1 2 3 4
0 1 2 7
0 0 1 -1
0 0 0 40
j'ai entrepris de continuer à retranscrire la méthode de triangularisation supérieure de ladite matrice de départ, après que vous m'avez aidé à comprendre pourquoi un affichage était correct avec int et incohérent avec float...
Boum ! Nouveau problème...
Voilà 4 heures que je suis dessus.
J'ai identifié le problème, mais n'en trouve pas le remède (c'est bien la première fois que je ne trouve pas le pourquoi).
La phase de "normalisation" fonctionne, mais pas celle d'"Annulation".
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 # include <stdio.h> # include <stdlib.h> int main() { float ts[4][4],coeff,pv; int i,j,k,db; k=0; printf(" Triangularisation de matrices 4 x 4\n\n"); printf(" Elements\n"); /* Saisie des valeurs */ for (j = 0 ; j<4 ; j++) for(i = 0 ; i < 4; i++) { printf("Ligne, %d,colonne, %d : ", j + 1, i + 1); scanf("%f", &(ts[j][i])); } /* Efface l'écran et affiche la matrice entrée */ system("cls"); printf("+------+------+------+------+\n"); for (j = 0 ; j<4 ; j++) { printf("| %.2f | %.2f | %.2f | %.2f |\n", ts[j][0], ts[j][1], ts[j][2], ts[j][3]); printf("+------+------+------+------+\n"); } /* Essai de retouche 1ere et 2e ligne avec db<1 au lieu de db<3 */ for (db = 0 ; db<1 ; db++) { /* Normalisation on ramène à 1 le 1er coeff non nul */ pv=ts[db][db]; for (i=db ; i<4; i++) ts[db][i]=(ts[db][i])/pv; /* On annule le 1er terme non nul de chaque ligne suivante */ for (j=db+1;j<4;j++) coeff=ts[j][db]; /** Si je teste : printf("%d,%d\n",coeff,j,db); Résultat j vaut 4 au lieu de 1 **/ for (i=db;i<4;i++) ts[j][i]=ts[j][i]-coeff*ts[db][i]; } printf("\n\n"); printf("+------+------+------+------+\n"); for (j = 0 ; j<4 ; j++) { printf("| %.2f | %.2f | %.2f | %.2f |\n", ts[j][0], ts[j][1], ts[j][2], ts[j][3]); printf("+------+------+------+------+\n"); } system("pause"); return 0; }
L'un des commentaires :
/** Si je teste : printf("%d,%d\n",coeff,j,db); Résultat j vaut 4 au lieu de 1 **/ identifie le problème.
db valant 0, j devrait prendre successivement 1, 2, 3...
Or après test (et pas en sortie de boucle, donc) j vaut 4...
Je me suis donc dit : il écrase les valeurs successives à l'affichage...
J'ai glissé un compteur pour voir si j prenait ces valeurs : le compteur reste bloqué à 1 : il ne fait qu'un tour, ce qui signifie que j ne passe pas par les valeurs 1,2 et 3...
Et là, je ne saisis pas...
Autre essai.
Peut-être C n'aime-t-il pas les boucles démarrant à db+1 ? J'ai introduit deb = db+1, réécrit ma boucle ainsi : for(j = deb ; deb<4 ,deb++)...
Et bien non, même motif, même punition ! Le problème ne vient pas de là.
Ce n'est peut-être pas un problème d'algo (le même en Python fonctionne) : à la fin le system("pause"); déclenche une erreur. C'est la première fois !
Comme si le programme attendait quelque chose...
Enfin bref, ainsi que vous pouvez le constater, aucune des hypothèses formulées ne s'est révélée exacte.
Il y a surement quelque chose ailleurs, mais quoi ?
Si l'un d'entre vous a la solution, qu'il soit béni lui et ses descendants jusquà la 23e génération : ;-)
Merci d'avance pour tout éclairage.
@+
PS
Je travaille sous Win Xp avec Dev-C++ dernière version
Ps2
3 h après...
C'est le for(j=db... (ou for(j = db+1... le coupable ?!!
Diantre !
Comment faire alors ?
Je ne vais quand même pas rajouter un compteur spécifique ?
Un while + compteur à la place du for ?
Partager