Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 10 sur 10
  1. #1
    Invité de passage
    Inscrit en
    janvier 2013
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : janvier 2013
    Messages : 12
    Points : 3
    Points
    3

    Par défaut code determinant pivot

    bonsoir ,
    Code :
    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    double **allocTab(int nbr)
    {
        //allocation dynamique avec malloc.
        int i;
        double **tab;
        tab = malloc(nbr * sizeof(double*));
        if(tab == NULL)
            exit(EXIT_FAILURE);
        for(i = 0; i < nbr; i++)
        {
            tab[i] = malloc(nbr * sizeof(double));
            if(tab[i] == NULL)
                exit(EXIT_FAILURE);
        }
        return tab;
    }
    void initab(double **tab, int nbr)
    {
        //initialitation avec la fonction rand();
        int i,j;
        srand(time(NULL));
        for(i=0; i<nbr; i++)
        {
            for(j=0; j<nbr; j++)
                tab[i][j]=rand()%5;
        }
     
    }
    void afficheTAB(double **tab,int nbr)
    {
        //affichage de tableau.
        int i,j;
        for(i=0; i<nbr; i++)
        {
            printf("\n");
            for(j=0; j<nbr; j++)
                printf(" %.2f ",tab[i][j]);
        }
     
    }
    double **change(double **tab,int nbr)
    {
        int i,j,k;
        for(k=0; k<nbr-1; k++)
        {
            for(i=k+1; i<nbr; i++)
            {
                if(i!=k&&tab[i][k]!=0)
                {
                    for(j=0; j<nbr; j++)
                        tab[k][j]=tab[k][j]+tab[i][j];
                        //changement des lignes.
                }
            }
        }
        return tab;
    }
    double calculdet(double **tab,int nbr)
    {
        int i;
        double det=1;
        for(i=0; i<nbr; i++)
        {
            det*=tab[i][i];
        }
        return det;
    }
    double**triangleMatrice(int nbr)
    {
        double **tab;
        int i,j,k;
        double r;
        for(k=0; k<(nbr-1); k++)
        {
            for(i=k+1; i<nbr; i++)
            {
                if(tab[k][k]!=0)//si le pivot diffirent de 0
                {
                    r=-(tab[i][k]/tab[k][k]);
                    for(j=k; j<nbr; j++)
                        tab[i][j]=(tab[i][j]+(r*tab[k][j]));
                }
                else //sinon (pivot =0) on change les lignes puis on transforme la matrice
    //en triangulaire
                    tab=change(tab,nbr);
                tab=triangleMatrice(nbr);
            }
            printf(" le determinant est :%.2f",calculdet(tab,nbr));//on affiche le determinant
        }
        return tab;//retourner le tableau apres les changements
       /*je veux afficher le tableau apres la modification c'est pour ça il est renvoyer !*/
    }
     
    void Liberation(double **tab,int nbr)
    {
        //liberer le tableau apres l'utilisation de malloc
        int i;
        for (i=0 ; i<nbr ; i++)
            free(tab[i]);
        free(tab);
    }
     
    int main()
    {
        double**tab;
        int nbr;
        puts("entrer la dimension de tableau :");
        scanf("%d",&nbr);
        tab=allocTab(nbr);
        initab(tab,nbr);
        afficheTAB(tab,nbr);
        tab=triangleMatrice(nbr);
        afficheTAB(tab,nbr);
        Liberation(tab,nbr);
        return 0;
    }
    Ce code sert a calculer le determinant par methode de pivot de gauss.
    le probleme se situe dans la fonction change et trianglematrice.
    je veux savoir comment les reparer.
    merci pour votre aide !

  2. #2
    Responsable Sécurité

    Avatar de Neckara
    Homme Profil pro Denis
    Étudiant
    Inscrit en
    décembre 2011
    Messages
    4 945
    Détails du profil
    Informations personnelles :
    Nom : Homme Denis
    Âge : 21
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : décembre 2011
    Messages : 4 945
    Points : 14 796
    Points
    14 796

    Par défaut

    Bonjour,

    Pour la fonction change, je pense qu'il faudrait que tu lui passe tab en paramètre.
    Sinon je pense que tu devrais regarder du côté de malloc et de free.

  3. #3
    Invité de passage
    Inscrit en
    janvier 2013
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : janvier 2013
    Messages : 12
    Points : 3
    Points
    3

    Par défaut

    Citation Envoyé par Neckara Voir le message
    Bonjour,

    Pour la fonction change, je pense qu'il faudrait que tu lui passe tab en paramètre.
    Sinon je pense que tu devrais regarder du côté de malloc et de free.
    Oui merci je vais mettre tab en paramètre .
    pour les fonctions d'allocation et d'affichage et aussi libération je l'ai déjà ! ils sont correct mais mon problème était ces fonctions.
    je te remercie encore pour me répondre !

  4. #4
    Invité de passage
    Inscrit en
    janvier 2013
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : janvier 2013
    Messages : 12
    Points : 3
    Points
    3

    Par défaut

    voila le code complet car j'ai toujours un probleme :
    Code :
    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    double **allocTab(int nbr)
    {
        //allocation dynamique avec malloc.
        int i;
        double **tab;
        tab = malloc(nbr * sizeof(double*));
        if(tab == NULL)
            exit(EXIT_FAILURE);
        for(i = 0; i < nbr; i++)
        {
            tab[i] = malloc(nbr * sizeof(double));
            if(tab[i] == NULL)
                exit(EXIT_FAILURE);
        }
        return tab;
    }
    void initab(double **tab, int nbr)
    {
        //initialitation avec la fonction rand();
        int i,j;
        srand(time(NULL));
        for(i=0; i<nbr; i++)
        {
            for(j=0; j<nbr; j++)
                tab[i][j]=rand()%5;
        }
     
    }
    void afficheTAB(double **tab,int nbr)
    {
        //affichage de tableau.
        int i,j;
        for(i=0; i<nbr; i++)
        {
            printf("\n");
            for(j=0; j<nbr; j++)
                printf(" %.2f ",tab[i][j]);
        }
     
    }
    double **change(double **tab,int nbr)
    {
        int i,j,k;
        for(k=0; k<nbr-1; k++)
        {
            for(i=k+1; i<nbr; i++)
            {
                if(i!=k&&tab[i][k]!=0)
                {
                    for(j=0; j<nbr; j++)
                        tab[k][j]=tab[k][j]+tab[i][j];
                        //changement des lignes.
                }
            }
        }
        return tab;
    }
    double calculdet(double **tab,int nbr)
    {
        int i;
        double det;
        for(i=0; i<nbr; i++)
        {
            det*=tab[i][i];
        }
        return det;
    }
    double**triangleMatrice(int nbr)
    {
        double **tab=NULL;
        int i,j,k;
        double r;
        for(k=0; k<nbr-1; k++)
        {
            for(i=k+1; i<nbr; i++)
            {
                if(tab[k][k]!=0)//si le pivot diffirent de 0
                {
                    r=-(tab[i][k]/tab[k][k]);
                    for(j=k; j<nbr; j++)
                        tab[i][j]=(tab[i][j]+(r*tab[k][j]));
                }
                else //sinon (pivot =0) on change les lignes puis on transforme la matrice
    //en triangulaire
                    tab=change(tab,nbr);
                tab=triangleMatrice(nbr);
            }
            printf("%.2f",calculdet(tab,nbr));//on affiche le determinant
        }
        return tab;//retourner le tableau apres les changements
        /*ici je veux que j'affiche les 0 que j'ai ajouté au tableau par la fonction
        trianglematrice(); */
    }
     
    void Liberation(double **tab,int nbr)
    {
        //liberer le tableau apres l'utilisation de malloc
        int i;
        for (i=0 ; i<nbr ; i++)
            free(tab[i]);
        free(tab);
    }
     
    int main()
    {
        double**tab;
        int nbr;
        puts("entrer la dimension de tableau :");
        scanf("%d",&nbr);
        tab=allocTab(nbr);
        initab(tab,nbr);
        afficheTAB(tab,nbr);
        tab=triangleMatrice(nbr);
        afficheTAB(tab,nbr);
        Liberation(tab,nbr);
        return 0;
    }

  5. #5
    Expert Confirmé
    Avatar de fred1599
    Homme Profil pro Fred
    Enseignant
    Inscrit en
    juillet 2006
    Messages
    1 807
    Détails du profil
    Informations personnelles :
    Nom : Homme Fred
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : juillet 2006
    Messages : 1 807
    Points : 2 782
    Points
    2 782

    Par défaut

    tab=change(tab,nbr);

    Pas sûr que cette ligne fonctionne, change cette ligne de façon à ce que tu n'es pas la même variable histoire de vérifier que c'est pas ça qui pose problème.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  6. #6
    Expert Confirmé Sénior

    Homme Profil pro Patrick Gonord
    Enseignant Chercheur
    Inscrit en
    juin 2005
    Messages
    5 664
    Détails du profil
    Informations personnelles :
    Nom : Homme Patrick Gonord
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : juin 2005
    Messages : 5 664
    Points : 13 489
    Points
    13 489

    Par défaut

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    double**triangleMatrice(int nbr)
    {
        double **tab=NULL;
    ...
        for(k=0; k<nbr-1; k++)
        {
            for(i=k+1; i<nbr; i++)
            {
                if(tab[k][k]!=0)//si le pivot diffirent de 0
    tab[k][k] plante si nbr>1 : tab == NULL
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    double calculdet(double **tab,int nbr)
    {
        int i;
        double det;
        for(i=0; i<nbr; i++)
        {
            det*=tab[i][i];
    ...
    det non initialisé

  7. #7
    Invité de passage
    Inscrit en
    janvier 2013
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : janvier 2013
    Messages : 12
    Points : 3
    Points
    3

    Par défaut

    Citation Envoyé par diogene Voir le message
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    double**triangleMatrice(int nbr)
    {
        double **tab=NULL;
    ...
        for(k=0; k<nbr-1; k++)
        {
            for(i=k+1; i<nbr; i++)
            {
                if(tab[k][k]!=0)//si le pivot diffirent de 0
    tab[k][k] plante si nbr>1 : tab == NULL
    pour le 2ème problème je l'ai répare.
    pour le premier j'ai pas compris comment sa plante si nbr>1 ni comment le réparer.
    et je suis vraiment désolé de mon français ( j'arrive pas a exprimer mes problèmes et mes demandes correctement )

  8. #8
    Expert Confirmé Sénior

    Homme Profil pro Patrick Gonord
    Enseignant Chercheur
    Inscrit en
    juin 2005
    Messages
    5 664
    Détails du profil
    Informations personnelles :
    Nom : Homme Patrick Gonord
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : juin 2005
    Messages : 5 664
    Points : 13 489
    Points
    13 489

    Par défaut

    pour le premier j'ai pas compris comment sa plante si nbr>1
    Si nbr >1, alors on va entrer dans les boucles for et faire le test if(). Celui-ci comporte l'accès à tab[k][k] alors que tab vaut NULL -> plantage.

    (D'ailleurs, on s'attend plutôt à ce que tab soit un paramètre de la fonction triangleMatrice())

  9. #9
    Invité de passage
    Inscrit en
    janvier 2013
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : janvier 2013
    Messages : 12
    Points : 3
    Points
    3

    Par défaut

    Merci beaucoup pour vos remarque
    j'essaye de relire mes cours puis réparer ces problèmes

  10. #10
    Invité de passage
    Inscrit en
    janvier 2013
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : janvier 2013
    Messages : 12
    Points : 3
    Points
    3

    Par défaut Déterminant Matrice(pivot de gauss)

    Probleme resolu merci

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •