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 : 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
    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
    Expert Confirmé Sénior

    Avatar de Neckara
    Homme Profil pro
    Étudiant
    Inscrit en
    décembre 2011
    Messages
    5 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : décembre 2011
    Messages : 5 468
    Points : 16 213
    Points
    16 213

    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.
    On dit "chiffrer" pas "crypter" !

    On dit "bibliothèque" pas "librairie" !

    Ma page DVP : http://neckara.developpez.com/

  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 : 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
    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
    Enseignant
    Inscrit en
    juillet 2006
    Messages
    1 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : juillet 2006
    Messages : 1 937
    Points : 2 980
    Points
    2 980

    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
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : juin 2005
    Messages : 5 761
    Points : 14 013
    Points
    14 013

    Par défaut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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é
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : juin 2005
    Messages : 5 761
    Points : 14 013
    Points
    14 013

    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())
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  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

Discussions similaires

  1. [Débutant] Code Pivot de Gauss
    Par didier35 dans le forum MATLAB
    Réponses: 1
    Dernier message: 27/03/2014, 22h27
  2. [XL-2007] problème dans un code VBA pour determiner le nombre de valeur
    Par skipeemed dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 26/05/2011, 19h50
  3. De la rapidité du code
    Par jfloviou dans le forum Contribuez
    Réponses: 233
    Dernier message: 29/05/2009, 02h17
  4. Explorateur de code C
    Par Zero dans le forum C
    Réponses: 14
    Dernier message: 06/06/2002, 09h41
  5. OmniORB : code sous Windows et Linux
    Par debug dans le forum CORBA
    Réponses: 2
    Dernier message: 30/04/2002, 17h45

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