IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Traitement de valeurs dans tableau : où est l'erreur


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 105
    Par défaut Traitement de valeurs dans tableau : où est l'erreur
    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).
    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;
    }
    La phase de "normalisation" fonctionne, mais pas celle d'"Annulation".
    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 ?

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Salut

    Je n'ai pas du tout compris ce que tu voulais vraiment faire, mais j'ai repéré quelques incohérences dans cette partie de code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    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];
    Il ne manquerait pas des accolades dans cette partie ?
    C'est normal que 'j' vaut 4 (cf ton commentaire), car il n'y a que la ligne en rouge qui boucle dans le premier 'for'. Donc en sortie de boucle, 'j' vaut 4.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 105
    Par défaut
    Salut,

    Merci !
    Ce matin, en me réveillant, je m'étais dit que le message d'erreur Windows n'était pas anodin, qu'il devait y avoir un problème de blocs...
    Je voulais donc me pencher sur le rôle exact des accolades et de l'indentation en C: je viens de Python, et en Python tout dépend de l'indentation, c'est sur elle que sont déterminés les blocs.
    Et voilà que trouve ta réponse qui va dans le même sens...
    J'ai donc tout repris au niveau de la pause des accolades et ça marche...
    Et plus de message d'erreur de Windows !
    Donc tout va bien.
    C'était vraiment une erreur basique comme vous devez en voir à la pelle.
    Toutes mes excuses ! ;-(

    Alors, encore une fois, merci chef ! T'as eu le bon réflexe du 1er coup...

    @+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Sélection et traitement de valeur dans un tableau
    Par paladice dans le forum jQuery
    Réponses: 2
    Dernier message: 29/04/2013, 14h00
  2. Recherche valeurs dans tableau par Vlookup
    Par fabibou dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 22/08/2007, 11h51
  3. [Tableaux] supression valeur dans tableau
    Par sam01 dans le forum Langage
    Réponses: 3
    Dernier message: 01/04/2006, 21h25
  4. Réponses: 2
    Dernier message: 08/12/2005, 14h41
  5. [vbscript] valeur dans tableau ?
    Par niglo dans le forum ASP
    Réponses: 3
    Dernier message: 08/06/2005, 13h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo