Précédent   Forum du club des développeurs et IT Pro > C et C++ > C
C Forum d'entraide technique sur le langage C. Avant de poster -> F.A.Q. C, Avant de poster.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 07/01/2013, 03h01   #1
aklim
Invité de passage
 
Inscription : 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 !
aklim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 06h27   #2
Neckara
Rédacteur
 
Avatar de Neckara
 
Homme Denis
Étudiant
Inscription : décembre 2011
Messages : 2 538
Détails du profil
Informations personnelles :
Nom : Homme Denis
Localisation : France, Loire (Rhône Alpes)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2011
Messages : 2 538
Points : 6 808
Points : 6 808
Envoyer un message via MSN à Neckara Envoyer un message via Skype™ à Neckara
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.
__________________
Recherche devs C++ motivés et sérieux pour Last Dungeon.

Chaîne Youtube : Vidéos

Ma page DVP : http://neckara.developpez.com/
Neckara est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 08h45   #3
aklim
Invité de passage
 
Inscription : janvier 2013
Messages : 12
Détails du profil
Informations forums :
Inscription : janvier 2013
Messages : 12
Points : 3
Points : 3
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 !
aklim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 08h48   #4
aklim
Invité de passage
 
Inscription : janvier 2013
Messages : 12
Détails du profil
Informations forums :
Inscription : janvier 2013
Messages : 12
Points : 3
Points : 3
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;
}
aklim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 10h25   #5
fred1599
Membre Expert
 
Avatar de fred1599
 
Homme Fred
Enseignant
Inscription : juillet 2006
Messages : 1 303
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 303
Points : 1 795
Points : 1 795
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)
fred1599 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/01/2013, 11h10   #6
diogene
Responsable Modération
 
Avatar de diogene
 
Homme Patrick Gonord
Enseignant Chercheur
Inscription : juin 2005
Messages : 5 430
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 430
Points : 12 921
Points : 12 921
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é
__________________
Publication : Concepts en C

Mon avatar : Glenn Gould

--------------------------------------------------------------------------
Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
diogene est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/01/2013, 12h11   #7
aklim
Invité de passage
 
Inscription : janvier 2013
Messages : 12
Détails du profil
Informations forums :
Inscription : janvier 2013
Messages : 12
Points : 3
Points : 3
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 )
aklim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 17h14   #8
diogene
Responsable Modération
 
Avatar de diogene
 
Homme Patrick Gonord
Enseignant Chercheur
Inscription : juin 2005
Messages : 5 430
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 430
Points : 12 921
Points : 12 921
Citation:
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 !
diogene est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/01/2013, 19h57   #9
aklim
Invité de passage
 
Inscription : janvier 2013
Messages : 12
Détails du profil
Informations forums :
Inscription : janvier 2013
Messages : 12
Points : 3
Points : 3
Merci beaucoup pour vos remarque
j'essaye de relire mes cours puis réparer ces problèmes
aklim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 15h42   #10
aklim
Invité de passage
 
Inscription : 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
aklim est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 02h54.


 
 
 
 
Partenaires

Hébergement Web