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 :

calcul du rang de correlation


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2009
    Messages : 110
    Par défaut calcul du rang de correlation
    bonjours aujourd'hui lors d'une application j ai du faire une fonction qui calcul le coefficient de correlation d'un nuage de point ma procédure me semble plus que correct seulement lorsque je veux ecrire le vecteur contenant le rang de correlation les valeurs sont toutes les meme voici le code j espère que vous pourriez m aider a eclaircir cette idée. je vous met le code en entier pour ne pas que vous soyer perdu.
    merci d avance

    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
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
     
    #include <stdio.h>
    #include <math.h>
     
    main()
    {
        int i=1,j=0,nbpoint=0,calcul;
        float x[51]={0.},y[51]={0.},xbar=0.,ybar=0.,r=0.,a=0.,b=0.,bprim=0.,aprim=0.,etypex=0.,etypey=0.,
              rangx[51]={0.},rangy[51]={0.},rp = 0.,sommedicar=0.;
        void coefficient(float *,float *,float *,float *,float *,float *,float *,int,float *,float *,float *,float *);
        void rprim(float *,float *,float *,float *,float *,float *,int);
     
        FILE *fdat,*fres;
     
        fdat=fopen("correl2.dat","r");
        fres=fopen("claub040.res","w");
     
        fscanf(fdat,"%1d%2d",&calcul,&nbpoint);
     
        while(calcul !=0 && nbpoint > 0)
        {
            fprintf(fres,"Nuage de point %d\n",i);
            fprintf(fres,"-----------------\n");
            for(j=1;j<=nbpoint;j++)
            {
                fscanf(fdat,"%f%f",&x[j],&y[j]);
            }
            if(calcul != 2)
            {
                fprintf(fres,"\nvecteur x:\n");
                for(j=1;j<=nbpoint;j++)
                {
                    fprintf(fres,"%5.2f  ",x[j]);
                    if(j%10==0)
                    {
                        fprintf(fres,"\n");
                    }
                }
                fprintf(fres,"\nvecteur y:\n");
                for(j=1;j<=nbpoint;j++)
                {
                    fprintf(fres,"%5.2f  ",y[j]);
                    if(j%10==0)
                    {
                        fprintf(fres,"\n");
                    }
                }
                fprintf(fres,"\n");
                coefficient(&r,x,y,&xbar,&ybar,&etypex,&etypey,nbpoint,&a,&aprim,&b,&bprim);
                fprintf(fres,"xbar =%5.2f\n",xbar);
                fprintf(fres,"ybar =%5.2f\n",ybar);
                fprintf(fres,"ecart-type de x :%7.5f\n",etypex);
                fprintf(fres,"ecart-type de y :%7.5f\n",etypey);
                fprintf(fres,"coefficient r =%8.6f\n",r);
                fprintf(fres,"a =%8.5f\n",a);
                fprintf(fres,"aprim =%8.5f\n",aprim);
                fprintf(fres,"b =%8.5f\n",b);
                fprintf(fres,"bprim =%8.5f\n",bprim);
                fprintf(fres,"Dy(x) = %8.5f x + %8.5f\n",a,b);
                fprintf(fres,"Dx(y) = %8.5f x + %8.5f\n\n",aprim,bprim);
            }
            if(calcul !=1)
            {
                rprim(x,y,rangx,rangy,&sommedicar,&rp,nbpoint);
                fprintf(fres,"rang de x :\n");
                for(j=1;j<=nbpoint;j++)
                {
                    fprintf(fres,"%5.2f",rangx[i]);
                    if(j%10 == 0)
                    {
                        fprintf(fres,"\n");
                    }
                }
                fprintf(fres,"\nrang de y:\n");
                for(j=1;j<=nbpoint;j++)
                {
                    fprintf(fres,"%5.2f",rangy[i]);
                    if(j%10==0)
                    {
                        fprintf(fres,"\n");
                    }
                }
            }
            i++;
            fscanf(fdat,"%d%2d",&calcul,&nbpoint);
        }
     
    }
    void coefficient(float *r,float x[],float y[],float *xbar,float *ybar,float *etypex,float *etypey,int nbpoint,float *a,float *aprim,float *b,float *bprim)
    {
        int i=0;
        float sommexy=0.;
        float moyenne(int,float *,float *);
        *xbar = moyenne(nbpoint,x,etypex);
        *ybar = moyenne(nbpoint,y,etypey);
        for(i=1;i<=nbpoint;i++)
        {
            sommexy += x[i]*y[i];
        }
        *r = (sommexy - ((nbpoint*1.)*(*xbar)*(*ybar)))/((nbpoint*1.)*(*etypex)*(*etypey));
        *a = (*r)*( (*etypey)/(*etypex));
        *aprim = (*r) * ((*etypex)/(*etypey));
        *b = (*xbar) - (*a) * (*ybar);
        *bprim = (*xbar) - (*aprim) * (*ybar);
    }
    float moyenne(int nbpoint,float x[],float *etype)
    {
        int i=0;
        float moy =0.,xcar =0.,var =0.;
        for(i=1;i<=nbpoint;i++)
        {
            moy += x[i];
        }
        moy /= nbpoint;
        for(i=1;i<=nbpoint;i++)
        {
            xcar += pow(x[i],2);
        }
        var = (xcar/(nbpoint*1.)) - pow(moy,2);
        *etype = sqrt(var);
        return moy;
    }
    void rprim(float x[],float y[],float rangx[],float rangy[],float *sommedicar,float *rprim,int nbpoint)
    {
        int i=0;
        float inter =0.;
        void calculrang(float *,float *,int);
        calculrang(x,rangx,nbpoint);
        calculrang(y,rangy,nbpoint);
     
        for(i=1;i<=nbpoint;i++)
        {
            inter = x[i]-y[i];
            *sommedicar += pow(inter,2);
        }
        *rprim = 1 - ((6*(*sommedicar))/(nbpoint * (pow(nbpoint,2) -1)));
    }
    void calculrang(float x[],float rang[],int nbpoint)
    {
        int i=0,j=0;
        for(i=1;i<=nbpoint;i++)
        {
            rang[i]=1;
        }
        for(i=1;i<=nbpoint;i++)
        {
            for(j=1;j<=nbpoint;j++)
            {
                if(x[i]>x[j])
                {
                    rang[i]=rang[i]+1;
                }
                if(x[i]==x[j])
                {
                    rang[i]=rang[i]+0.5;
                }
            }
            rang[i] -= 0.5;
        }
    }

  2. #2
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Tout dabord, voici les quelque remarque sur ton code :

    Cela est faux :
    Preferer ceci dans ton cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int main ()
    {
        ...
        return EXIT_SUCCESS;
    }




    Ensuite
    j ai du faire une fonction qui calcul le coefficient de correlation d'un nuage de point
    Ce que tu as fait n'est pas mondialement connu et tu n'as mis aucun commentaire dans le code. Je suis completement paumé.





    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int main()
    {
        ...
        void coefficient(float *,float *,float *,float *,float *,float *,float *,int,float *,float *,float *,float *);
        void rprim(float *,float *,float *,float *,float *,float *,int);
        ...
    }
    Les prototype sont generalement mis avant le main. Cela permet d'alleger le main et de mieux decoupé le deroulement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void coefficient(float *,float *,float *,float *,float *,float *,float *,int,float *,float *,float *,float *);
    void rprim(float *,float *,float *,float *,float *,float *,int);
     
     
    int main()
    {
        ...
    }




    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int main()
    {
        ...
        FILE *fdat,*fres;
     
        fdat=fopen("correl2.dat","r");
        fres=fopen("claub040.res","w");
        ...
    }
    Il faut verifier que le fichier est bien ouvert. S'il y a un probleme dès cette ligne, tout le reste sera faux.

    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
     
    int main()
    {
        ...
        FILE *fdat=fopen("correl2.dat","r");
        if (fdat == NULL)
        {
            printf("erreur lors du chargement de correl2.dat");
            exit(EXIT_FAILURE);
        }
     
        FILE *fres=fopen("claub040.res","w");
        if (fres== NULL)
        {
            printf("erreur lors du chargement de claub040.res");
            exit(EXIT_FAILURE);
        }
        ...
    }
    Cela est plus "propre" et plus securisé.





    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            for(j=1;j<=nbpoint;j++)
            {
                fscanf(fdat,"%f%f",&x[j],&y[j]);
            }
    Cela ne serai t'il pas plutot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            for(j=1;j<=nbpoint;j++)
                fscanf(fdat,"%f%f",x[j],y[j]);
    ?





    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        ...
        float x[51]={0.},y[51]={0.}, ...
        ...
        fscanf(fdat,"%1d%2d",&calcul,&nbpoint);
        ...
            for(j=1;j<=nbpoint;j++)
                fscanf(fdat,"%f%f",x[j],y[j]);
        ...
    ATTENTION !

    C'est hyper dangereux !
    Tes tableau x et y sont definie comme etant des tableaux comportant 51, l'indice de ces case allant de 0 a 50 !
    nbpoint est une valeur extraite d'un fichier, elle peut donc valoir n'importe quoi !
    De plus, dans la boucle for, tu commence a j=1, donc la premiere case ne sera jamais utilisé.



    Corrige deja tout ce que j'ai dit ci dessus, commente un minimum, et si il y a encore un probleme, reposte en mettant de nouveau ton code et tes fichiers que l'on puisse mieux t'aider.


    EDIT :

    chaque fopen doit avoir un fclose associé. Il faut fermer les fichiers lorsque tu n'en a plus besoins.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    fclose(fdat);
    fclose(fres);
    avant le return du main

  3. #3
    Expert confirmé
    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
    Par défaut
    Citation Envoyé par SofEvans Voir le message
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            for(j=1;j<=nbpoint;j++)
            {
                fscanf(fdat,"%f%f",&x[j],&y[j]);
            }
    Cela ne serai t'il pas plutot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            for(j=1;j<=nbpoint;j++)
                fscanf(fdat,"%f%f",x[j],y[j]);
    ?
    Non, la présence des & est correcte. Une alternative (équivalente) serait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fscanf(fdat,"%f%f",x+j,y+j);

  4. #4
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Merci diogene, j'avais un petit doute.

    Cela est la meme chose pour scanf, non ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2009
    Messages : 110
    Par défaut
    en ce qui concerne la synthaxe du code je n ai fait que respecter les consignes que l ont m a apprit au cours de langage C.pour les vecteur en C je préfère travailler a partir de l indice 1 donc je prevois un espace supplementaire d ou le 51 de toute facon a l heure actuelle comme on nous apprend en cours la memoire utilisée n a pas plus vraiment d impact. pour le main je sais pas si c est parce que c est sous linux mais je n ai jamais vu ou appris et encore moin le . toutefois j essayerai de tenir compte de vos remarque enfin pour le calcul du rang je recherche dans un vecteur si il y a un meme nombre si oui alors j incremente de 0.5 sinon de 1 seulement toute les valeurs du vecteur rang[] sont égale a deux.

  6. #6
    Expert confirmé
    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
    Par défaut
    SofEvans :
    Cela est la meme chose pour scanf, non ?
    Oui, bien sûr.


    kazuzu :
    je préfère travailler a partir de l indice 1 donc je prevois un espace supplementaire d ou le 51 de toute facon a l heure actuelle comme on nous apprend en cours la memoire utilisée n a pas plus vraiment d impact
    Je sais qu'on est dans une société de gaspillage, mais ce n'est pas une raison pour coder de cette façon. Tes préférences n'ont que peu d'importances en la question : celui qui lira ton code et voudra travailler dessus cherchera la raison des bornes de ces indices et se posera la question de savoir si c'est une erreur ou une particularité de l'algorithme avant de laborieusement conclure à un caprice du programmeur.

    pour le main je sais pas si c est parce que c est sous linux mais je n ai jamais vu ou appris
    Ce n'est pas une question de linux ou d'un autre système d'exploitation. C'est plutôt une écriture archaïque : main renvoie un int. C'est la norme. Si une fonction n'avait pas de type de retour spécifié, alors elle était supposée renvoyer un int par défaut. Ce comportement par défaut n'est plus accepté par la norme. Et on doit donc maintenant (depuis 10 ans, ce n'est pas récent) écrire : int main() ou mieux int main(void).
    et encore moin le
    Puisque main() doit renvoyer un int, il est de bon ton de le faire (mais pas obligatoire : dans le cas de main(), en l'absence de return, un return implicite de 0 sera fait) . Trois valeurs standard de retour sont prévues par la norme : 0, EXIT_FAILURE et EXIT_SUCCESS (les deux derniers étant définis dans <stdlib.h>)

  7. #7
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Après 3 heure passé dessus, a simplifier et a mettre tout en forme, a faire en sorte de faire un code propre, a m'acharner sur la fonction, je viens enfin de trouver.

    Et la, j'ai envie de dire ... NOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON !!!

    Plus l'erreur est bete, plus il est difficile de la detecter, surtout si on est persuader qu'elle se trouve a un endroit (alors qu'elle ne l'ai pas).

    Bon, ou etait donc cette erreur ?

    Ici :

    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
    main()
    {
        int i=1
     
        while(calcul !=0 && nbpoint > 0)
        {
            fprintf(fres,"Nuage de point %d\n",i);
    
            if(calcul !=1)
            {
                fprintf(fres,"rang de x :\n");
                for(j=1;j<=nbpoint;j++)
                {
                    fprintf(fres,"%5.2f",rangx[i]);
                    if(j%10 == 0)
                    {
                        fprintf(fres,"\n");
                    }
                }
            }
            i++;
            fscanf(fdat,"%d%2d",&calcul,&nbpoint);
        }
     
    }
    Et oui ! J'ai tellement l'habitude de prendre 'i' pour un indice de parcours de tableau.
    En realité, 'i' sert ici a avoir le numero du nuage de point traité ...
    D'ou la confusion lors de la lecture ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
                for(j=1;j<=nbpoint;j++)
                {
                    fprintf(fres,"%5.2f",rangx[i]);
                    if(j%10 == 0)
                    {
                        fprintf(fres,"\n");
                    }
                }


    Donc en conclusion, prenez la peine d'ecrire 4~5 caractere pour vos variables ... ca evitera les prise de tete et ca ne pourra que vous aider.

    Voici donc le code après :



    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
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
     
    float Coefficient(int nbpoint, float x[], float y[]);
    float Moyenne(int nbpoint,float Tableau[]);
    float EcartType (int nbpoint,float Tableau[]);
     
    float SommeDesCarre(float x[], float y[], int nbpoint);
    void calculrang(float x[],float rang[],int nbpoint);
     
    int main()
    {
        /* Servira juste d'indice dans les boucle for */
        int i;
     
        /* Indique le numero du nuage de point sur lequel on travail */
        int numeroNuage = 0;
     
        /* Nombre de point que contient un nuage, valeur extrait du fichier dat */
        int nbpoint;
     
        /* Ce sont des booleens extrait du fichier dat */
        int calculerR, calculerRang;
     
     
        float x[50]={0},y[50]={0};
     
     
        FILE *fdat=fopen("correl2.dat","r");
        if (fdat == NULL)
        {
            printf("erreur lors du chargement de correl2.dat");
            exit(EXIT_FAILURE);
        }
     
        FILE *fres=fopen("claub040.res","w");
        if (fres== NULL)
        {
            printf("erreur lors du chargement de claub040.res");
            exit(EXIT_FAILURE);
        }
     
     
     
     
        fscanf(fdat,"%1d%1d %1d",&calculerR, &calculerRang, &nbpoint);
     
        while(0 < nbpoint)
        {
            /* On recupere le nuage de point */
            for(i=0 ; i<nbpoint ; i++)
                fscanf(fdat,"%f %f",&x[i],&y[i]);
     
            fprintf(fres,"Nuage de point %d\n",numeroNuage+1);
            fprintf(fres,"-----------------\n");
     
     
     
            /* Calcul du coefficient de correlation r */
            if(calculerR)
            {
                /* Calcul de tout ce qui caracterise le nuage de point pour
                   le coefficient de correlation r */
     
                //calcul des moyennes
                float xbar = Moyenne(nbpoint,x);
                float ybar = Moyenne(nbpoint,y);
     
                // Calcul des ecart-type
                float etypex = EcartType (nbpoint,x);
                float etypey = EcartType (nbpoint,y);
     
                // Calcul du coefficient r
                float r = Coefficient(nbpoint, x, y);
     
                // calcul divers
                float a = r * etypey / etypex;
                float aprim = r * etypex / etypey;
                float b = xbar - a * ybar;
                float bprim = xbar - aprim * ybar;
     
                /* Ecriture dans les fichiers des resultats */
                fprintf(fres,"\nvecteur x:\n");
                for(i=0 ; i<nbpoint ; i++)
                    fprintf(fres,"%.2f  \n",x[i]);
     
                fprintf(fres,"\nvecteur y:\n");
                for(i=0 ; i<nbpoint ; i++)
                    fprintf(fres,"%.2f  \n",y[i]);
     
                fprintf(fres,"xbar = %.2f\n",xbar);
                fprintf(fres,"ybar = %.2f\n",ybar);
                fprintf(fres,"\n");
                fprintf(fres,"ecart-type de x = %.5f\n",etypex);
                fprintf(fres,"ecart-type de y = %.5f\n",etypey);
                fprintf(fres,"\n");
                fprintf(fres,"coefficient r = %.6f\n",r);
                fprintf(fres,"\n");
                fprintf(fres,"a = %.5f\n",a);
                fprintf(fres,"aprim = %.5f\n",aprim);
                fprintf(fres,"\n");
                fprintf(fres,"b = %.5f\n",b);
                fprintf(fres,"bprim = %.5f\n",bprim);
                fprintf(fres,"\n");
                fprintf(fres,"Dy(x) = %.5f x + %.5f\n",a,b);
                fprintf(fres,"Dx(y) = %.5f x + %.5f\n\n",aprim,bprim);
            }
     
            /* Calcul du coefficient de correlation des rangs */
            if(calculerRang)
            {
                float rangx[50], rangy[50], rprim, sommedicar;
     
                calculrang(x,rangx,nbpoint);
                calculrang(y,rangy,nbpoint);
     
                sommedicar = SommeDesCarre(x, y, nbpoint);
     
                rprim = 1 - (6 * sommedicar)/(nbpoint * (nbpoint*nbpoint -1));
     
                fprintf(fres,"\nrang de x :\n");
                for(i=0 ; i<nbpoint ; i++)
                    fprintf(fres,"%.2f \n",rangx[i]);
     
                fprintf(fres,"\nrang de y :\n");
                for(i=0 ; i<nbpoint ; i++)
                    fprintf(fres,"%.2f \n",rangy[i]);
     
            }
     
            numeroNuage++;
            fscanf(fdat,"%1d%1d %1d",&calculerR, &calculerRang, &nbpoint);
        }
     
        fclose(fdat);
        fclose(fres);
     
        return EXIT_SUCCESS;
    }
     
     
    float Coefficient(int nbpoint, float x[], float y[])
    {
        float xbar = Moyenne(nbpoint,x);
        float ybar = Moyenne(nbpoint,y);
        float etypex = EcartType (nbpoint,x);
        float etypey = EcartType (nbpoint,y);
     
        float sommexy=0;
     
        int i;
        for(i=0 ; i<nbpoint ; i++)
            sommexy += x[i] * y[i];//somme vecteur x multiplier avec vecteur y
     
        return (sommexy - nbpoint * xbar * ybar)/(nbpoint * etypex * etypey);//coefficient r
    }
     
    float Moyenne(int nbpoint,float Tableau[])
    {
        float moyenne =0;
     
        int i;
        for(i=0 ; i<nbpoint ; i++)
            moyenne += Tableau[i];//somme vecteur
     
        return (moyenne /= nbpoint);
    }
     
    float EcartType (int nbpoint,float Tableau[])
    {
        float moyenne = Moyenne(nbpoint, Tableau);
     
        float var = 0;
     
        int i;
        for(i=0 ; i<nbpoint ; i++)
            var += (Tableau[i] * Tableau[i]);//somme vecteur x au carre
     
        return sqrt( var/nbpoint - moyenne*moyenne );//calcul variance
    }
     
     
     
     
     
    float SommeDesCarre(float x[], float y[], int nbpoint)
    {
        float sommedicar = 0;
        int i;
        for(i=0 ; i<nbpoint ; i++)
            sommedicar += ((x[i]-y[i])*(x[i]-y[i]));
     
        return sommedicar;
    }
     
    void calculrang(float Tableau[],float rang[],int nbpoint)
    {
        int i,j;
     
        /* Initialisation de rang */
        for(i=0 ; i<nbpoint ; i++)
            rang[i]=1;
     
        for(i=0 ; i<nbpoint ; i++)
            for (j=0 ; j<nbpoint ; j++)
                if (i != j)
                    if (Tableau[i] < Tableau[j])
                        rang[i]++;
                    else
                        if (Tableau[i] == Tableau[j])
                            rang[i] += 0.5;
     
    }
    Voici un echantillon du fichier texte d'entré :

    10 6
    260.00 176.00
    267.00 174.00
    288.00 182.00
    301.00 193.00
    320.00 207.00
    334.00 232.00
    11 6
    2.00 3.00
    4.00 7.00
    6.00 11.00
    8.00 15.00
    10.00 19.00
    12.00 23.00
    00 0
    Donc voila.

    Juste aussi, il faudrait verifier les entré du fichier texte 'dat'.

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

Discussions similaires

  1. [XL-2007] calculer un rang avec une condition
    Par pepsister dans le forum Excel
    Réponses: 1
    Dernier message: 16/06/2010, 09h24
  2. Calculer avec RANG
    Par Sylcoco dans le forum Excel
    Réponses: 2
    Dernier message: 16/03/2010, 15h19
  3. [AC-2003] calcul du rang d'un étudiant dans sa classe
    Par dark_geek dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 09/05/2009, 18h52
  4. Calculer le range de Ix
    Par laziolb dans le forum OpenCV
    Réponses: 3
    Dernier message: 27/05/2008, 16h20
  5. Réponses: 6
    Dernier message: 25/09/2007, 15h29

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