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 :

code determinant pivot


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2013
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Janvier 2013
    Messages : 12
    Points : 7
    Points
    7
    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
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    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
    Futur Membre du Club
    Inscrit en
    Janvier 2013
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Janvier 2013
    Messages : 12
    Points : 7
    Points
    7
    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
    Futur Membre du Club
    Inscrit en
    Janvier 2013
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Janvier 2013
    Messages : 12
    Points : 7
    Points
    7
    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 éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 815
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 815
    Points : 7 104
    Points
    7 104
    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 éminent 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 : 13 926
    Points
    13 926
    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
    Futur Membre du Club
    Inscrit en
    Janvier 2013
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Janvier 2013
    Messages : 12
    Points : 7
    Points
    7
    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 éminent 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 : 13 926
    Points
    13 926
    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
    Futur Membre du Club
    Inscrit en
    Janvier 2013
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Janvier 2013
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Merci beaucoup pour vos remarque
    j'essaye de relire mes cours puis réparer ces problèmes

  10. #10
    Futur Membre du Club
    Inscrit en
    Janvier 2013
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Janvier 2013
    Messages : 12
    Points : 7
    Points
    7
    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